目录
一、SD卡协议
1.简述
很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有 U 盘,FLASH 芯片,SD 卡等。他们各有优点,综合比较,最适合单片机系统的莫过于 SD 卡了,它不仅容量可以做到很大(32GB 以上),支持 SPI/SDIO 驱动,而且有多种体积的尺寸可供选择(标准的 SD 卡尺寸,以及 TF 卡尺寸等),能满足不同应用的要求。
只需要少数几个 IO 口即可外扩一个高达 32GB 以上的外部存储器,容量从几十 M 到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。
2.接口
SD卡可以在SD总线模式或SPI总线模式下运行,通常可以使用SDIO总线或者SPI对SD进行驱动;
下面主要以micro SD为例,就SDIO模式和SPI模式做简单做一下介绍;
microSD引脚输出,SD模式
引脚 | 引脚名称 | 信号功能 |
---|---|---|
1 | DAT2 | 数据位2 |
2 | CD / DAT3 | 卡检测/数据位3 |
3 | CMD | 命令行 |
4 | Vdd | 电源电压2.7v / 3.6v |
5 | Clk | 时钟 |
6 | VS | 地 |
7 | DAT0 | 数据位0 |
8 | DAT1 | 数据位1 |
microSD引脚输出,SPI模式
引脚 | 引脚名称 | 信号功能 |
---|---|---|
1 | NC | 没有连接 |
2 | /CS | 片选 |
3 | DI | 主输出/从属(MOSI) |
4 | Vdd | 电源电压2.7v / 3.6v |
5 | Clk | 时钟 |
6 | Vss | 地 |
7 | DO | 主进/从出(MISO) |
8 | RSV | 已预留 |
3.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),在完成了初始化之后,就可以开始读写数据了。
SD 卡系统(SPI 模式)总线拓扑结构
二、实现
代码
网上有完整的代码
完整工程代码如下(hal库版本)
链接:百度网盘 请输入提取码
提取码:276d
连线
stm32 | SD卡模块 |
---|---|
PA4 | SDCS |
PA5 | SCK |
PA7 | MOSI |
PA6 | MISO |
VCC | VCC |
GND | GND |
注意:stm32f103c8t6芯片以及SD卡模块都要用5V驱动
编译、烧录
打开串口助手
结果如下
三、总结
打开串口接受时,要多等一会才能显示SD卡初始化成功