在SPI模式下操作SD NAND(或兼容SPI接口的SD卡)时,读写时序需要遵循特定的协议规范。以下是SPI模式下SD卡的典型读写时序流程及关键点解析:
信号线:
SCK(时钟):由主机控制,同步数据传输。
MOSI(主出从入):主机发送数据到SD卡。
MISO(主入从出):SD卡发送数据到主机。
CS(片选):低电平有效,每个操作前需拉低。
时钟极性与相位:
通常设置为 CPOL=0(空闲时SCK低电平),CPHA=0(数据在SCK第一个边沿采样)。
上电后延时:
等待至少 1ms,确保电源稳定。
发送CMD0(复位命令):
CS拉低,发送CMD0 (0x40 0x00 0x00 0x00 0x00 0x95)
。
期望响应 R1=0x01(空闲状态)。
发送CMD8(检查电压兼容性):
发送CMD8 (0x48 0x00 0x00 0x01 0xAA 0x87)
。
有效响应为 R7格式(包含电压范围信息)。
初始化循环(CMD55 + ACMD41):
CMD55 (0x77 0x00 0x00 0x00 0x00 0x65)
ACMD41 (0x69 0x40 0x00 0x00 0x00 0x77)
循环发送:
直到响应为 R1=0x00(初始化完成)。
发送CMD17(读单个块):
命令格式:0x51 [LBA地址] 0xFF
。
期望响应 R1=0x00(无错误)。
等待数据起始令牌:
持续读取MISO,直到收到 0xFE(数据起始标志)。
接收数据块:
读取 512字节数据 + 2字节CRC(SPI模式下CRC可忽略)。
结束操作:
CS拉高,结束传输。
时序示例: Host: CMD17 -> [CMD] [LBA] [CRC] 0xFF Card: R1(0x00) -> 0xFE [512B Data] [CRC]
发送CMD24(写单个块):
命令格式:0x58 [LBA地址] 0xFF
。
期望响应 R1=0x00。
发送数据起始令牌:
发送 0xFE。
发送数据块:
写入 512字节数据 + 2字节CRC(可为0xFF)。
接收写响应:
等待 Data Response Token(0x05 表示接受数据)。
等待写入完成:
持续读取MISO,直到返回非0xFF值(忙状态结束)。
时序示例: Host: CMD24 -> [CMD] [LBA] [CRC] 0xFF Card: R1(0x00) Host: 0xFE [512B Data] [CRC] Card: Data Response Token (0x05)
命令响应超时:
典型值 8个字节时间(未收到响应则重试)。
数据块超时:
读操作等待起始令牌 100ms,写操作等待忙状态 250ms。
SPI时钟频率:
初始化阶段建议 ≤400 kHz,初始化后可提升至 全速(如25 MHz)。
CRC校验:
SPI模式下CRC可禁用(默认填充0xFF),但需确保命令格式正确。
多块操作:
读多块使用 CMD18,写多块使用 CMD25,需发送终止命令(CMD12)。
错误处理:
若收到错误响应(如R1=0x04),需重新初始化或检查物理连接。
通过以上时序流程,可实现对SD NAND的SPI模式读写操作。建议结合具体芯片的数据手册验证细节参数。