本人小白一枚,基本上不懂驱动程序怎么写的,主要是做应用层的软件
最近碰到一个问题,就是
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:
请问 用的是哪款器件?