This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Mcbsp+EDMA方式下,DMA pingPong变长一倍,DMA中断怎么保持原来的周期

本人小白一枚,基本上不懂驱动程序怎么写的,主要是做应用层的软件

最近碰到一个问题,就是

1、 听以前驱动工程师讲起来过,说系统是一个DMA每 6ms来一个中断,每个DMA pingPong全局变量包括1536 U32的数据,然后通过Mcbsp 发送给另一个芯片。

然后Mcbsp的时钟是16.384M(由外部芯片提供)        

2、现在数据量按照实际项目,需要发送的数据量要变多一倍,

那么DMA的乒乓数组的长度应该要变长一倍,也就是DMA还是6ms来一个中断,但是6ms包含了1536*2=3072个U32的数据,

然后Mcbsp的时钟也变成了32.768M(由外部芯片提供)  。            

                          那本人  (1)把DMA的pingPong数组的宏定义改大了一倍,原来是1536,改成了3072  (2)让外部芯片配置Mcbsp时钟,改成了32.768M

                                       但是结果却是DMA中断是12ms 来一个。       目的是发送的数据量变多一倍,但要保证DMA保持 6ms来一个中断。

求各位专业人士帮一下小白我,怎么改驱动程序。下面是原来程序的示意(寄存器的字段填写值),

我的猜测是把  XFRLEN1 = MCBSP_XCR_XFRLEN1_DEFAULT这句话,改成 XFRLEN1= MCBSP_XCR_XFRLEN1_OF(1)),

让Mcbsp一帧发送2个words(一个word我看好像配置为32bit),这样每一帧发送2*32=64bit??        这个全是我的猜测,求大家帮忙。

#define MCBSP_RCR_RFRLEN1_DEFAULT 0x00000000u
#define MCBSP_RCR_RFRLEN1_OF(x) _VALUEOF(x)

