2

我正在尝试使用 SPI 总线和 STM32F4 探索板初始化 SD 卡。我主要依靠 Elm Chan 对示例代码中的 disk_initialize 函数的实现来建立自己的实现。不幸的是,我遇到了一个问题,在初始化过程中向 SD 卡发送 CMD58 返回结果为 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 返回值困扰了很长一段时间了。谢谢!

4

2 回答 2

0

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

于 2019-07-11T19:16:07.030 回答
0

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

于 2021-08-06T01:27:19.507 回答