SDIO协议深度解析:从硬结构到数据读写优化 SD卡​

SDIO (Secure Digital input and output),安全数字输入输出接口是一种扩展SD卡接口的协议,他不仅支持传统的存储功能,还允许通过SD卡槽连接多种外设设备。可以控制MMC,SD卡,SD i/o卡。
卡时钟(SDIO_CK)每个时钟周期在命令和数据线上传输一位命令或数据。时钟频率可以在0Mhz-25Mhz.
SDIO适配器时钟(SDIOCLK):该市镇用于驱动SDIO适配器,可用于产生SDIO_CK时钟。SDIOCLK来自PLL(48Mhz)
SDIO_CK计算方式:SDIO_CK = SDIOCLK/(2+CLKDIV)
在初始化时,SDIO_CK不可以超过400Khz,初始化完成后,可以设置为最大频率。(不可超过SD卡最大频率)

1.SD卡硬件结构

SD卡:1-data3,2-cmd,3-vss,4-vdd,5-clk,6-vss,7-data0,8=data1,9-data2
TF卡(SD模式):1-data2,2-data3,3-cmd,4-vdd,5-clk,6-vss,7-data0,8-data1
TF卡(SPI模式):1-rsv,2-cs,3-di,4-vdd,5-sclk,6-vss,7-do,8-rsv
1张SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器5个部分,见图 SD卡物理结构
SD卡总共有8个寄存器,用于设定或表示SD卡信息,参考下表,这些寄存器只能通过对应的命令访问, 对SD卡进行控制操作并不是像操作控制器GPIO相关寄存器那样一次读写一个寄存器的,它是通过命令来控制, SDIO定义了64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后, 根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。

1.1.身份识别类寄存器

CID

128bit:卡唯一身份证:包含厂商ID、产品名称、序列号、生产日期等, 这个 CID 寄存器有 16 字节长,如下表所示,它包含了本卡的特别识别码(ID 号)。 这些信息是在卡的生产期间被编程(烧录),主控制器不能修改它们的内容。

RCA

16bit:动态临时地址:初始化由卡随机生成,主机核准后用于多卡系统中快速寻址。
主机通过CMD2读取CID区分不同卡,通过CMD3分配RCA实现多卡切换(CMD7+RCA选中某张卡)

1.2.配置与状态类寄存器

CSD:

128 bit 卡能力说明书:定义容量,块大小,读写速度,擦除超时等操作参数。此寄存器包含了访问该卡数据时的必要配置信息。

SCR:

64bit SD卡专属配置:支持的命令集(总线宽度)

OCR:

32bit 电压与状态窗口:Bit 31= 1卡初始化完成,bit[23:0]显示支持的电压范围
初始化CMD9读取CSD卡容量
通过ACMD51读取SCR确认是否支持4线模式

1.3.实时状态类寄存器

SSR

512bit SD卡实时状态(包含写保护状态,当前总线宽度,速度模式等)

CSR

32 bit 命令执行反馈:记录最近命令的错误码(CRC失败,地址超限),通过CMD13读取
  • 写数据前检查SSR的写保护位(WP_VIOLATION),避免写入被保护的卡。
  • 命令失败时读取CSR定位问题(如OUT_OF_RANGE表示地址无效)

1.4.驱动控制寄存器

DSR

16bit 信号驱动强度:调节卡输出信号的驱动电流
通过CMD4配置DSR优化长距离或高干扰环境下的通信稳定性。

2.SDIO命令

SDIO总线都是HOST端发起请求,Device端回应请求,其中请求和回应种会包含数据信息:
Command:用于开始传输的命令,由Host端发往Device端的,其中命令由CMD信号线传送的;
Response:回应是Device 返回的HOST命令作为Command 的回应,也是通过CMD 线传送的;
DATA:数据是双向的传送的,可以设置1线模式,4线模式,数据通过DATA0-DATA3 信号线传输。
SDIO协议,其中包含“无数据传输的一般命令”,“有数据传输的写命令”,“有数据传输的读命令”。

2.1.无数据传输的一般命令

主机发送命令到卡在CMD线上,设备响应主机响应数据也在CMD线上。

2.2 有数据传输的写命令

写数据的传输是分块进行的。数据块后面总是跟着CRC位。定义了单块和多块操作。多块操作模式更适合更快的写入操作。当CMD线路上出现停止命令时,多块传输终止。主机可以将数据传输配置为使用单条或多条数据线
SDIO 数据块写操作
SDIO连续写操作

2.3.有数据传输的读命令

SDIO数据块读操作
当有Busy(繁忙)信号时, SDIO(SDIO_D0被拉低)将不会发送任何数据。
SDIO连续读操作:

3.SDIO功能描述

SDIO包含2个部分:

3.1SDIO适配器模块