MCBSP_XCR_XFRLEN1_OF(0), /* Transmit frame length in phase 1(XFRLEN1)
000 0000b: 1 word per phase
000 0001b: 2 words per phase
. . . . . . . . . . . .
111 1111b: 128 words per phase

以下是代码示意(相关寄存器的值)

edmaTxCfg.opt
PRI设为EDMA_OPT_PRI_HIGH) |
ESIZE设为EDMA_OPT_ESIZE_32BIT) |
2DS设为EDMA_OPT_2DS_NO) |
SUM设为EDMA_OPT_SUM_INC) |
2DD设为EDMA_OPT_2DD_NO) |
DUM设为EDMA_OPT_DUM_NONE) |
TCINT设为EDMA_OPT_TCINT_YES) |
LINK设为EDMA_OPT_LINK_YES) |
FS设为EDMA_OPT_FS_NO);

mcbspCfg.pcr
XIOEN 设为 MCBSP_PCR_XIOEN_SP) |
FSXM 设为 MCBSP_PCR_FSXM_EXTERNAL) |
CLKXM 设为 MCBSP_PCR_CLKXM_INPUT) |
CLKSSTAT 设为 MCBSP_PCR_CLKSSTAT_0) |
DXSTAT 设为 MCBSP_PCR_DXSTAT_0) |
FSXP 设为 MCBSP_PCR_FSXP_ACTIVEHIGH) |
CLKXP 设为 MCBSP_PCR_CLKXP_RISING);

mcbspCfg.xcr
XPHASE 设为 MCBSP_XCR_XPHASE_SINGLE) |
XCOMPAND 设为 MCBSP_XCR_XCOMPAND_MSB) |
XFIG 设为 MCBSP_XCR_XFIG_NO) |
XDATDLY 设为 MCBSP_XCR_XDATDLY_1BIT) |
XFRLEN1 设为 MCBSP_XCR_XFRLEN1_DEFAULT) |    ////////////////////////////猜测是这一行话有问题
XWDLEN1 设为 MCBSP_XCR_XWDLEN1_32BIT) |
XWDREVRS 设为 MCBSP_XCR_XWDREVRS_DISABLE);

mcbspCfg.spcr |=
FREE 设为 MCBSP_SPCR_FREE_NO) |
SOFT 设为 MCBSP_SPCR_SOFT_YES) |
FRST 设为 MCBSP_SPCR_FRST_YES) |
GRST 设为 MCBSP_SPCR_GRST_NO) |
XINTM 设为 MCBSP_SPCR_XINTM_XRDY) |
XSYNCERR 设为 MCBSP_SPCR_XSYNCERR_NO) |
DLB 设为 MCBSP_SPCR_DLB_OFF) |
CLKSTP 设为 MCBSP_SPCR_CLKSTP_DISABLE) |
DXENA 设为 MCBSP_SPCR_DXENA_OFF);

MCBSP_config(hMcbsp, &mcbspCfg);

edmaTxCfg.cnt = MCBSP2_TX_LEN;/////////////////这个长度我已经改大了一倍,原来是1536,现在宏定义是3072

  • 本人小白一枚,基本上不懂驱动程序怎么写的,主要是做应用层的软件

    最近碰到一个问题,就是

    1、 听以前驱动工程师讲起来过,说系统是一个DMA每 6ms来一个中断,每个DMA pingPong全局变量包括1536 U32的数据,然后通过Mcbsp 发送给另一个芯片。

    然后Mcbsp的时钟是16.384M(由外部芯片提供)

    2、现在数据量按照实际项目,需要发送的数据量要变多一倍,

    那么DMA的乒乓数组的长度应该要变长一倍,也就是DMA还是6ms来一个中断,但是6ms包含了1536*2=3072个U32的数据,

    然后Mcbsp的时钟也变成了32.768M(由外部芯片提供) 。

    那本人 (1)把DMA的pingPong数组的宏定义改大了一倍,原来是1536,改成了3072 (2)让外部芯片配置Mcbsp时钟,改成了32.768M

    但是结果却是DMA中断是12ms 来一个。 目的是发送的数据量变多一倍,但要保证DMA保持 6ms来一个中断。

    求各位专业人士帮一下小白我,怎么改驱动程序。下面是原来程序的示意(寄存器的字段填写值),

    我的猜测是把 XFRLEN1 = MCBSP_XCR_XFRLEN1_DEFAULT这句话,改成 XFRLEN1= MCBSP_XCR_XFRLEN1_OF(1)),

    让Mcbsp一帧发送2个words(一个word我看好像配置为32bit),这样每一帧发送2*32=64bit?? 这个全是我的猜测,求大家帮忙。

    #define MCBSP_RCR_RFRLEN1_DEFAULT 0x00000000u
    #define MCBSP_RCR_RFRLEN1_OF(x) _VALUEOF(x)

    MCBSP_XCR_XFRLEN1_OF(0), /* Transmit frame length in phase 1(XFRLEN1)
    000 0000b: 1 word per phase
    000 0001b: 2 words per phase
    . . . . . . . . . . . .
    111 1111b: 128 words per phase

    以下是代码示意(相关寄存器的值)

    edmaTxCfg.opt
    PRI设为EDMA_OPT_PRI_HIGH) |
    ESIZE设为EDMA_OPT_ESIZE_32BIT) |
    2DS设为EDMA_OPT_2DS_NO) |
    SUM设为EDMA_OPT_SUM_INC) |
    2DD设为EDMA_OPT_2DD_NO) |
    DUM设为EDMA_OPT_DUM_NONE) |
    TCINT设为EDMA_OPT_TCINT_YES) |
    LINK设为EDMA_OPT_LINK_YES) |
    FS设为EDMA_OPT_FS_NO);

    mcbspCfg.pcr
    XIOEN 设为 MCBSP_PCR_XIOEN_SP) |
    FSXM 设为 MCBSP_PCR_FSXM_EXTERNAL) |
    CLKXM 设为 MCBSP_PCR_CLKXM_INPUT) |
    CLKSSTAT 设为 MCBSP_PCR_CLKSSTAT_0) |
    DXSTAT 设为 MCBSP_PCR_DXSTAT_0) |
    FSXP 设为 MCBSP_PCR_FSXP_ACTIVEHIGH) |
    CLKXP 设为 MCBSP_PCR_CLKXP_RISING);

    mcbspCfg.xcr
    XPHASE 设为 MCBSP_XCR_XPHASE_SINGLE) |
    XCOMPAND 设为 MCBSP_XCR_XCOMPAND_MSB) |
    XFIG 设为 MCBSP_XCR_XFIG_NO) |
    XDATDLY 设为 MCBSP_XCR_XDATDLY_1BIT) |
    XFRLEN1 设为 MCBSP_XCR_XFRLEN1_DEFAULT) | ////////////////////////////猜测是这一行话有问题
    XWDLEN1 设为 MCBSP_XCR_XWDLEN1_32BIT) |
    XWDREVRS 设为 MCBSP_XCR_XWDREVRS_DISABLE);

    mcbspCfg.spcr |=
    FREE 设为 MCBSP_SPCR_FREE_NO) |
    SOFT 设为 MCBSP_SPCR_SOFT_YES) |
    FRST 设为 MCBSP_SPCR_FRST_YES) |
    GRST 设为 MCBSP_SPCR_GRST_NO) |
    XINTM 设为 MCBSP_SPCR_XINTM_XRDY) |
    XSYNCERR 设为 MCBSP_SPCR_XSYNCERR_NO) |
    DLB 设为 MCBSP_SPCR_DLB_OFF) |
    CLKSTP 设为 MCBSP_SPCR_CLKSTP_DISABLE) |
    DXENA 设为 MCBSP_SPCR_DXENA_OFF);

    MCBSP_config(hMcbsp, &mcbspCfg);

    edmaTxCfg.cnt = MCBSP2_TX_LEN;/////////////////这个长度我已经改大了一倍,原来是1536,现在宏定义是3072

  • 请问 用的是哪款器件?