2. SD卡协议基础:物理层、命令格式、响应格式、SPI模式与SD模式的区别

SD卡协议是嵌入式系统中广泛使用的存储接口协议。理解其物理层特性、命令/响应格式以及两种工作模式(SPI与SD)的差异,是后续在QEMU中模拟SD卡控制器的基础。本节将从物理层信号定义开始,逐步深入到协议层的交互细节。

2.1 物理层信号与总线拓扑

SD卡物理接口包含电源、地、时钟和数据线。根据工作模式不同,使用的信号线数量有所差异。下表列出了SD卡物理接口的关键信号及其在两种模式下的映射关系:

引脚编号SD模式名称SPI模式名称功能描述
1CD/DAT3CS卡检测/数据线3(SD模式);片选信号(SPI模式)
2CMDDI命令/响应线(SD模式);主机到卡的数据输入(SPI模式)
3VSS1VSS1电源地
4VDDVDD电源正极(2.7V–3.6V)
5CLKSCLK时钟信号
6VSS2VSS2电源地
7DAT0DO数据线0(SD模式);卡到主机的数据输出(SPI模式)
8DAT1RSV数据线1(SD模式);保留(SPI模式)
9DAT2RSV数据线2(SD模式);保留(SPI模式)
关键理解:SD模式使用4位并行数据总线(DAT0–DAT3)实现高吞吐量;SPI模式仅使用单条数据线(DO)输出,牺牲速度换取与标准SPI控制器的兼容性。在QEMU模拟中,SPI模式通常更容易实现,因为许多嵌入式SoC内置SPI控制器。

下图展示了SD卡在SD模式下的物理连接拓扑,包含主机控制器、时钟线、命令线和4条数据线:

SD模式物理连接拓扑 主机控制器 SD卡 CLK(时钟) CMD(命令/响应) DAT0–DAT3(4位数据) SD模式特点 • 4位并行数据总线,理论传输速率是SPI模式的4倍 • 命令和响应共用CMD线,通过方向控制实现半双工 • 需要专用SD主机控制器,不支持通用SPI接口

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_STATECMD00x00000000R1复位卡到空闲状态
SEND_OP_CONDCMD1OCR寄存器R3查询/设置工作电压范围
ALL_SEND_CIDCMD20x00000000R2获取所有卡的CID(卡识别号)
SEND_RELATIVE_ADDRCMD30x00000000R6分配相对卡地址(RCA)
SELECT_DESELECT_CARDCMD7RCAR1b选中/取消选中指定卡
READ_SINGLE_BLOCKCMD17块地址R1读取单个数据块(默认512字节)
WRITE_SINGLE_BLOCKCMD24块地址R1写入单个数据块
模拟要点:在QEMU中实现SD卡控制器时,命令解析器需要正确处理48位命令帧的CRC校验。虽然实际硬件会校验CRC,但许多QEMU模拟实现为了简化性能,会跳过CRC校验或使用固定CRC值。这在功能验证阶段是可以接受的,但需要注意与真实硬件的差异。

2.3 响应格式与类型

SD卡协议定义了多种响应类型(R1–R7),每种响应具有不同的长度和含义。响应通过CMD线由卡发送给主机。最常见的响应类型如下:

响应类型长度包含字段典型用途
R148位状态标志(卡状态寄存器)大多数命令的标准响应
R1b48位 + 忙信号状态标志 + 忙检测写操作等需要等待卡忙的命令
R2136位CID或CSD寄存器内容CMD2、CMD9、CMD10
R348位OCR寄存器内容CMD1(查询工作电压)
R648位RCA + 状态标志CMD3(分配相对地址)
R748位电压范围 + 回显模式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 + CMD3CMD0 + CMD1(或ACMD41)
硬件要求专用SD主机控制器标准SPI控制器
典型应用高性能存储(相机、手机)嵌入式系统、低引脚数MCU

下图展示了SPI模式下SD卡的信号连接方式,相比SD模式,SPI模式减少了数据线数量并增加了片选信号:

SPI模式物理连接拓扑 SPI主机 SD卡 SCLK(时钟) CS(片选) DI(主机→卡数据) DO(卡→主机数据) SPI模式特点 • 使用标准SPI协议,兼容大多数MCU的SPI外设 • 全双工通信,DI和DO可同时传输数据

2.5 初始化流程对比

SD卡上电后需要经过初始化流程才能进入数据传输状态。两种模式的初始化流程存在显著差异:

常见陷阱:在SPI模式下,初始化时必须先将CS拉低(选中卡),然后发送至少74个时钟周期的同步序列(SCLK保持高电平),再发送CMD0进入SPI模式。如果省略同步序列,卡可能无法正确识别SPI模式切换命令。

SD模式初始化流程:

  1. 上电后卡默认进入空闲状态(IDLE)
  2. 主机发送CMD0(GO_IDLE_STATE)复位卡
  3. 主机发送CMD8(SEND_IF_COND)检查接口条件(电压范围)
  4. 主机发送ACMD41(SD_SEND_OP_COND)查询卡工作电压并启动初始化
  5. 卡返回OCR寄存器,指示电压兼容性和初始化完成状态
  6. 主机发送CMD2(ALL_SEND_CID)获取卡识别号
  7. 主机发送CMD3(SEND_RELATIVE_ADDR)分配相对地址(RCA)
  8. 主机发送CMD7(SELECT_DESELECT_CARD)选中卡,进入传输状态

SPI模式初始化流程:

  1. 上电后卡默认进入空闲状态
  2. 主机发送至少74个时钟周期的同步序列
  3. 主机发送CMD0 + 参数0x00000000 + 有效CRC(0x95)进入SPI模式
  4. 主机发送CMD8检查接口条件(SPI模式下必须支持)
  5. 主机发送CMD1(或ACMD41)查询OCR并等待初始化完成
  6. 初始化完成后,卡进入数据传输状态(Data Transfer State)

2.6 数据块传输机制

无论SPI模式还是SD模式,数据块传输都遵循类似的结构。以读取单块数据(CMD17)为例:

读单块操作时序(SPI模式):
主机发送: CMD17 + 块地址 + CRC
卡响应:   R1响应(0x00表示成功)
卡发送:   数据起始令牌(0xFE)
卡发送:   512字节数据块
卡发送:   2字节CRC16校验

数据起始令牌(0xFE)是SPI模式下数据块传输的同步标志。SD模式则使用不同的数据线协议,通过DAT0线上的数据有效信号来指示数据开始。

QEMU模拟实现提示:在实现SD卡控制器模拟时,建议先实现SPI模式,因为其协议更简单、调试更容易。SPI模式下,命令和响应都是字节流,可以通过标准SPI接口函数直接处理。SD模式需要实现更复杂的位级协议和4位数据总线切换逻辑。

下表总结了数据块传输的关键参数:

参数SD模式SPI模式
块大小(默认)512字节512字节
数据起始指示DAT0线数据有效信号数据起始令牌(0xFE)
CRC校验16位CRC(硬件强制)16位CRC(可选,默认启用)
忙检测DAT0线拉低表示忙DO线拉低表示忙
多块传输CMD18/CMD25支持自动多块CMD18/CMD25支持自动多块