简述SD卡的工作原理

功能

SD卡是存储卡,它的功能就是存储。

分类

SD卡按容量分类,可以分为3类:SD卡、SDHC卡、SDXC卡,如下:

容量

命名

简称

0~2G

Standard Capacity SD Memory Card

SDSC或SD

2G~32G

High Capacity SD Memory Card

SDHC

32G~2T

Extended Capacity SD Memory Card

SDXC

硬件结构

SD卡外形和接口图如下图所示:

芯片卡数据解析规则java_初始化

芯片卡数据解析规则java_初始化_02

驱动SD卡工作的接口是SPI 或者 SDIO 口,引脚分布如下:

芯片卡数据解析规则java_初始化_03

主机与SD卡的硬件连接图:

芯片卡数据解析规则java_初始化_04

工作原理

要驱动SD卡工作,主要涉及两个步骤。

第一个步骤是SD卡的识别过程。

第二个步骤是对SD卡进行读写过程,即主机控制器和SD卡之间进行数据传输的过程。

要使SD卡能正常工作,一是要给SD卡供给稳定的电压,二是要SD卡按用户规定的方式工作。这两项工作的实现,都是主机控制器通过给SD卡发送控制命令来实现的。

主机(SDIO控制器)要驱动SD卡工作,要使用许多的命令,包括应用层命令ACMD 和 通用命令 CMD. 主机(SDIO控制器)把命令发送给SD卡,SD卡会作出回应,这里的回应叫做响应,响应命令分为6类,分别是R1、R1b、R2、R3、R6、R7。

主机(SDIO控制器)给SD卡发送命令之后,SD卡会作出响应,响应中包含主机(SDIO控制器)需要的数据,这些数据有SD的信息,容量,和存储数据等等。

上面已经提到了,SD卡工作,主要是识别和数据传输,它的识别过程有些复杂,写代码的时候,可以参考协议给的初始化流程图。数据传输包括读和写,单字节和多字节读写。下两节描述识别初始化流程图和数据读写时序图。

流程图

SD卡初始化流程图:

芯片卡数据解析规则java_寄存器_05

读写数据的时序图

SDIO与SD卡通信一般以数据块的形式进行传输,SDIO(多)数据块读操作,如下图所示:

芯片卡数据解析规则java_初始化_06

SDIO(多)数据块写操作,如下图所示:

芯片卡数据解析规则java_初始化_07

命令格式

SDIO所有的命令和响应都是在SDIO_CMD引脚上面传输的,命令长度固定为48位,SDIO命令格式如下表所示:

芯片卡数据解析规则java_流程图_08

其中:除了命令索引和参数需要我们设置,其他都是由SDIO硬件自动控制。命令索引(如CMD0,CMD1之类)由SDIO_CMD寄存器设置,命令参数则由SDIO_ARG寄存器设置。

STM32 SDIO短响应(48位)格式如下表所示:

芯片卡数据解析规则java_寄存器_09

STM32 SDIO长响应(136位)格式如下表所示:

芯片卡数据解析规则java_寄存器_10

寄存器

SDIO控制器的寄存器,主要设置SDIO控制器和命令的索引与参数。

SD卡有5个寄存器CID,RCA,CSD,SCR.OCR。SD卡的信息从SD卡寄存器中获取。

总结

SD卡正常工作,就是根据SD卡初始化流程图,发送命令,收到回复,直到流程结束。传输数据,也是根据读写时序图,将要发送的数据放进命令中发送出去。

SDIO 控制器驱动SD 卡识别过程中,频率是400K , 传输数据的时候,SDIOCK 的 频率是6M.SD卡初始化的时候,频率不能超过400K。