基于STM32F103完成对SD卡的数据读取操作

目录

一、SD卡协议和原理

1、SD卡简述

2、SD卡物理结构

 3、SD卡寄存器

4、SD 卡总线

5、SD 总线协议

二、项目配置与代码

1、创建项目

2、完整工程代码如下

3、代码修改

4、接线

三、实验结果

四、总结

五、参考资料


一、SD卡协议和原理

1、SD卡简述

很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有 U 盘,FLASH 芯片,SD 卡等。他们各有优点,综合比较,最适合单片机系统的莫过于 SD 卡了,它不仅容量可以做到很大(32GB 以上),支持 SPI/SDIO 驱动,而且有多种体积的尺寸可供选择(标准的 SD 卡尺寸,以及 TF 卡尺寸等),能满足不同应用的要求。
只需要少数几个 IO 口即可外扩一个高达 32GB 以上的外部存储器,容量从几十 M 到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。

2、SD卡物理结构

一般SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分。

存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;

电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;

卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器; 接口驱动器控制SD卡引脚的输入输出。

 3、SD卡寄存器

SD卡总共有8个寄存器,用于设定或表示SD卡信息。
这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。

4、SD 卡总线

SD 卡一般都支持 SDIO 和 SPI 这两种接口。

SD 卡使用 9-pin 接口通信,其中 3 根电源线、1 根时钟线、1 根命令线和 4 根数据线。

SDIO 的通信时序要简单许多,SDIO 不管是从主机控制器向 SD 卡传输,还是 SD 卡向主机控制器传输都只以 CLK 时钟线的上升沿为有效。

5、SD 总线协议

SD 总线通信是基于 命令 和 数据 传输的。

通讯由一个起始位(“0”),由一个停止位(“1”)终止。SD 通信一般是主机发送一个命令(Command),从设备在接收到命令后作出响应(Response),如有需要会有数据(Data)传输参与。
SD 总线的基本交互是命令与响应交互。
SD 数据是以块(Black)形式传输的,SDHC 卡数据块长度一般为 512 字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要 CRC 位来保证数据传输成功。CRC 位由 SD 卡系统硬件生成。STM32 控制器可以控制使用单线或 4 线传输。
主机向 SD 卡写入数据块操作示意如下:

SD 总线—命令

SD 命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与 SD 主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。

SD 命令格式固定为 48bit,都是通过 CMD 线连续传输的(数据线不参与)

 SD 总线—响应

响应由 SD 卡向主机发出,部分命令要求 SD 卡作出响应,这些响应多用于反馈 SD 卡的状态。SDIO 总共有 7 个响应类型(代号:R1~R7),其中 SD 卡没有 R4、R5 类型响应。特定的命令对应有特定的响应类型,比如当主机发送 CMD3 命令时,可以得到响应 R6。与命令一样,SD 卡的响应也是通过 CMD 线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是 48bit 长度,只有 R2 类型是长响应,其长度为 136bit。

二、项目配置与代码

1、创建项目

打开 CubeMX,创建形工程,选择 STM32F103C8T6 芯片,具体配置我在这里就不多说了,之前我们已经配置过很多次了,相信大家也已经很熟悉了,具体可参考:

STM32用cube配置FATFS模式下SPI读写SD卡_Drive World的博客-CSDN博客

基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_L-GRAZY的博客-CSDN博客

2、完整工程代码如下

链接:百度网盘 请输入提取码

提取码:e63q 

3、代码修改

main.c

在红色方框中输入你想要在hello.txt中输出的。

while循环中

4、接线

注意: SD卡模块要接5v,STM32也要接5v,不然会失败。

三、实验结果

编译烧录后,打开串口调试助手,结果如下

注意:有可能你前面都做好了,但是在这一步串口依旧会没有回应,你可能需要检查一下线是不是没有接好,反正我在这一步做了好久,后面串口莫名其妙的 就有了回应。

然后打开sd卡可以看到有一个hello文本文件,打开,结果如下:

可以看到,第一行结果输出正确,后面输出的第二个字母变了,这是因为我在main函数中修改代码时将下面图片中红框旁的01删掉了,因为位于1的这一位每次输出就要加一,所以导致了后面输出i,j,k。。。

四、总结

       这一次实验还是花了蛮多时间的,很多时间都是花在了串口那里,不知道是SD卡的原因还是接线原因,想要SD卡初始化成功以及后面的内容,是很不容易的,有可能你做很久都不行,有可能你一下就行了,这很需要耐心。

五、参考资料

基于STM32F103 完成对SD卡的数据读取(FAT文件模式)_我想恰鱼的博客-CSDN博客

 STM32用cube配置FATFS模式下SPI读写SD卡_Drive World的博客-CSDN博客

基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_L-GRAZY的博客-CSDN博客

版权声明:本文为CSDN博主「王 大 发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_61863551/article/details/122132216

目录

一、SD卡协议和原理

1、SD卡简述

2、SD卡物理结构

 3、SD卡寄存器

4、SD 卡总线

5、SD 总线协议

二、项目配置与代码

1、创建项目

2、完整工程代码如下

3、代码修改

4、接线

三、实验结果

四、总结

五、参考资料


