以下是SD NAND在 SDIO模式 下的读写时序详解。与SPI模式不同,SDIO模式基于SD协议原生接口,支持更高的传输速率(4位或8位数据总线)和更复杂的命令交互。
CLK(时钟):主机提供时钟,频率可动态调整(初始化阶段通常较低,如400kHz,初始化后可升至50MHz+)。
CMD(命令线):双向传输,用于发送命令和接收响应。
DAT0-DAT3(数据线):4位数据总线(支持1位或4位模式),传输数据块。
VDD/VSS:电源与地线。
主机与SD NAND直接连接,支持多设备共享总线(通过设备地址区分,但SD NAND通常为单设备)。
数据在时钟上升沿采样(SD协议默认)。
SD卡在SDIO模式下需完成以下初始化步骤:
上电后,主机保持 CMD 和 DAT 线为高电平,并发送时钟(CLK)至少 74个周期。
CMD0(GO_IDLE_STATE):
发送 CMD0 (0x00000000)
,强制卡进入空闲状态(响应类型 R1,期望值 0x01
)。
发送 CMD8 (0x000001AA)
,参数包含支持的电压范围(如2.7-3.6V)。
有效响应为 R7,包含电压信息(若卡不支持CMD8,可能为旧版本卡)。
CMD55(APP_CMD):
通知卡后续命令为应用特定命令(ACMD)。
ACMD41(SD_SEND_OP_COND):
发送 ACMD41 (0x40FF8000)
,参数中的 HCS
位(第30位)设置为1以支持高容量卡(SDHC/SDXC)。
持续发送 CMD55 + ACMD41
直到响应 R1=0x00(初始化完成)。
CMD2(ALL_SEND_CID):获取卡唯一CID寄存器(响应类型 R2)。
CMD3(SEND_RELATIVE_ADDR):获取卡相对地址 RCA(响应类型 R6)。
CMD9(SEND_CSD):获取卡CSD寄存器(容量、时序参数等)。
发送 CMD7 [RCA]
,选中卡并进入传输状态(响应 R1b,可能伴随忙状态)。
命令格式:CMD17 [LBA地址]
(32位地址,SDHC/SDXC需直接使用块地址)。
期望响应 R1=0x00(无错误)。
数据包格式:
起始令牌:0xFE
(单块读)或 0xFC
(多块读)。
数据块:512字节(默认)或 CSD中定义的大小。
CRC16:2字节校验(可配置是否校验)。
Host: CMD17 -> [Command] [LBA] [CRC7] Card: R1(0x00) -> [Start Token 0xFE] [512B Data] [CRC16]
命令格式:CMD24 [LBA地址]
,响应 R1=0x00。
数据包格式:
起始令牌:0xFE
(单块写)或 0xFC
(多块写)。
数据块:512字节。
CRC16:2字节校验。
Data Response Token:
格式为 0bXXX0_0101
(第1-3位为状态,0x05
表示数据被接受)。
卡通过 DAT0 线拉低表示忙状态,主机需等待直到 DAT0 恢复高电平。
Host: CMD24 -> [Command] [LBA] [CRC7] Card: R1(0x00) Host: [Start Token 0xFE] [512B Data] [CRC16] Card: Data Response Token (0x05)
命令超时:
命令响应超时通常为 64个CLK周期。
数据超时:
读操作等待起始令牌超时:100ms。
写操作忙状态超时:250ms。
时钟频率:
初始化阶段:≤400kHz;初始化后可达 25MHz-50MHz(根据卡支持能力)。
总线宽度切换:
默认1位模式,可通过 CMD55 + ACMD6 切换至4位模式(设置 DAT_BUS_WIDTH
位)。
高容量卡(SDHC/SDXC):
地址单位为块(LBA),而非字节。
多块操作:
读多块使用 CMD18,写多块使用 CMD25,需用 CMD12 终止传输。
错误处理:
若收到错误响应(如 R1=0x04
),需检查地址范围、CRC或重新初始化。
特性 | SDIO模式 | SPI模式 |
---|---|---|
数据总线宽度 | 1/4/8位 | 1位(MOSI/MISO) |
时钟速率 | 更高(可达50MHz+) | 较低(通常≤25MHz) |
协议复杂度 | 复杂(需处理多线同步) | 简单(单线输入/输出) |
应用场景 | 高性能嵌入式系统 | 资源受限的低速设备 |
通过上述流程和参数配置,可实现SD NAND在SDIO模式下的高速读写操作。建议结合具体芯片手册和SD物理层规范(如《SD Specifications, Physical Layer Simplified Specification》)验证细节。
下一篇:没有了!