:实现所有MMC/SD/SD I/O卡的相关功能,如时钟的产生、命令和数据的传送。
AHB总线接口:操作SDIO适配器模块中的寄存器,并产生中断和DMA请求信号。
复位后默认情况下SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度。
SDIO_D0 单独使用:单线模式(兼容SPI模式,贷款最低)。
SDIO_D[3:0]四线使用:4位并行模式(SDIO协议标准,带宽提升4倍)。
SDIO适配器是多媒体/加密数字存储卡总线的主设备,用于连接一组多媒体卡或加密数字存储卡,包含以下5个部分:
适配器寄存器模块
3.1.1 控制单元
包含电源管理功能和为存储器卡提供的时钟分频。共有三种电源阶段:电源关闭,电源启动,电源开,时钟管理子单元产生和控制SDIO_CK信号。 SDIO_CK输出可以使用时钟分频或时钟旁路模式。电源关闭和电源启动阶段,电源管理子单元会关闭卡总线上的输出信号。
3.1.2 命令通道
命令通道单元向卡发送命令并从卡接收响应。当写入命令寄存器并设置了使能位,开始发送命令。命令发送完成时,命令通道状态机(CPSM)设置状态标志并在不需要响应时进入空闲状态(见下图)。当收到响应后,接收到的CRC码将会与内部产生的CRC码比较,然后设置相应的状态标志
在时钟控制寄存器中可以配置卡的数据总线宽度。如果选择了 4位总线模式,则每个时钟周期四条数据信号线(SDIO_D[3:0])上将传输4位数据;如果选择了 8位总线模式,则每个时钟周期八条数据信号线(SDIO_D[7:0])上将传输8位数据;如果没有选择宽总线模式,则每个时钟周期只在SDIO_D0上传输 1位数据。
发送: DPSM进入Wait_S状态。如果发送FIFO中有数据,则DPSM进入发送状态,同时数据通道子单元开始向卡发送数据。
接收: DPSM进入Wait_R状态并等待开始位;当收到开始位时, DPSM进入接收状态,同时数据通道子单元开始从卡接收数据。
数据通道状态机(DPSM)
DPSM工作在SDIO_CK频率,卡总线信号与SDIO_CK的上升沿同步。 DPSM有6个状态
数据FIFO
适配器寄存器和FIFO使用AHB总线一侧的时钟(HCLK/2),控制单元、命令通道和数据通道使用SDIO适配器一侧的时钟(SDIOCLK)。
3.1.3 数据通道
数据通道子单元在主机与卡之间传输数据。下图是数据通道的框图。

4.命令格式

SD命令是一个6字节组成的命令包
起始位(1bit):固定为0 标志帧开始,同步时钟
传输标志(1bit):指示数据传输方向(1:主机发送命令,0:卡返回响应)
命令+地址(6+32位): Command Index (6bit) + Argument (32bit)  Command Index:如CMD0(0x00)复位、CMD17(0x11)读单块,Argument:地址或参数(如扇区号)。
​CRC7校验(7位)​ CRC7校验码
​终止位(1,1位)​: 标志帧结束。
命令:命令是用于开始一项操作,主机向一个指定的卡或所有的卡发出带地址的命令或广播命令(广播命令知识和在MMC V3.31或之前的版本)。命令在CMD线上串行传送。所有命令的长度固定48位。
响应:响应是由一个被指定地址的卡发送到主机(对于MMCV3.31以前的卡同时发送响应;响应是对先前接受的命令的一个应答)
SDIO支持两种响应类型,都有CRC错误检测
短响应
长响应格式
响应数据:

6.SD卡的操作模式

SD卡系统(包括主机和SD卡)定义了两种操作模式:卡识别模式和数据传输模式。在系统复位后,主机处于卡识别模式, 寻找总线上可用的SDIO设备;同时,SD卡也处于卡识别模式,直到被主机识别到,即当SD卡接收到SEND_RCA(CMD3)命令后, SD卡就会进入数据传输模式,而主机在总线上所有卡被识别后也进入数据传输模式。

6.1 卡识别模式

在卡识别模式下,主机会复位所有处于“卡识别模式”的SD卡,确认其工作电压范围,识别SD卡类型, 并且获取SD卡的相对地址(卡相对地址较短,便于寻址)。在卡识别过程中,要求SD卡工作在识别时钟频率FOD的状态下
SD卡初始化阶段:

6.1.1. CMD0 go_idle_status

发送  CMD0 (0x00000000) ,强制卡进入空闲状态

6.1.2.CMD8 send_if_cond

发送  CMD8 (0x000001AA) ,参数包含支持的电压范围(
有效响应为  R7 ,包含电压信息
主机发送的指令帧
start : 通信帧起始标志
​DIR​:Host 方向标识,表示当前帧由主机
cmd:SEND_IF_COND 指令码CMD8的别名,用于检测卡支持的电压范围(2.7-3.6V)和协议版本。
ARG:0x000001AA • Bit[7:0] = 0xAA(检查模式,卡需原样返回此值)
• Bit[11:8] = 0x1(请求2.7-3.6V电压)。
CRC:0x43
End
从机的响应帧:
​Start D​​:响应起始位(对应表格中的起始位=0)。
  • ​R7 - 8​​:可能表示R7响应的数据长度(8字节)或信号分段。
  • ​ARG::0x000001AA​​:
    • 对应表格中的接收电压([19:16])和检测模式([15:8])字段,具体值需转换为二进制分析。
    • 包含设备支持的电压和回显校验值:
0x1AA  →  000110101010
0001 ([11:8]):电压范围(2.7-3.6V)
10101010 ([7:0]):回显主机的检查模式(固定值 0xAA
  • ​CRC:0x09:响应数据的CRC校验值(对应表格中的CRC7字段)。
  • ​E​​:终止位(对应表格中的终止位=1)

6.1.3. AMD 0x55 app_cmd

主机发送的指令帧
从机的响应帧:
​​状态验证(R1响应)​​: ARG:0x00000120 的二进制 0000000000000000000100100000 中: ​​bit8=1​​:设备