STM32H743 SD卡DMA读取

2019-07-20 01:07发布

本帖最后由 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好小众,遇到问题都没有资料可以参考,也没有人可以帮忙明天一定要找到原因,找不到的话,我死


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
qiousanxi
1楼-- · 2019-07-20 06:40
candylife9 发表于 2018-10-27 09:18
找到原因了,我对比了一下与原子的工程配置,发现对内存的配置不一样。我勾选的是IRAM1,原子的是IRAM2,我 ...

sd卡的dma只能读到512k的axisram 还有和他搭桥的sram区,好好看看手册
candylife9
2楼-- · 2019-07-20 21:09
找到原因了,总结一下:我的工程使用了默认的IRAM1,没有修改。IRAM1的起始地址是0x20000000,而这片内存在STM32H7里面是DTCM内存区,该内存只能通过M7内核和MDMA访问。而我在程序里面定义的SDMMC1 IDAM缓冲区被设置到了DTCM里面,SDMMC1的IDMA是访问不到DTCM的,于是出现了IDMA错误,导致SDMMC1的接收FIFO溢出,RXOVERR和DMATE被同时置位并且进入中断。当我把工程的内存选到IRAM2的时候,就使用了AXI SRAM,而AXI SRAM是可以被SDMMC1的IDMA通过AHB总线访问到的,所以没有问题。

所以明白芯片的架构和细节还是很重要的,一个星期的抓狂终于结束了

qiousanxi
3楼-- · 2019-07-20 08:33
 精彩回答 2  元偷偷看……
candylife9
4楼-- · 2019-07-20 10:49
qiousanxi 发表于 2018-10-26 22:40
不要用dma,我测试过会有问题,还有用25m时钟,如果你是1.8v的sd卡除外。

是HAL库的问题吗,还是芯片本身的BUG呢?感觉好纠结。
candylife9
5楼-- · 2019-07-20 14:52
找到原因了,我对比了一下与原子的工程配置,发现对内存的配置不一样。我勾选的是IRAM1,原子的是IRAM2,我改成IRAM1就可以了。还不知道具体原因,找不到STM32H7的Memory map,等下看下资料这两个内存有什么区别。
candylife9
6楼-- · 2019-07-20 18:53
 精彩回答 2  元偷偷看……

一周热门 更多>