为什么通过SPI向我的Class 10 SD发送CMD58返回0x01而不是0x00?

时间:2019-06-17 03:54:25

标签: c spi stm32f4discovery fatfs

我正在尝试使用SPI总线和STM32F4发现板初始化SD卡。我主要依靠示例代码中Elm Chan的disk_initialize函数的实现来实现我自己的实现。不幸的是,我遇到了一个问题,在初始化过程中将CMD58发送到SD卡会返回0x01的结果,这意味着SD卡处于空闲状态。但是,我仍然看到SD卡的下四个字节为0x00、0xFF,0x80、0x00,这是R3响应的正确格式。但是,我不确定是否可以信任这四个字节作为OCR。

到目前为止,我一直在尝试忽略SD卡处于空闲状态,只是尝试将接下来的四个字节用作OCR,但是在安装过程中,关于卡类型的代码似乎在其他地方失败由OCR承担。

if (Timer1 && SD_SendCmd(CMD58, 0) == 0) { 
      for (n = 0; n < 4; n++) {
        ocr[n] = SPI_RxByte();
      }  
      type = (ocr[0] & 0x40) ? 6 : 2;  
}

上面的代码段是我第一次看到空闲响应的地方。 SD_SendCmd是我将CMD58发送到SD卡的地方,在这里我收到0x01作为五字节响应的最左字节。因为我没有收到0x00,这表明SD卡传递给它的命令没有问题,所以代码脱离了初始化过程,并返回错误。对于此问题的任何帮助,我将不胜感激,因为一段时间以来,我一直对此0x01返回值感到困惑。谢谢!

2 个答案:

答案 0 :(得分:0)

所以我能够找出问题所在。原来,我使用的卡是SDHC卡,HC代表高容量。根据简化的SD卡规范,在命令传输结束时发送的CRC必须将最低有效位设置为1。因此,在任何传输之前让我将CRC与0x01进行或运算,然后进行初始化和使用任何类型的SD卡。因此,我遇到的问题不是来自CMD58,而是我通常如何处理CRC。有趣的是,对于非大容量SD卡,不对CRC进行OR操作似乎可以正常工作。但是,将CRC与0x01进行“或”运算似乎适用于所有卡(至少据我测试)。

答案 1 :(得分:0)

关于 CRC 与 0x01 的 ORing,这不是 CRC,而是 STOP-BIT,CRC 是 CRC7 类型,位于命令中字节 #6 的位 1:7。根据规范,即使不需要CRC,停止位也必须始终为1。