TM32H7-SD卡DMA方式读写的可靠性修正

本文详细介绍了STM32H7系列微控制器SD卡的初始化过程,包括时钟与IO配置、SD卡类型的检测及初始化结构体的设置。同时,针对电路老化或线缆过长导致的读写错误,提出了循环重试机制,并修复了HAL库中的DMA写SD卡错误。此外,文章还强调了数据校验的重要性,以确保FATFS文件系统的数据完整性。
该文章已生成可运行项目,

文末附主要代码,完整测试程序到参考资料[7]下载。

1- SD卡的初始化

回调函数初始化

IO和时钟初始化

使用400KHz单线进行初始化(用户无需自行设置)

SDMMC单元上电并适当延时

通过命令通信,确定SD卡合适的初始化方式(需要通过命令知道使用的SD卡是什么类型,需要使用怎样的)。并设置块大小。

通过用户设置的初始化结构体SD_InitTypeDef对SD卡正常读写时的速率、时钟、线宽等进行初始化,若用户设置的参数与SD的类型不匹配,则程序自动进行更正。。

读状态确定初始化成功

2- 基本的可靠性修正

1、由于SD卡的读写速率较高,当电路板老化或SD卡线太长时,都会大大增加SD的读写错误的发生。

原子哥虽然提供了不错的SD卡代码,但是为了降低错误,把读写速率讲得很低,这样并不是很合理,速率低了依然可能发生错误。因此处理方法是在读写错误发生后,重新读写该区域的数据,知道正确读取数据后才跳出循环。

2、另外,STM32H7 HAL库中的DMA方式写SD卡的程序中出现了笔误,导致不能正常些SD卡,故做了如下修正。当然,最好的解决办法是使用最新的1.90版本的库(目前,OpenedvSD卡HAL库版本还是1.30版本)。

3、即使上面两步已经做到位了,但依然可能收到错误数据,因此使用FATFS时,数据尽量有个校验和,当检验和出错时,通过fseek调整文件指针,实现数据重读。这也就要求校验和设计要严谨,不然会出现数据错了,但校验和凑巧还是正确的问题。

4、数据层面的再次检验,如一个变量A>100,如何A读出小于100的值,那也可以考虑数据回溯或丢弃本次数据了。

 

3- 参考资料

[1] physical layer simplified specification Vision 7.10

[2]STM32之SD卡

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值