2. SD卡协议基础:物理层、命令格式、响应格式、SPI模式与SD模式的区别
SD卡协议是嵌入式系统中广泛使用的存储接口协议。理解其物理层特性、命令/响应格式以及两种工作模式(SPI与SD)的差异,是后续在QEMU中模拟SD卡控制器的基础。本节将从物理层信号定义开始,逐步深入到协议层的交互细节。
2.1 物理层信号与总线拓扑
SD卡物理接口包含电源、地、时钟和数据线。根据工作模式不同,使用的信号线数量有所差异。下表列出了SD卡物理接口的关键信号及其在两种模式下的映射关系:
| 引脚编号 | SD模式名称 | SPI模式名称 | 功能描述 |
|---|---|---|---|
| 1 | CD/DAT3 | CS | 卡检测/数据线3(SD模式);片选信号(SPI模式) |
| 2 | CMD | DI | 命令/响应线(SD模式);主机到卡的数据输入(SPI模式) |
| 3 | VSS1 | VSS1 | 电源地 |
| 4 | VDD | VDD | 电源正极(2.7V–3.6V) |
| 5 | CLK | SCLK | 时钟信号 |
| 6 | VSS2 | VSS2 | 电源地 |
| 7 | DAT0 | DO | 数据线0(SD模式);卡到主机的数据输出(SPI模式) |
| 8 | DAT1 | RSV | 数据线1(SD模式);保留(SPI模式) |
| 9 | DAT2 | RSV | 数据线2(SD模式);保留(SPI模式) |
下图展示了SD卡在SD模式下的物理连接拓扑,包含主机控制器、时钟线、命令线和4条数据线:
2.2 命令格式与分类
SD卡协议中,所有通信由主机发起。主机通过CMD线发送48位命令帧,卡在接收到命令后返回响应。命令帧的格式固定,由6个字节组成:
命令帧格式(48位):
+--------+--------+--------+--------+--------+--------+
| 位47–46 | 位45–40 | 位39–8 | 位7–1 | 位0 |
+--------+--------+--------+--------+--------+--------+
| 起始位 | 传输位 | 命令索引 | 参数 | CRC7 | 结束位 |
| 01 | 1 | 6位 | 32位 | 7位 | 1 |
+--------+--------+--------+--------+--------+--------+
命令索引(CMD0–CMD63)定义了操作类型。下表列出了SD卡初始化阶段最常用的基本命令:
| 命令 | 索引 | 参数 | 响应类型 | 功能描述 |
|---|---|---|---|---|
| GO_IDLE_STATE | CMD0 | 0x00000000 | R1 | 复位卡到空闲状态 |
| SEND_OP_COND | CMD1 | OCR寄存器 | R3 | 查询/设置工作电压范围 |
| ALL_SEND_CID | CMD2 | 0x00000000 | R2 | 获取所有卡的CID(卡识别号) |
| SEND_RELATIVE_ADDR | CMD3 | 0x00000000 | R6 | 分配相对卡地址(RCA) |
| SELECT_DESELECT_CARD | CMD7 | RCA | R1b | 选中/取消选中指定卡 |
| READ_SINGLE_BLOCK | CMD17 | 块地址 | R1 | 读取单个数据块(默认512字节) |
| WRITE_SINGLE_BLOCK | CMD24 | 块地址 | R1 | 写入单个数据块 |
2.3 响应格式与类型
SD卡协议定义了多种响应类型(R1–R7),每种响应具有不同的长度和含义。响应通过CMD线由卡发送给主机。最常见的响应类型如下:
| 响应类型 | 长度 | 包含字段 | 典型用途 |
|---|---|---|---|
| R1 | 48位 | 状态标志(卡状态寄存器) | 大多数命令的标准响应 |
| R1b | 48位 + 忙信号 | 状态标志 + 忙检测 | 写操作等需要等待卡忙的命令 |
| R2 | 136位 | CID或CSD寄存器内容 | CMD2、CMD9、CMD10 |
| R3 | 48位 | OCR寄存器内容 | CMD1(查询工作电压) |
| R6 | 48位 | RCA + 状态标志 | CMD3(分配相对地址) |
| R7 | 48位 | 电压范围 + 回显模式 | CMD8(接口条件检查) |
R1响应是最常用的响应格式,其48位帧结构与命令帧类似,但传输位为0(表示卡到主机方向):
R1响应格式(48位):
+--------+--------+--------+--------+--------+--------+
| 位47–46 | 位45–40 | 位39–8 | 位7–1 | 位0 |
+--------+--------+--------+--------+--------+--------+
| 起始位 | 传输位 | 保留 | 卡状态 | CRC7 | 结束位 |
| 01 | 0 | 全0 | 32位 | 7位 | 1 |
+--------+--------+--------+--------+--------+--------+
卡状态寄存器(32位)中的关键标志位包括:
- 位31:IDLE_STATE — 卡处于空闲状态
- 位30:ERASE_RESET — 擦除复位
- 位29:ILLEGAL_COMMAND — 非法命令
- 位28:COM_CRC_ERROR — 命令CRC错误
- 位27:ERASE_SEQ_ERROR — 擦除序列错误
- 位26:ADDRESS_ERROR — 地址错误
- 位25:PARAMETER_ERROR — 参数错误
2.4 SPI模式与SD模式的核心区别
SPI模式和SD模式是SD卡支持的两种通信协议。SPI模式通过标准SPI接口访问SD卡,而SD模式需要专用的SD主机控制器。下表从多个维度对比两种模式:
| 对比维度 | SD模式 | SPI模式 |
|---|---|---|
| 数据总线宽度 | 1位(CMD)或4位(DAT0–DAT3) | 1位(DI/DO) |
| 最大时钟频率 | 0–208 MHz(UHS-II可达更高) | 0–25 MHz(典型值) |
| 通信方式 | 半双工(CMD线) + 全双工(数据线) | 全双工(SPI标准) |
| 片选信号 | 无独立片选,通过命令寻址 | 独立CS片选线 |
| 命令/响应格式 | 48位帧,带CRC7校验 | 命令帧 + 响应字节流,CRC可选 |
| 初始化流程 | 需要CMD0 + ACMD41 + CMD2 + CMD3 | CMD0 + CMD1(或ACMD41) |
| 硬件要求 | 专用SD主机控制器 | 标准SPI控制器 |
| 典型应用 | 高性能存储(相机、手机) | 嵌入式系统、低引脚数MCU |
下图展示了SPI模式下SD卡的信号连接方式,相比SD模式,SPI模式减少了数据线数量并增加了片选信号:
2.5 初始化流程对比
SD卡上电后需要经过初始化流程才能进入数据传输状态。两种模式的初始化流程存在显著差异:
SD模式初始化流程:
- 上电后卡默认进入空闲状态(IDLE)
- 主机发送CMD0(GO_IDLE_STATE)复位卡
- 主机发送CMD8(SEND_IF_COND)检查接口条件(电压范围)
- 主机发送ACMD41(SD_SEND_OP_COND)查询卡工作电压并启动初始化
- 卡返回OCR寄存器,指示电压兼容性和初始化完成状态
- 主机发送CMD2(ALL_SEND_CID)获取卡识别号
- 主机发送CMD3(SEND_RELATIVE_ADDR)分配相对地址(RCA)
- 主机发送CMD7(SELECT_DESELECT_CARD)选中卡,进入传输状态
SPI模式初始化流程:
- 上电后卡默认进入空闲状态
- 主机发送至少74个时钟周期的同步序列
- 主机发送CMD0 + 参数0x00000000 + 有效CRC(0x95)进入SPI模式
- 主机发送CMD8检查接口条件(SPI模式下必须支持)
- 主机发送CMD1(或ACMD41)查询OCR并等待初始化完成
- 初始化完成后,卡进入数据传输状态(Data Transfer State)
2.6 数据块传输机制
无论SPI模式还是SD模式,数据块传输都遵循类似的结构。以读取单块数据(CMD17)为例:
读单块操作时序(SPI模式):
主机发送: CMD17 + 块地址 + CRC
卡响应: R1响应(0x00表示成功)
卡发送: 数据起始令牌(0xFE)
卡发送: 512字节数据块
卡发送: 2字节CRC16校验
数据起始令牌(0xFE)是SPI模式下数据块传输的同步标志。SD模式则使用不同的数据线协议,通过DAT0线上的数据有效信号来指示数据开始。
下表总结了数据块传输的关键参数:
| 参数 | SD模式 | SPI模式 |
|---|---|---|
| 块大小(默认) | 512字节 | 512字节 |
| 数据起始指示 | DAT0线数据有效信号 | 数据起始令牌(0xFE) |
| CRC校验 | 16位CRC(硬件强制) | 16位CRC(可选,默认启用) |
| 忙检测 | DAT0线拉低表示忙 | DO线拉低表示忙 |
| 多块传输 | CMD18/CMD25支持自动多块 | CMD18/CMD25支持自动多块 |