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

关于mcbsp模块打开FIFO功能收不到EDMA中断的情况

一直在omapl138平台上面使用mcbsp的TX和RX进行数据的收发,采用EDMA的pingpong模式,BFIFO功能都是关闭着的,随着EDMA_CC0通道使用多了, 需要打开MCBSP的FIFO功能,根据文档上面解释,只要在mcbsp跳出reset模式之前打开都可以,所以在mcbsp初始化的时候,讲mcbsp进入reset模式之后,添加配置BFIFO,enable BFIFO,讲串行位宽配置为1 word,缓存大小配置为32bits的整数倍,每种倍数都尝试过,只要打开BFIFO功能,EDMA就进不了中断了,之前默认没有使用BFIFO功能的时候mcbsp都可以正常工作;

网上没有找到关于打开BFIFO功能的mcbsp例程,TI的例子里面也是没有提到BFIFO这个功能,请tony哥帮我看看,出谋划策一下,其他有遇到此类问题的同行们请赐教一下。

多谢!

Tony Tang:

用FIFO后,EDMA的参数要根据FIFO的配置来设置,即EDMA的A Count要设为FIFO的深度。当FIFO空出来所设置的FIFO阀值时,则产生EDMA Event,这时EDMA必需将FIFO阀值所需的数据一次性送给FIFO。

如果还有问题,则将配置贴上来看一下。

bingliang chen:

回复 Tony Tang:

tony哥,打开FIFO的操作在配置MCBSP之前就调用了,深度为40words,每个words长度为32bits,对应的edma的配置如图,以前没有用FIFO的时候首地址为MCBSP_DRR,现在改为FIFO_DATA,A count值以前是4字节,就是DRR的宽度,现在改为4*40=FIFO的长度,对应的把B count缩短为原来的1/40,这样子写进不了EDMA的中断,帮我看看哪里有问题?

昨天调用使能FIFO的库函数接口,将FIFO深度设置为64words,源地址FIFO_DATA,a count = 4的时候都可以正常工作的。

bingliang chen:

回复 Tony Tang:

tony:

怎么保证EDMA将FIFO阀值所需的数据一次性送给FIFO?通过把a count的值跟FIFO的阈值配置一致还是有其他办法?

 

Tony Tang:

回复 bingliang chen:

bingliang chen怎么保证EDMA将FIFO阀值所需的数据一次性送给FIFO?通过把a count的值跟FIFO的阈值配置一致还是有其他办法?

对。如果是A-sync,那么一个event则要所需数据都送给FIFO,否则FIFO不给新的event了,因为FIFO会认为送出去的事件还没有被服务完。

Tony Tang:

回复 bingliang chen:

bingliang chenA count值以前是4字节,就是DRR的宽度,现在改为4*40=FIFO的长度,对应的把B count缩短为原来的1/40,

现在用的是A-sync还是AB-sync?

bingliang chen:

回复 Tony Tang:

刚才把配置打印出来,确认是采用A-sync,但是每次传送数据是640个words,所以虽然A-count改为4*40bytes了,但是B-count值不能为1,需要是16,这种配置我理解为就是每次传送4*40bytes时TC会给CC发送event,然后B-count的值减为0的时候EDMA控制器收到一起传送结束的标志,应用程序可以填新数据到传送完的640个words区域。

这里有一点不明白c-count值干嘛用的?

bingliang chen:

回复 Tony Tang:

tony:

已经确认了是A-sync,但是只能进一次EDMA中断,ping-pong跑不起来了。

因为出现了mcbsp发不出来的问题,加上fifo为了event queue可以少点压力,不加FIFO的话,每4bytes就会产生一个FIFO,现在加了FIFO的话,应该是FIFO传输完再产生一个event,现在配置为a-count=fifo大小,b-count = (ping或者pong的长度/a-count),c-count = 1;

由于保密关系,代码拷贝不出来,之前不用FIFO的时候a-count=4, b-count = 640, c-count = 1, A-sync配置,这样是可以正常跑的,加上FIFO之后就是把目的地址从mcbsp的shift register改为FIFO_data,然后a-count=fifo大小,b-count = 640/FIFO深度,跑不起来了,还有哪里没有配置好嘛?

bingliang chen:

回复 Tony Tang:

tony,我已经把代码改为可读性强一些的宏定义了,在mcbsp初始化之前把FIFO打开了,而且配置深度是32,DMA配置中目标地址也改为了FIFO_DATA地址,当BFIFO_DEEPTH=1时可以正常跑起来,而改为BFIFO_DEEPTH=20或者BFIFO_DEEPTH=32都没法正常跑,是不是哪里还没有配置好?

可以确定肯定是A-sync,因为opt寄存器的bit2位已经反复确认了,而且不用FIFO时能跑起来也证明了是A-sync。

bingliang chen:

回复 Tony Tang:

tony哥:

      以下是完整的一个DMA PAR配置的代码,跟不用FIFO的区别就是a-count   b-count  bCntReload这三个地方要根据不同的FIFO深度进行修改,帮我看一下还要改哪里?

Tony Tang:

回复 bingliang chen:

bingliang chen

我已经把代码改为可读性强一些的宏定义了,在mcbsp初始化之前把FIFO打开了,而且配置深度是32,DMA配置中目标地址也改为了FIFO_DATA地址,当BFIFO_DEEPTH=1时可以正常跑起来,而改为BFIFO_DEEPTH=20或者BFIFO_DEEPTH=32都没法正常跑,是不是哪里还没有配置好?

可以确定肯定是A-sync,因为opt寄存器的bit2位已经反复确认了,而且不用FIFO时能跑起来也证明了是A-sync。

怎么上面还是 srcBIdx=short 4;  aCnt都是4*BFIFO_DEEPTH了。

赞(0)
未经允许不得转载:TI中文支持网 » 关于mcbsp模块打开FIFO功能收不到EDMA中断的情况
分享到: 更多 (0)