打印
[应用相关]

利用STM32F103完成对SD卡的数据读取详细操作

[复制链接]
1459|77
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
要求:掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。
一、SD卡协议原理
1、SD卡简述
很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有 U 盘,FLASH 芯片,SD 卡等。他们各有优点,综合比较,最适合单片机系统的莫过于 SD 卡了,它不仅容量可以做到很大(32GB 以上),支持 SPI/SDIO 驱动,而且有多种体积的尺寸可供选择(标准的 SD 卡尺寸,以及 TF 卡尺寸等),能满足不同应用的要求。 只需要少数几个 IO 口即可外扩一个高达 32GB 以上的外部存储器,容量从几十 M 到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。

使用特权

评论回复
沙发
家有两宝呀|  楼主 | 2022-7-28 23:08 | 只看该作者
2、SD卡物理结构

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

使用特权

评论回复
板凳
家有两宝呀|  楼主 | 2022-7-28 23:12 | 只看该作者

使用特权

评论回复
地板
家有两宝呀|  楼主 | 2022-7-28 23:19 | 只看该作者

使用特权

评论回复
5
家有两宝呀|  楼主 | 2022-7-28 23:21 | 只看该作者
存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;
电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;
卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器; 接口驱动器控制SD卡引脚的输入输出。

使用特权

评论回复
6
家有两宝呀|  楼主 | 2022-7-28 23:22 | 只看该作者
3、SD卡寄存器SD卡总共有8个寄存器,用于设定或表示SD卡信息。
这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。
————————————————
版权声明:本文为CSDN博主「FDFOEVER」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FDFOEVER/article/details/122105604

使用特权

评论回复
7
家有两宝呀|  楼主 | 2022-7-28 23:35 | 只看该作者
4、SD卡操作模式
SD卡一般都支持 SDIO 和 SPI 这两种接口。 其中SD卡模式的信号线有:CLK、CMD、DAT0-DAT3,6根线。 SPI模式的信号线有:CS、CLK、MISO(DATAOUT)、MOSI(DATAIN),4根线。 SD卡的命令格式:命令CMD0就是0,CMD16就是16,以此类推。 SD卡的命令总共有12类,下表为几个比较重要的命令:
————————————————
版权声明:本文为CSDN博主「FDFOEVER」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FDFOEVER/article/details/122105604

使用特权

评论回复
8
家有两宝呀|  楼主 | 2022-7-28 23:36 | 只看该作者
5、SD卡初始化(SPI模式)
SPI操作模式下:在SD卡收到复位命令时,CS为有效电平(低电平),则SPI模式被启用,在发送CMD之前要先发送74个时钟,64个为内部供电上升时间,10个用于SD卡同步;之后才能开始CMD操作,在初始化时CLK时钟不能超过400KHz。
1、初始化与SD卡连接的硬件条件(MCU的SPI配置,IO口配置);
2、上电延时(>74个CLK);
3、复位卡(CMD0),进入IDLE状态;
4、发送CMD8,检查是否支持2.0协议;
5、根据不同协议检查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等);
6、取消片选,发多8个CLK,结束初始化
这样我们就完成了对SD卡的初始化,注意末尾发送的8个CLK是提供SD卡额外的时钟,完成某些操作。通过SD卡初始化,我们可以知道SD卡的类型(V1、V2、V2HC或者MMC),在完成了初始化之后,就可以开始读写数据了。

使用特权

评论回复
9
家有两宝呀|  楼主 | 2022-7-28 23:37 | 只看该作者
6、SD卡读取与写入(SPI模式)

1、发送CMD17;
2、接收卡响应R1;
3、接收数据起始令牌0XFE;
4、接收数据;
5、接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉。
6、禁止片选之后,发多8个CLK;

使用特权

评论回复
10
家有两宝呀|  楼主 | 2022-7-28 23:37 | 只看该作者
以上就是一个典型的读取SD卡数据过程,SD卡的写于读数据差不多,写数据通过CMD24来实现,具体过程如下:

使用特权

评论回复
11
家有两宝呀|  楼主 | 2022-7-28 23:39 | 只看该作者
1、发送CMD24;
2、接收卡响应R1;
3、发送写数据起始令牌0XFE;
4、发送数据;
5、发送2字节的伪CRC;
6、禁止片选之后,发多8个CLK;

使用特权

评论回复
12
家有两宝呀|  楼主 | 2022-7-28 23:40 | 只看该作者
以上就是一个典型的写SD卡过程

使用特权

评论回复
13
家有两宝呀|  楼主 | 2022-7-28 23:41 | 只看该作者
二、实验操作

1、硬件准备

SD卡模块及SD卡

使用特权

评论回复
14
家有两宝呀|  楼主 | 2022-7-28 23:50 | 只看该作者
1、硬件准备

SD卡模块及SD卡
在这里插入图片描述

2、连线

在这里插入图片描述

3、HAL库配置

因为STM32要连接SD卡模块,所以我们要进行相应配置。

使用特权

评论回复
15
家有两宝呀|  楼主 | 2022-7-28 23:53 | 只看该作者

使用特权

评论回复
16
家有两宝呀|  楼主 | 2022-7-28 23:54 | 只看该作者

使用特权

评论回复
17
家有两宝呀|  楼主 | 2022-7-28 23:56 | 只看该作者

使用特权

评论回复
18
家有两宝呀|  楼主 | 2022-7-28 23:58 | 只看该作者
?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARkRGT0VWRVI=,size_20,color_FFFFFF,t_70,g_se,x_16

使用特权

评论回复
19
家有两宝呀|  楼主 | 2022-7-28 23:59 | 只看该作者
4、代码分析

完整工程代码如下(hal库版本)
链接:https://pan.baidu.com/s/1brMbq0lioa7OfQFXt9oO9Q
提取码:1234

使用特权

评论回复
20
家有两宝呀|  楼主 | 2022-7-28 23:59 | 只看该作者
针对main主函数进行分析
?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARkRGT0VWRVI=,size_20,color_FFFFFF,t_70,g_se,x_16

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

583

帖子

0

粉丝