SD NAND 在 SPI 模式下的操作时序图是理解其通信的关键。SPI 模式相比原生的 SD 总线模式更简单,只需要 4 根信号线(加上电源和地):
CS (Chip Select / Slave Select - SS): 主机控制,低电平有效,选择 SD 卡。
SCLK (Serial Clock - SCK): 主机产生,提供通信时钟。
MOSI (Master Out Slave In - DI): 主机发送数据到 SD 卡。
MISO (Master In Slave Out - DO): SD 卡发送数据到主机。
核心时序规则 (基于 SD Physical Layer Specification):
字节传输: 数据以字节为单位传输,高位 (MSB) 在前。
时钟极性/相位 (CPOL/CPHA): 模式 0 (CPOL=0, CPHA=0) 是强制要求的。
CPOL=0: SCLK 空闲时为低电平。
CPHA=0: 数据在 SCLK 的上升沿采样 (锁存),在下降沿切换 (改变)。
CS 作用: CS 必须在每个命令/数据块传输开始前拉低,并在传输结束后拉高。CS 为高时,MISO 应处于高阻态 (Hi-Z)。
命令结构: 所有命令都是 6 字节固定长度:
Byte 1: 01xxxxxx
(起始位 0
+ 6位命令号 xxxxxx
)
Byte 2-5: 32 位参数 (大端序 - MSB first)
Byte 6: 7 位 CRC7 + 结束位 1
(注意:在 SPI 模式下,CRC 通常可以禁用,发送 0xFF
或任意值,但初始化命令如 CMD0 的 CRC 可能是强制正确的)
响应: SD 卡在接收到命令后会发送响应。响应类型和长度取决于命令。
数据传输: 读写块数据时,有特定的起始/结束令牌和数据块结构。
关键操作时序图详解:
Host (Master) SD Card (Slave)
------- -------
CS ________________________________________/
| |
SCLK _ | _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ ...
| C1 | C2 | C3 | C4 | C5 | C6 | | R1 | ...
|<----------- Command (6 bytes) ------>| |<-- Resp. -->|
MOSI -----X- C1 -X- C2 -X- C3 -X- C4 -X- C5 -X- C6 -X- FF -X- FF -X- ... (Host sends command + dummy bytes)
| | | | | | | | | |
MISO -----X-----X-----X-----X-----X-----X-----X--R1--X-----X-----X----- ... (SD card sends response after command)
| | | | | | | | | |
SAMPLE SAMPLE ... SAMPLE SAMPLE SAMPLE SAMPLE SAMPLE ... (Host samples MISO on rising edge)
CS: 在发送命令前拉低,命令和响应传输期间保持低电平。响应结束后(或后续数据传输开始前)可以拉高(图中未完全画出)。
SCLK: 主机持续提供时钟。
MOSI (主机输出):
主机依次发送命令的 6 个字节 (C1-C6)。
命令发送完毕后,主机通常继续发送 0xFF
(MOSI=高电平) 作为哑元字节 (Dummy Bytes),为 SD 卡提供时钟以输出响应数据,同时保持 MOSI 为高(避免干扰 MISO)。
MISO (SD卡输出):
在接收命令期间,MISO 通常保持高电平 (Hi-Z 状态被上拉) 或输出无效数据。
命令发送完成后 (第 6 个字节的最后一位发送完),SD 卡开始准备响应。
响应数据 (图中是 R1,1 个字节) 在主机发送的后续 SCLK 下降沿上被 SD 卡放到 MISO 线上。
主机在 SCLK 的上升沿采样 MISO 线,获取响应字节。
R1 响应: 1 个字节,最高位 (bit7) 为 0 表示命令执行成功或状态。其他位表示错误或状态标志 (如空闲状态、擦除复位等)。例如 0x00
表示成功且处于空闲状态。
Host (Master) SD Card (Slave)
------- -------
CS _______________________________________________________________________________/
| |
SCLK _ | _ _ _ ... _ _ _ _ _ ... _ _ _ _ ... _ _ _
_/ _/ ... _/ _/ ... _/ _/ _/ _/ _/ ... _/ _/ _/ _/ ... _/ _/ _/ _/ ...
|<----- CMD17 (6 bytes) ---->| | R1 | | Token | |<---- Data Block (512 Bytes) ---->| | CRC1 | | CRC2 | ...
| C1 | C2 | ... | C6 | | R1 | | FE | | D0 | D1 | ... | D511 | | C1 | | C2 | ...
MOSI -----X- C1 -X- C2 -X- ... -X- C6 -X- FF -X- FF -X- ... -X- FF -X- ... -X- FF -X- ... (Host sends command, then continuous dummy bytes (0xFF))
| | | | | | | | | | |
MISO -----X-----X-----X-----...-X-----X--R1--X--Token-X- D0 -X- D1 -X- ... -X-D511-X- CRC1 -X- CRC2 -X-... (SD card sends R1, Data Start Token, Data, CRC)
| | | | | | | | | | | |
SAMPLE ... SAMPLE ... SAMPLE SAMPLE SAMPLE SAMPLE SAMPLE ... SAMPLE ... SAMPLE ... (Host samples MISO on rising edge)
发送 CMD17: 主机发送带地址参数的 CMD17 命令 (6字节)。
接收 R1 响应: 主机在发送哑元字节 (0xFF
) 的同时,采样 MISO 获取 R1 响应 (1字节)。如果 R1 指示错误,主机应终止读取。
等待数据令牌: 如果 R1 正常,主机继续发送 0xFF
(哑元) 并采样 MISO,等待数据起始令牌 0xFE
(图中 Token
)。在收到 0xFE
之前可能收到 0xFF
(忙)。0xFE
表示数据块即将开始传输。
接收数据块: 收到 0xFE
后,主机在接下来的 512 个 SCLK 上升沿采样 MISO,获取 512 字节的数据 (D0-D511)。
接收 CRC 字节: 数据块之后,SD 卡会发送 2 个字节的 CRC 校验码 (CRC1, CRC2)。在 SPI 模式下,主机通常忽略 CRC 校验,但仍需提供足够的时钟让 SD 卡输出它们 (主机继续发送 0xFF
哑元)。
结束: 数据传输完成后,主机可以拉高 CS。
Host (Master) SD Card (Slave)
------- -------
CS _____________________________________________________________________________________________________/
| |
SCLK _ | _ _ _ ... _ _ _ _ _ ... _ _ _ _ ... _ _ _ _ ... _ _
_/ _/ ... _/ _/ ... _/ _/ _/ _/ _/ ... _/ _/ _/ _/ ... _/ _/ _/ _/ ... _/ _/ _/ _/ ...
|<----- CMD24 (6 bytes) ---->| | R1 | | Token | |<---- Data Block (512 Bytes) ---->| | CRC1 | | CRC2 | | Resp | | ... (Busy)
| C1 | C2 | ... | C6 | | R1 | | FE | | D0 | D1 | ... | D511 | | C1 | | C2 | | XXX | | FF | ...
MOSI -----X- C1 -X- C2 -X- ... -X- C6 -X- FF -X- FF -X- TokenX- D0 -X- D1 -X- ... -X-D511-X- CRC1 -X- CRC2 -X- FF -X- FF -X- ... (Host sends cmd, dummy, start token, data, dummy CRC, dummy for response/busy)
| | | | | | | | | | | | | | | |
MISO -----X-----X-----X-----...-X-----X--R1--X-----X-----X-----X-----...-X-----X-----X-----X-----X--Resp-X- FF -X-... (Busy: 0x00) (SD card sends R1, then accepts data, then sends Data Response Token, then busy)
| | | | | | | | | | | | | | | |
SAMPLE ... SAMPLE ... SAMPLE SAMPLE SAMPLE SAMPLE SAMPLE ... SAMPLE ... SAMPLE SAMPLE SAMPLE SAMPLE ... (Host samples MISO)
发送 CMD24: 主机发送带地址参数的 CMD24 命令 (6字节)。
接收 R1 响应: 主机在发送哑元字节 (0xFF
) 的同时,采样 MISO 获取 R1 响应 (1字节)。如果 R1 指示错误 (如写保护),主机应终止写入。
发送数据起始令牌: 如果 R1 正常,主机主动发送数据起始令牌 0xFE
(图中 Token
)。
发送数据块: 主机紧接着发送要写入的 512 字节数据 (D0-D511)。
发送哑元 CRC: 主机发送 2 个字节的哑元 CRC (通常为 0xFF
0xFF
),因为 SPI 模式通常禁用 CRC 校验。
接收数据响应令牌: 主机在发送完哑元 CRC 后,继续发送 0xFF
(哑元) 并采样 MISO,等待数据响应令牌 (图中 Resp
,1字节)。这个令牌的格式是 0bxxx0sss1
:
010
(0x05
): 数据被接受,写入开始。
101
(0x0B
): CRC 错误 (即使禁用了也可能发送)。
110
(0x0D
): 写错误。
低 3 位 sss
表示状态:
主机需要检查状态位是否为 010
(数据被接受)。
等待写入完成 (Busy): 收到 010
响应后,SD 卡开始内部编程操作。此时 MISO 线会被 SD 卡拉低 (输出 0x00
) 表示忙 (Busy)。主机需要持续发送 0xFF
(哑元) 并采样 MISO,直到 MISO 重新变为高电平 (0xFF
),表示写入完成。这段时间可能很长 (几毫秒到几百毫秒)。
结束: 写入完成后,主机可以拉高 CS。
重要注意事项:
初始化: 上电后需要通过 CMD0 (带正确的 CRC)、CMD8、CMD58、CMD55+ACMD41 等命令序列初始化 SD 卡进入 SPI 模式并完成电压检查、OCR 读取、初始化流程。初始化阶段的时序与命令响应时序类似。
OCR 读取 (CMD58): 响应是 1 字节 R1 + 4 字节 OCR 寄存器。时序是命令发送 -> R1 -> 4字节 OCR (高位在前) -> 结束。
时钟速度: 初始化阶段必须使用低速时钟 (通常 100-400 kHz)。初始化完成后,可以通过 CMD16 (设置块长度,通常是 512) 和 CMD0 (软复位) 后,再使用 CMD59 (CRC_ON_OFF) 禁用 CRC,最后才能切换到高速 SPI 时钟 (可达 25 MHz 或更高,取决于卡支持)。
CRC: SPI 模式下强烈建议使用 CMD59 禁用 CRC (arg=0
),以简化操作。初始化命令 CMD0 的 CRC (0x95
) 和 CMD8 的 CRC (0x87
) 通常是强制要求正确的。
超时: 在等待响应令牌 (如读的 0xFE
、写的响应令牌) 和忙状态时,主机必须实现超时机制,避免永久等待。
CS 管理: 除了数据传输块期间,CS 可以在命令之间拉高。但在一个命令/数据块传输未完成前,CS 必须保持低电平。
厂商差异: 不同厂家/型号的 SD NAND 在细节上 (如响应延迟、初始化流程细微差别) 可能有差异,务必参考具体芯片的数据手册。
调试建议:
使用逻辑分析仪或示波器抓取 SPI 信号 (CS, SCLK, MOSI, MISO) 是调试 SD NAND SPI 通信最有效的方法。
对照 SD Physical Layer Specification 和具体芯片的数据手册分析波形。
重点检查:CS 时序、SCLK 极性/相位、命令格式、响应内容、数据块起始/结束令牌、忙状态。
理解这些时序图对于成功驱动 SD NAND 在 SPI 模式下工作至关重要。务必仔细阅读你所使用的 SD NAND 的具体规格书。
上一篇:SDNAND工作与待机电流参数