OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17892|回复: 32

STM32H743 SD卡DMA读取

[复制链接]

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-10-26 20:49:37 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 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好小众,遇到问题都没有资料可以参考,也没有人可以帮忙明天一定要找到原因,找不到的话,我死


我的工程

我的工程

原子的没有问题

原子的没有问题

最佳答案

查看完整内容[请看2#楼]

sd卡的dma只能读到512k的axisram 还有和他搭桥的sram区,好好看看手册
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-10-26 20:49:38 | 显示全部楼层
candylife9 发表于 2018-10-27 09:18
找到原因了,我对比了一下与原子的工程配置,发现对内存的配置不一样。我勾选的是IRAM1,原子的是IRAM2,我 ...

sd卡的dma只能读到512k的axisram 还有和他搭桥的sram区,好好看看手册
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-10-26 22:40:26 | 显示全部楼层
不要用dma,我测试过会有问题,还有用25m时钟,如果你是1.8v的sd卡除外。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
 楼主| 发表于 2018-10-27 08:32:34 | 显示全部楼层
qiousanxi 发表于 2018-10-26 22:40
不要用dma,我测试过会有问题,还有用25m时钟,如果你是1.8v的sd卡除外。

是HAL库的问题吗,还是芯片本身的BUG呢?感觉好纠结。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
 楼主| 发表于 2018-10-27 09:18:26 | 显示全部楼层
找到原因了,我对比了一下与原子的工程配置,发现对内存的配置不一样。我勾选的是IRAM1,原子的是IRAM2,我改成IRAM1就可以了。还不知道具体原因,找不到STM32H7的Memory map,等下看下资料这两个内存有什么区别。

内存配置

内存配置
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
 楼主| 发表于 2018-10-27 11:46:40 | 显示全部楼层
qiousanxi 发表于 2018-10-27 09:25
sd卡的dma只能读到512k的axisram 还有和他搭桥的sram区,好好看看手册

是的,我看了系统架构图,确实是这个原因。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
 楼主| 发表于 2018-10-27 11:56:58 | 显示全部楼层
找到原因了,总结一下:我的工程使用了默认的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总线访问到的,所以没有问题。

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

选择了IRAM1

选择了IRAM1

DTCM访问路径

DTCM访问路径

错误的IDMA缓冲区地址

错误的IDMA缓冲区地址

参考手册描述的错误原因

参考手册描述的错误原因
回复

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-11-24
在线时间
56 小时
发表于 2019-1-3 16:04:47 | 显示全部楼层
感谢大神,  我也折腾一周了死活不通。 看了你的帖子终于调通了。   后悔没早点看到
回复

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-11-24
在线时间
56 小时
发表于 2019-1-3 16:17:59 | 显示全部楼层
跟你一样的现象, 不用IDMA没问题,用了就接收溢出。。。再次感谢。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-1-4
在线时间
0 小时
发表于 2019-1-4 17:05:22 | 显示全部楼层
枫天2017 发表于 2019-1-3 16:04
感谢大神,  我也折腾一周了死活不通。 看了你的帖子终于调通了。   后悔没早点看到

能够问一下大神,使用SD采集速度能够达到多大?
回复

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-11-24
在线时间
56 小时
发表于 2019-2-22 10:30:01 | 显示全部楼层
叶麦 发表于 2019-1-4 17:05
能够问一下大神,使用SD采集速度能够达到多大?

我使用 SDHC  class10卡  50M时钟,读取速度20M字节每秒。你可以参考
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2014-6-18
在线时间
8 小时
发表于 2019-3-5 11:14:10 | 显示全部楼层
枫天2017 发表于 2019-2-22 10:30
我使用 SDHC  class10卡  50M时钟,读取速度20M字节每秒。你可以参考

你好  给你写入sd卡的速度能到多少啊
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-4-25
在线时间
1 小时
发表于 2019-5-20 17:23:24 | 显示全部楼层
大神,我也出现类似的问题,但是没找到原子的DMA读取SD卡的相关例程,能否分享一些资料研究一下,谢谢
回复

使用道具 举报

27

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-12-31
在线时间
82 小时
发表于 2019-6-16 20:53:52 | 显示全部楼层
枫天2017 发表于 2019-2-22 10:30
我使用 SDHC  class10卡  50M时钟,读取速度20M字节每秒。你可以参考

你好,请教一下,要是用F407的板子,读SD卡速度能达到多少class10的卡
回复

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-11-24
在线时间
56 小时
发表于 2019-6-17 15:29:43 | 显示全部楼层
huangjunxing 发表于 2019-6-16 20:53
你好,请教一下,要是用F407的板子,读SD卡速度能达到多少class10的卡

读取速度 最大14.8M 字节/秒    ,写速度没测试。
回复

使用道具 举报

27

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-12-31
在线时间
82 小时
发表于 2019-6-17 16:39:29 | 显示全部楼层
枫天2017 发表于 2019-6-17 15:29
读取速度 最大14.8M 字节/秒    ,写速度没测试。

好像用原子哥的的例程,sdiio方式,读SD卡的时钟是24M,用fatfs文件系统达不到这个速度,请教一下,需要修改哪些地方,谢谢
回复

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
403
金钱
403
注册时间
2017-11-24
在线时间
56 小时
发表于 2019-6-18 18:20:33 | 显示全部楼层
huangjunxing 发表于 2019-6-17 16:39
好像用原子哥的的例程,sdiio方式,读SD卡的时钟是24M,用fatfs文件系统达不到这个速度,请教一下,需要 ...

时钟旁路 到48M    ,缓冲加大 越大越快
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2018-11-3
在线时间
38 小时
发表于 2019-6-23 00:08:00 | 显示全部楼层
大神 论坛没找到原子h7的DMA读取SD卡的相关例程,能否分享一些资料研究一下,万分感谢啊
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-7-7
在线时间
20 小时
发表于 2019-7-22 10:17:30 | 显示全部楼层
candylife9 发表于 2018-10-27 11:56
找到原因了,总结一下:我的工程使用了默认的IRAM1,没有修改。IRAM1的起始地址是0x20000000,而这片内存在 ...

请问大佬,您参考的是正点原子的哪个例程呢?
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
 楼主| 发表于 2019-7-24 09:13:26 | 显示全部楼层
本帖最后由 candylife9 于 2019-7-24 09:15 编辑
团子 发表于 2019-7-22 10:17
请问大佬,您参考的是正点原子的哪个例程呢?

参考文件系统的例程。
回复

使用道具 举报

122

主题

294

帖子

0

精华

高级会员

Rank: 4

积分
712
金钱
712
注册时间
2015-11-14
在线时间
868 小时
发表于 2019-8-10 17:20:29 | 显示全部楼层
本帖最后由 walker168 于 2019-8-10 17:27 编辑
qiousanxi 发表于 2018-10-26 20:49
sd卡的dma只能读到512k的axisram 还有和他搭桥的sram区,好好看看手册

我试验过, SD 卡 DMA 缓冲 只能定义在 512k的axisram, 定义到其它 SRAM 区 ,统统读写失败。  很讨厌地霸占了axi sram 一小块空间,想用个完整的 512k SRAM 都不行。 有没有办法解决呢?
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2019-8-11 00:00:10 | 显示全部楼层
walker168 发表于 2019-8-10 17:20
我试验过, SD 卡 DMA 缓冲 只能定义在 512k的axisram, 定义到其它 SRAM 区 ,统统读写失败。  很讨厌地 ...

内存管理,或者位置定义
回复

使用道具 举报

18

主题

149

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-11-28
在线时间
208 小时
发表于 2019-10-25 15:51:51 | 显示全部楼层
大神牛逼!我说咋回事儿呢。原来IDMA不能给搞到那DTCM上去。学习了。不过这两天再弄那个STemWin遇到这样的一个问题不通知大神能否给予一定的指点,哪怕一个方向都成:SD卡和您一样也用了文件系统。SDRAM也测试过正常。能够正常运行STemWin的DEMO。(移植的是5.44a版本的emWin文件名为:STemWin_CM7_OS_wc16_ARGB.a参考安富莱的移植的。用的是RGB屏)。MPU对DTCM和SDRAM的memory type都配置为normal 不然的话访问的时候不对齐可能会出现“未对齐硬件错误”。 我的程序是把SD卡中的BMP文件读取到用GUI_ALLOC_AllocZero()所开辟的空间(GUI_ALLOC_h2p()转为指针)。然后再用GUI_BMP_Draw()来显示这个图片。然后就是不能显示。但读到定义的一个全局数组中就可以显示。我好尴尬啊。Cache的配置策略我也改了很多种,可就是不行!希望有大神给给予指点。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
 楼主| 发表于 2019-10-30 08:39:39 | 显示全部楼层
walker168 发表于 2019-8-10 17:20
我试验过, SD 卡 DMA 缓冲 只能定义在 512k的axisram, 定义到其它 SRAM 区 ,统统读写失败。  很讨厌地 ...

AXI可以访问到的内存就AXI SRAM,和SDRAM,如果你不想用AXI SRAM,那就只能外挂SDRAM了。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
 楼主| 发表于 2019-10-30 08:44:36 | 显示全部楼层
yconnor 发表于 2019-10-25 15:51
大神牛逼!我说咋回事儿呢。原来IDMA不能给搞到那DTCM上去。学习了。不过这两天再弄那个STemWin遇到这样的 ...

有可能你分配的这个空间是一个临时的空间。因为emwin里面很多资源需要随时可以索引的,比如图片数据,他必须永久存在才能随时调用。如果你把图片数据读到了一个临时的内存里面,或局部数组里面,当内存被释放掉后,你再去访问图片数据,实际上已经不存在了,就会显示不了,内存错误这些。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
 楼主| 发表于 2019-10-30 08:50:21 | 显示全部楼层
yconnor 发表于 2019-10-25 15:51
大神牛逼!我说咋回事儿呢。原来IDMA不能给搞到那DTCM上去。学习了。不过这两天再弄那个STemWin遇到这样的 ...

还有一个方向就是,GUI_ALLOC_AllocZero这个函数分配的内存,是否可以被dam2d给访问到。
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2016-12-22
在线时间
28 小时
发表于 2020-11-19 16:21:54 | 显示全部楼层
感谢大神前面探路,一样的新路历程,搞了一周,总算搞定了
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2020-8-5
在线时间
20 小时
发表于 2020-12-3 14:41:09 | 显示全部楼层
战狼 发表于 2020-11-19 16:21
感谢大神前面探路,一样的新路历程,搞了一周,总算搞定了

您好,我最近也在用H7在做往SD卡里面写数据,没有用DMA感觉速度很慢,还没有找到原因,方便的话请问能否参考下您的例程,谢谢。邮箱760663498@qq.com
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-1-19
在线时间
9 小时
发表于 2020-12-24 11:10:52 | 显示全部楼层
急需H732的DMA读写SD卡的驱动,有报酬。hecheng456123@163.com
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2021-3-23
在线时间
11 小时
发表于 2021-7-2 10:43:57 | 显示全部楼层
请教一下,有没有cubeMX配置SDMMC1的DMA方式读取数据的教程呢?
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
 楼主| 发表于 2021-7-3 10:01:01 | 显示全部楼层
摔不死的泥鳅 发表于 2021-7-2 10:43
请教一下,有没有cubeMX配置SDMMC1的DMA方式读取数据的教程呢?

cubeMX配置很简单吧,现在都是用cube配置了。
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2021-3-23
在线时间
11 小时
发表于 2021-7-13 09:53:12 | 显示全部楼层
candylife9 发表于 2021-7-3 10:01
cubeMX配置很简单吧,现在都是用cube配置了。

cubeMX上关于DMA的配置能帮忙指点一下吗?我看好像没有直接配置IDMA的选项。
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2021-3-23
在线时间
11 小时
发表于 2021-7-30 13:45:31 | 显示全部楼层
qiousanxi 发表于 2018-10-26 22:40
不要用dma,我测试过会有问题,还有用25m时钟,如果你是1.8v的sd卡除外。

你有问题的现象是什么?是不是读取的时候前几个字节的数据读不到?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 09:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表