【发布时间】:2016-02-29 18:03:31
【问题描述】:
我正在使用 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 的 32 GB microSD 卡在完成数据流以响应“读取块”或“写入块”命令之前无法正确响应 CMD0。只有在从 SD 卡的最后一个字节发送后,我才会在 CMD0 之后收到预期的 0x01。 Transcend(全尺寸卡)的8 GB没有这样的问题。