TI中文支持网
TI专业的中文技术问题搜集分享网站

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 phase000 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

XiaoBai Zhang:

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

最近碰到一个问题,就是

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.optPRI设为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.pcrXIOEN 设为 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.xcrXPHASE 设为 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

Shine:

请问 用的是哪款器件?

赞(0)
未经允许不得转载:TI中文支持网 » Mcbsp+EDMA方式下,DMA pingPong变长一倍,DMA中断怎么保持原来的周期
分享到: 更多 (0)