重置硬件后,使用SPI初始化SanDisk SD卡失败

3
我正在使用STM32微控制器通过SPI外设与SD卡进行接口交互。我已经测试了2GB、4GB、8GB和16GB的SanDisk卡。当我对2GB和8GB的卡进行重置时,没有任何反应,我可以继续我的测试。然而,对于4GB和16GB的卡,在执行重置后初始化失败。事实上,在SD插槽中首次插入这些卡时,它们被很好地初始化,但一旦我执行重置,就无法通过。
当我尝试调试此问题时,我发现在处理重置时,对CMD0命令的响应是错误的。我得到的是0x00而不是0x01,这意味着我的卡不处于空闲状态。
我认为问题是由于CS线的时间问题导致的。因此,我尝试在发送CMD0命令之前去除CS并发送虚拟字节,以使卡等待8个时钟周期。然后,我发送CMD0并将CS线断言为高电平。(见下文)
SD_IO_CSState(0);
SD_IO_WriteByte(SD_DUMMY_BYTE);
response = SD_SendCmd(SD_CMD_GO_IDLE_STATE, 0, 0x95, SD_ANSWER_R1_EXPECTED);
SD_IO_CSState(1);
SD_IO_WriteByte(SD_DUMMY_BYTE);

使用这种解决方案,初始化在进行了几次重置测试后通过了。但是,它在任何时候都可能失败,而2Gb和8Gb卡则不会出现这种情况。
有什么建议可以解决这个问题吗?

我注意到 SanDisk 的 32GB MicroSD 卡在响应“读取块”或“写入块”命令的数据流完成之前,不能正确地响应 CMD0。只有在发送最后一个字节后才能获得预期的0x01响应CMD0。 而来自Transcend的8GB全尺寸卡没有这样的问题。 - Alex Guryanow
1个回答

0

我也遇到了与我的24GB SanDisk SD卡完全相同的问题。我所学到的是,也许SD卡一旦在SPI模式下初始化后,就不再接受CMD0(即软件复位命令!),将它们恢复到初始状态的唯一方法是执行它们的电源循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接