一、SD卡协议和原理

1、SD卡简述

很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有 U 盘,FLASH 芯片,SD 卡等。他们各有优点,综合比较,最适合单片机系统的莫过于 SD 卡了,它不仅容量可以做到很大(32GB 以上),支持 SPI/SDIO 驱动,而且有多种体积的尺寸可供选择(标准的 SD 卡尺寸,以及 TF 卡尺寸等),能满足不同应用的要求。
只需要少数几个 IO 口即可外扩一个高达 32GB 以上的外部存储器,容量从几十 M 到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。

2、SD卡物理结构

一般SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分。

存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;

电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;

卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器; 接口驱动器控制SD卡引脚的输入输出。

 3、SD卡寄存器

SD卡总共有8个寄存器,用于设定或表示SD卡信息。
这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。

4、SD 卡总线

SD 卡一般都支持 SDIO 和 SPI 这两种接口。

SD 卡使用 9-pin 接口通信,其中 3 根电源线、1 根时钟线、1 根命令线和 4 根数据线。

SDIO 的通信时序要简单许多,SDIO 不管是从主机控制器向 SD 卡传输,还是 SD 卡向主机控制器传输都只以 CLK 时钟线的上升沿为有效。

5、SD 总线协议

SD 总线通信是基于 命令 和 数据 传输的。

通讯由一个起始位(“0”),由一个停止位(“1”)终止。SD 通信一般是主机发送一个命令(Command),从设备在接收到命令后作出响应(Response),如有需要会有数据(Data)传输参与。
SD 总线的基本交互是命令与响应交互。
SD 数据是以块(Black)形式传输的,SDHC 卡数据块长度一般为 512 字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要 CRC 位来保证数据传输成功。CRC 位由 SD 卡系统硬件生成。STM32 控制器可以控制使用单线或 4 线传输。
主机向 SD 卡写入数据块操作示意如下:

SD 总线—命令

SD 命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与 SD 主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。

SD 命令格式固定为 48bit,都是通过 CMD 线连续传输的(数据线不参与)

 SD 总线—响应

响应由 SD 卡向主机发出,部分命令要求 SD 卡作出响应,这些响应多用于反馈 SD 卡的状态。SDIO 总共有 7 个响应类型(代号:R1~R7),其中 SD 卡没有 R4、R5 类型响应。特定的命令对应有特定的响应类型,比如当主机发送 CMD3 命令时,可以得到响应 R6。与命令一样,SD 卡的响应也是通过 CMD 线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是 48bit 长度,只有 R2 类型是长响应,其长度为 136bit。

二、项目配置与代码

1、创建项目

打开 CubeMX,创建形工程,选择 STM32F103C8T6 芯片,具体配置我在这里就不多说了,之前我们已经配置过很多次了,相信大家也已经很熟悉了,具体可参考:

STM32用cube配置FATFS模式下SPI读写SD卡_Drive World的博客-CSDN博客

基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_L-GRAZY的博客-CSDN博客

2、完整工程代码如下

链接:百度网盘 请输入提取码

提取码:e63q 

3、代码修改

main.c

在红色方框中输入你想要在hello.txt中输出的。

while循环中

4、接线

注意: SD卡模块要接5v,STM32也要接5v,不然会失败。

三、实验结果

编译烧录后,打开串口调试助手,结果如下

注意:有可能你前面都做好了,但是在这一步串口依旧会没有回应,你可能需要检查一下线是不是没有接好,反正我在这一步做了好久,后面串口莫名其妙的 就有了回应。

然后打开sd卡可以看到有一个hello文本文件,打开,结果如下:

可以看到,第一行结果输出正确,后面输出的第二个字母变了,这是因为我在main函数中修改代码时将下面图片中红框旁的01删掉了,因为位于1的这一位每次输出就要加一,所以导致了后面输出i,j,k。。。

四、总结

       这一次实验还是花了蛮多时间的,很多时间都是花在了串口那里,不知道是SD卡的原因还是接线原因,想要SD卡初始化成功以及后面的内容,是很不容易的,有可能你做很久都不行,有可能你一下就行了,这很需要耐心。

五、参考资料

基于STM32F103 完成对SD卡的数据读取(FAT文件模式)_我想恰鱼的博客-CSDN博客

 STM32用cube配置FATFS模式下SPI读写SD卡_Drive World的博客-CSDN博客

基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_L-GRAZY的博客-CSDN博客

版权声明:本文为CSDN博主「王 大 发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_61863551/article/details/122132216

生成海报
点赞 0

王 大 发

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

【零基础学STM32】CubeMx+HAL配置按键点灯实验

主要内容 上一篇文章中采用了EXTI中断的方式控制小灯的亮灭。其实也可以不采用中断,直接使用GPIO配置即可实现按键对应小灯的状态,且效果几乎相同。同样本次例程试验采用正点原子阿波罗STM32F429IGT6开发板

单路USB转单/多路串口方案

单路USB转单/多路串口方案 在日常开发或产品设计时,会遇到不少使用串口通讯或者调试的情况,一个串口时使用USB转单路串口则可优雅解决,但若是多个串口时则可能需要占据多个USB口,颇为麻