本帖最后由 candylife9 于 2018-10-27 08:45 编辑
头大了,求助呀,求助呀,求助呀。
用阿波罗的743开发板,使用DMA方式读取SD卡,总是出现RXOVERR的错误,已经搞了一个星期了。。。。
从最开始怀疑自己配置问题,因为是用cube配置的工程,很多地方自己其实不是很清楚。
然后逼着没办法,把cube里面的配置参数都对着参考手册看了,确定时钟配置,引脚配置,分频系数那些都没有问题了。然后怀疑是自己的main函数控制方式有问题,把正点原子FATFS那一章的main函数改成自己的控制方式,发现可以(疯了)。
然后把自己的工程里的函数和文件和正点原子例程里面的函数和文件对比,替换。我的怎么都不行,例 程里面怎么都可以,哪怕把SMMC_CLK配到200MHZ都可以。
然后就怀疑是固件库的问题,因为听说固件库有bug的,我对比了自己工程里面的文件和函数,和原子的确实不太一样,于是将固件库从1.2替换到1.3,还是一样的。
然后开始仔细看H7的英文参考手册,里面有几处提到RXOVERR,但是只是说DMA传输错误的时候,会出现一些错误,如果是接收的话,就会RXOVERR。然后我感觉对SDMMC的配置都可以表述的很清楚了,然鹅并没有什么乱用。
根据参考手册的表述,我用逻辑分析仪抓取了SD的传输数据,发现用DMA的时候,32发起了读SD卡的命令,SD卡也有数据传过来,但是很快32又发出了终止传输的命令,跟参考手册描述一致。我计算了一下从开始传输到终止传输之间的数据量,大概15个字,所以我猜确实是传输的时候DMA出现了问题,导致SDMMC的接收FIFO溢出,因为H7的SDMMC FIFO就是16个字。
总结以上,其实RXOVERR就是指当开启了SDMMC的内部DMA后,32侧发起读SD卡请求,然后SD卡就把数据传过来啦,但是出于一下两个原因中的一个:
1、SD卡的数据被32接收到放入FIFO中,但是并没有触发到DMA(原因未知),导致FIFO溢出,RXOVERR标志挂起并进入中断,SD数据传输被32终止。
2、SD卡的数据被32接收到放入FIFO中,当FIFO中数据量达到DMA突发长度时,DMA被触发,但是由于某种错误(目前未知)导致DMA停止,FIFO里的数据不能被及时取出而导致FIFO溢出,产生RXOVERR并进入中断,32终止SD数据传输。
我个人感觉第二个可能性更大,因为不仅RXOVERR,连DMATER的标志也被置起了的。如果是第一个原因,即SDMMC没有触发到DMA的话,是检测不到DMA错误的。
但是什么问题会引起DMA传输错误呢,是DMA缓冲区没有设置对,或者需要对齐吗。我看了我的DMA缓冲区被分配到了DTCM,起始地址也是字对齐的,我个人感觉都是内存,不会有影响,难道是SDMMC的IDMA访问不到DTCM吗?
明天要加班了,折腾了一个星期了,H7好小众,遇到问题都没有资料可以参考,也没有人可以帮忙
明天一定要找到原因,找不到的话,
我死
sd卡的dma只能读到512k的axisram 还有和他搭桥的sram区,好好看看手册
所以明白芯片的架构和细节还是很重要的,一个星期的抓狂终于结束了
是HAL库的问题吗,还是芯片本身的BUG呢?感觉好纠结。
一周热门 更多>