c - 为什么通过 SPI 将 CMD58 发送到我的 Class 10 SD 返回 0x01 而不是 0x00?
问题描述
我正在尝试使用 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 返回值困扰了很长一段时间了。谢谢!
解决方案
所以我能够弄清楚这个问题。原来我用的卡是SDHC卡,HC代表大容量。根据简化的 SD 卡规范,在命令传输结束时发送的 CRC 必须将最低有效位设置为 1。因此,在任何传输之前将 CRC 与 0x01 进行或运算让我初始化并使用任何类型的 SD 卡。所以我遇到的问题不是来自 CMD58,而是我如何处理 CRC。有趣的是,不对 CRC 进行 ORing 似乎在非大容量 SD 卡上也能正常工作。但是用 0x01 对 CRC 进行 ORing 似乎适用于所有卡(至少就我测试而言)。
推荐阅读
- msbuild - 命名空间“Microsoft.AspNet”中不存在类型或命名空间名称“WebApi”(您是否缺少程序集引用?)
- jquery - 将 curl 转换为 $.ajax 以发送 application/x-www-form-urlencoded 数据
- python - 删除所有空格、标点符号和大写字母
- reactjs - 如何处理大列标题以换行到下一行
- django - 使用 MultipleChoiceFilter 时动态重新加载选项
- amazon-web-services - 使用带有“and”运算符的具有多个条件的 FilterExpression 进行扫描操作
- css - 如何在材质图标和描述之间创建一些空白?
- xml - 使用 XSLT 将 XML 响应日期格式从 YYYY-MM-DDT00:00:00 转换为 DD/MM/YYYY
- css - Safari 边框错误
- kubernetes - 有没有办法在多个节点的 pod 之间进行负载平衡?