文末附主要代码,完整测试程序到参考资料[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的值,那也可以考虑数据回溯或丢弃本次数据了。

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

被折叠的 条评论
为什么被折叠?



