上一节简单介绍了SD卡的分类,本节将会介绍SD卡的通信协议,也就是SDIO协议。
STM32F4X SDIO(二)SDIO协议
- SD 卡管脚和寄存器
- SD卡管脚分布
- SD卡通信协议
- SD卡寄存器
- SD卡内部结构
- SDIO总线
- SDIO总线拓扑
- SDIO总线协议
- SDIO协议的基本结构
- SDIO协议数据传输
- SDIO协议命令与响应的结构
- 命令结构
- 响应结构
- 短响应
- 长响应
- SDIO数据包格式
- 常规数据包格式(8bit 宽)
- 1线模式
- 4线模式
- 宽位数据包格式
- 1线模式
- 4线模式
SD 卡管脚和寄存器
SD卡管脚分布
我们以标准SD卡为例,先介绍一下SD卡的管脚。我们翻开SD卡的背面就能看到SD卡的管脚分布。
SD卡通信协议
SD卡的通信协议有两种,分别是SDIO协议和SPI协议,本节主要讲的是SDIO协议。
管脚 | SDIO协议 | SPI协议 | ||||
---|---|---|---|---|---|---|
名称 | 类型 | 描述 | 名称 | 类型 | 描述 | |
1 | CD/DAT3 | 输入输出(推挽模式) | 检测/数据线3 | CS | 输入 | 片选(低电平有效) |
2 | CMD | 输入输出(推挽模式) | 命令/响应 | DI | 输入 | 数据输入 |
3 | VSS1 | 输入 | 接电源地 | VSS | 输入 | 接电源地 |
4 | VDD | 输入 | 电源 | VDD | 输入 | 电源 |
5 | CLK | 输入 | 时钟 | SCLK | 输入 | 时钟 |
6 | VSS2 | 输入 | 接电源地 | VSS2 | 输入 | 接电源地 |
7 | DAT0 | 输入输出(推挽模式) | 数据线0 | DO | 输出(推挽模式) | 数据输出 |
8 | DAT1 | 输入输出(推挽模式) | 数据线1 | 保留 | x | x |
9 | DAT2 | 输入输出(推挽模式) | 数据线2 | 保留 | x | x |
SD卡寄存器
每个SD卡内部都有8个寄存器,寄存器的介绍如下
名字 | 位数 | 描述 |
---|---|---|
CID | 128位 | 卡识别号;用来识别的卡的个体号码 |
RCA | 16位 | 相对地址;卡的本地系统地址,初始化时,动态地由卡建议,主机核准,SPI 模式不使用 |
DSR | 16位 | 驱动级寄存器;配置卡的输出驱动 |
SCR | 64位 | SD 配置寄存器;SD 卡的特殊能力信息 |
CSD | 128 | 卡的具体数据;卡的操作条件信息 |
OCR | 32位 | 操作条件寄存器 |
SSR | 512 | SD 状态;卡专有特征的信息 |
CSR | 32 | 卡状态;卡状态信息 |
SD卡内部结构
下图为SD卡的内部结构,其结构主要可以分成以下5部分
- 外部接口(1):外部接口是用户实际能看到的结构,在SD卡的背面,其作用是将内部的管脚引出来,与设备进行连接。
- 寄存器(2):SD卡内部的寄存器组,SD卡的信息,地址、初始化操作都需要通过读写SD卡的寄存器完成。
- SD卡接口控制器(3):SD卡内部的控制器,主要是处理用户的发下来命令、数据以及给用户返回SD卡的一些状态,可以理解成一个封装在SD卡内部的MCU。
- 存储器接口(4):SD卡内部的存储器接口芯片,作用是管理SD卡的存储阵列。
- 存储阵列:SD卡的数据存储都放在存储阵列中,SDHC的SD卡每个存储阵列大小为512字节。
SDIO总线
SDIO总线拓扑
一个SDIO控制器上运行连接多个SD卡设备,此时SDIO控制器相当于是主机,SD卡相当于是从机。在SD卡初始化的过程中,SD卡会给主机返回一个地址(RCA),这个地址就是代表该SD卡的在系统中的唯一编号,可以理解成I2C协议中的从设备地址。
SDIO总线协议
SDIO协议的基本结构
SDIO总线协议是基于命令和数据流,在开始传输数据之前会有一个起始位,通常为0,结束时有一个停止位,通常为1.
- 命令(Command):命令是主机发送给SD卡,通过CMD信号线进行传输,其作用向SD卡发起一个操作。
- 响应((Response):响应是SD卡给主机,也是通过CMD线进行传输,作为收到命令后的操作,有些命令可以没有响应。
- 数据((Data):数据的传输是双向的,通过数据线进行传输。
- 没有响应的命令(1):对于没有响应的命令来说,主机只需要往CMD信号线上传输命令即可,不需要等待接收SD卡的响应。
- 有响应的命令(2):对于有响应的命令,主机在CMD线上传输完命令之后,需要等待接收SD卡返回的响应,也是在CMD线上接收响应。
SDIO协议数据传输
SD卡的数据传输都是以块为单位进行传输,SDHC容量的SD卡,每个块大小为512字节。
数据块的后面需要一个CRC来保证数据的准确性,CRC由SD卡或者SDIO硬件自动产生,在数据写入时需要检查busy信号,因为数据写入到SD卡的存储阵列需要时间。多块数据的写入还需要主机给从机发送停止命令让SD卡停止接收数据,SD卡的读操作类似。
SDIO协议命令与响应的结构
命令结构
- 每一个命令的开始都要发送一个起始位,起始位的电平为低电平。
- 每一个命令会都会接一个传输位,通常为1,代表主机发送命令。
- CMD命令带参数传输,其参数位数为32位
- 每个CMD都会一个7位的CRC校验码,保证命令的传输没有错误。
- 结束时发送一个结束位,结束位电平为高电平。
- 命令的总长度为48位。
命令格式:起始位(1bit)+传输位(1bit)+参数(32bit)+CRC(7bit)+停止位(1bit)
响应结构
SD卡的响应分为两种,分别是短响应(48bit)和长响应(136bit)
短响应
- 每一个短响应发送一个起始位,起始位的电平为低电平。
- 每一个短响应都会接一个传输位,通常为0,代表响应。
- 接着是45位的响应数据,CRC(7bit)包含在响应数据里面
- 结束时发送一个结束位,结束位电平为高电平。
- 短响应的总长度为48位。
短响应格式:起始位(1bit)+传输位(1bit)+响应数据(45bit)+停止位(1bit)
长响应
- 每一个长响应发送一个起始位,起始位的电平为低电平。
- 每一个长响应都会接一个传输位,通常为0,代表响应。
- 接着是133位的响应数据,CRC(7bit)包含在响应数据里面
- 结束时发送一个结束位,结束位电平为高电平。
- 长响应的总长度为136位。
短响应格式:起始位(1bit)+传输位(1bit)+响应数据(133bit)+停止位(1bit)
SDIO数据包格式
SDIO协议的数据包有两种格式,分别是常规数据包格式(8bit 宽)和宽位数据包格式
常规数据包格式(8bit 宽)
常规数据包格式又可以分为两种,分别是1线和4线模式
1线模式
- 在数据发送前,需要发送一个起始位,低电平有效
- 将数据按照8bit的格式一个一个在DATA0数据线上发送出去
- 当所有数据传输完成后,需要发送一个CRC校验码,保证数据准确
- 最后发送一个停止位,高电平有效
4线模式
- 在数据发送前,需要发送一个起始位,低电平有效
- 当发送一个字节时,需要将字节的高4位先发送,最后再发送字节的低4位。字节的发送按照DATA3:bit7 bit3,DATA2:bit6 bit2,DATA1:bit5 bit1,DATA0:bit4 bit0的格式进行发送
- 当所有数据传输完成后,每根数据线上需要发送一个CRC校验码,保证数据准确
- 最后发送一个停止位,高电平有效。
宽位数据包格式
宽位数据包格式也可以分为两种,分别是1线和4线模式。其特点跟常规数据包模式类似。
1线模式
- 在数据发送前,需要发送一个起始位,低电平有效
- 将数据按照高位在前,低位在后的格式在DATA0数据线上发送出去
- 当所有数据传输完成后,需要发送一个CRC校验码,保证数据准确
- 最后发送一个停止位,高电平有效
4线模式
- 在数据发送前,需要发送一个起始位,低电平有效
- 按照高4位在前,低4位在后的格式依次在数据线上发送
- 当所有数据传输完成后,每根数据线上需要发送一个CRC校验码,保证数据准确
- 最后发送一个停止位,高电平有效。