【问题标题】:Why does sending CMD58 over SPI to my Class 10 SD return 0x01 instead of 0x00?为什么通过 SPI 将 CMD58 发送到我的 Class 10 SD 返回 0x01 而不是 0x00?
【发布时间】:2019-10-30 15:31:00
【问题描述】:

我正在尝试使用 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 返回值困扰了很长一段时间了。谢谢!

【问题讨论】:

  • SD_SendCmd() 是否同步?如果不是,那么您可能需要实现 while 来等待它完成。与SPI_RxByte()类似。
  • 位和字节有明显区别。

标签: c spi stm32f4discovery fatfs


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 2010-10-27
      相关资源
      最近更新 更多