部分SD卡写入失败(CMD24返回CRC错误)相关问题咨询
SD卡SPI模式CMD24返回0x05问题排查方案
首先纠正你的响应值判定错误:SPI模式下SD卡R1响应的0x05对应二进制0b00000101,代表卡识别到非法命令 + 卡仍处于空闲状态,并非CRC错误,CRC错误对应的返回值为0x04。
结合你给出的代码和配置场景,常见的遗漏配置和问题如下:
- 地址格式不兼容不同类型的SD卡
你当前SD_command(CMD24, 0x0001, CMD24_CRC)的第二个参数为块地址0x0001,该地址格式仅适用于SDHC/SDXC卡(容量≥4GB)。对于SDSC卡(容量≤2GB),CMD24的参数必须是字节地址,写入512字节对齐的块时,第1个块的地址为0x00000000,第2个块地址为0x00000200,传入非对齐地址会被老款SDSC卡判定为非法命令。 - 未主动配置块长度
虽然大部分SD卡默认块长度为512字节,但部分老款/低容量卡默认块长度不为512,要求初始化完成后必须发送CMD16设置块长度为0x00000200(即512字节),未执行该配置就发送CMD24写入512字节会返回非法命令。 - CMD59发送时机错误
部分SD卡要求CMD59(CRC开关指令)必须在卡处于空闲状态时发送,也就是初始化阶段发完CMD0、收到0x01响应后就要发送CMD59关CRC,如果你是在卡初始化完成、退出空闲状态后才发送CMD59,部分卡不会响应该配置,CRC校验仍处于开启状态,但若只是CRC错误返回值应为0x04,可作为次要排查项。 - 总线空闲时钟不足
部分对时序要求严格的SD卡要求两次命令之间总线必须保持至少8个时钟周期的高电平,也就是发完上一个命令的响应后,需要至少发送1字节的0xFF空操作,再发送下一个命令,否则卡会识别不到命令起始位,判定为非法命令。 - SPI速率不匹配
初始化阶段使用≤400kHz的低速SPI,初始化完成后如果直接切换到超过卡支持的最高SPI速率,也会出现命令识别失败的问题,可暂时将初始化后的SPI速率降到1MHz测试,确认是否为速率适配问题。
对应的修复步骤:
- 初始化阶段增加CMD58读取OCR寄存器的逻辑,判断卡的类型是SDSC还是SDHC/SDXC,根据卡类型动态调整CMD24的地址参数格式。
- 初始化完成后主动发送CMD16,参数设为
0x00000200,确认返回0x00后再执行写入操作。 - 调整CMD59的发送顺序到CMD0之后、ACMD41之前,确保卡处于空闲状态时接收该配置。
- 每次发送命令前先发送1~2字节的
0xFF,保证总线空闲时长符合要求。
内容的提问来源于stack exchange,提问作者Andy Norrie
相关产品推荐
相关产品推荐

