sd协议的大致通信过程
SD(Secure Digital)协议是用于存储卡与主机设备(如手机、相机、嵌入式系统)通信的标准协议,其过程涉及物理层、命令响应机制和数据传输。以下是SD协议的核心流程概述:
- 初始化阶段:设备识别与电压配置
- 步骤1:上电与时钟同步
主机上电后,向SD卡发送初始时钟信号(通常为低速模式,如400kHz),同时保持CMD和DAT线处于高电平(空闲状态)。 - 步骤2:发送CMD0(GO_IDLE_STATE)
主机通过CMD线发送CMD0命令(复位指令),强制SD卡进入空闲状态(Idle State),此时DAT线未激活。 - 步骤3:电压检测(CMD8)
主机发送CMD8命令,附带电压参数(如2.7-3.6V),SD卡返回响应确认支持的电压范围。若卡不支持,主机需调整电压或终止通信。 - 步骤4:初始化流程(CMD55+ACMD41)
- 主机发送CMD55(APP_CMD),通知SD卡后续命令为应用特定命令。
- 接着发送ACMD41(SD_SEND_OP_COND),携带主机支持的工作电压和容量类型(标准容量SDSC或高容量SDHC/SDXC)。
- SD卡返回OCR(Operating Conditions Register)寄存器值,确认就绪状态。
- 卡识别模式(Card Identification Mode)
- 步骤5:分配相对地址(CMD2、CMD3)
- 主机发送CMD2(ALL_SEND_CID),要求所有未初始化的SD卡发送唯一的CID(Card Identification Number)。
- 主机通过CMD3(SEND_RELATIVE_ADDR)为SD卡分配一个相对地址(RCA),用于后续通信(多卡系统中区分不同卡)。
- 数据传输模式(Data Transfer Mode)
- 步骤6:切换至数据传输状态(CMD7)
主机发送CMD7(SELECT/DESELECT_CARD),附带RCA地址,激活目标SD卡,使其进入传输状态(Transfer State),DAT线激活。 - 步骤7:读取/写入数据块
- 读操作(CMD17/CMD18)
- CMD17(READ_SINGLE_BLOCK):读取单个数据块(默认512字节)。
- CMD18(READ_MULTIPLE_BLOCK):连续读取多个块,直到主机发送CMD12(STOP_TRANSMISSION)终止。
- 写操作(CMD24/CMD25)
- CMD24(WRITE_BLOCK):写入单个块。
- CMD25(WRITE_MULTIPLE_BLOCK):连续写入多个块,结束时需发送CMD12。
- 数据传输流程:
- 主机发送读/写命令(附带起始地址)。
- SD卡返回响应(R1状态),确认命令有效。
- 数据通过DAT线传输,每个数据块附加CRC校验码。
- 主机验证CRC,若错误则重传。
- 读操作(CMD17/CMD18)
- 协议层关键机制
- 命令与响应格式
- 命令(CMD):6字节结构,包括命令号、参数、CRC7。
- 响应(RSP):长度可变(如R1为1字节状态 + 3字节附加信息),包含操作状态或错误码。
- 总线拓扑
- SD总线模式:支持1位或4位DAT线(高速模式)。
- SPI模式:兼容SPI接口,但性能较低(CMD、DAT线复用)。
- 错误处理
- CRC校验失败、超时、非法命令等会触发错误状态(通过RSP返回)。
- 主机可通过CMD13(SEND_STATUS)查询卡状态。
- 高级功能(可选)
- 高速模式切换(CMD6)
主机发送CMD6(SWITCH_FUNC)切换总线速度、块大小或驱动强度。 - 擦除操作(CMD32-38)
指定地址范围后,通过CMD38(ERASE)擦除数据。 - 安全协议(CMD42)
用于加密数据传输(如SDSC卡的安全功能)。
协议流程图精简版
上电 → CMD0复位 → CMD8电压检测 → CMD55+ACMD41初始化 → CMD2获取CID → CMD3分配RCA
→ CMD7进入传输模式 → 读写操作(CMD17/18/24/25) → 数据块传输(CRC校验) → 终止(CMD12)
总结
SD协议通过分层命令交互和CRC校验机制实现可靠通信,核心流程包括初始化、卡识别、数据传输三个阶段。其设计兼容多种存储容量(SDSC/SDHC/SDXC)和总线模式(SD/SPI),广泛应用于嵌入式存储场景。