文章目录[隐藏]
目录
一、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卡简述
很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有 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
暂无评论