17

我在嵌入式设计中使用microSD卡。该卡使用 SPI 接口连接到微控制器。它适用于我以前使用过的所有卡,但现在我的新卡无法初始化。该卡是 Transcend 2 GB microSD 卡 (TS2GUSD)。

发送初始时钟序列以切换到 SPI 模式后,我执行以下操作:

  1. CMD0(参数 0,CRC 0x95)-> 响应 0x01 -> OK

  2. CMD8 (Argument 0x000001AA, CRC 0x87) -> Response 0x01 0x000001AA -> 表示它是 SDC V2+ 卡,支持电压范围 2.7 V - 3.6 V -> OK

然后我应该发送 ACMD41 命令,但是当发送必须在 CMD41 之前的 CMD55(参数 0,CRC 0)时,我得到响应 0x05 -> 非法命令。我也尝试发送 CMD1(用于 MMC 卡),但它给出了类似的非法命令响应。该代码适用于我的 Sandisk 2 GB microSD 卡。

我该如何解决这个问题?

4

6 回答 6

17

我似乎找到了问题所在。当我为 CMD55 计算正确的 CRC 并发送它而不是虚拟 CRC 时,命令被接受(结果 0x01)。如果您查看第 7.2.2 节中的物理层规范,它明确表示:

SPI 接口默认初始化为 CRC OFF 模式。(命令 CMD0 和 CMD8 除外)。

这一系列创见卡似乎并非如此,因此违反了规范。此外,在 CRC 错误的情况下,回复应该是 0x09 而不是 0x05。我试图用 CMD59 明确关闭 CRC 检查,但这似乎没有帮助。

=>为(所有?)命令计算正确的CRC使卡工作。

我正在就此事与 Transcend 支持人员联系。如果我学到一些有用的东西,我会在这里知道。

请注意,我之前使用过其他 2 GB Transcend 卡,但它们是台湾制造的,而新的是韩国制造的(并且似乎是三星卡(MMAGR02GUDCA))。

于 2009-06-07T10:44:24.960 回答
2

我有几乎同样的问题。发送 ACMD41 时,我先发送 CMD55,然后发送 CMD41。CMD55 的响应是 0x01,表示空闲状态并正在运行初始化过程(我认为这是正常的)。CMD41 会以 0x05 响应,表示非法命令。事实证明,即使在 SPI 模式下,我的特定卡也会默认执行 CRC 检查,并将 CRC 错误误报为非法命令(即,它不遵循 SD 规范)。当我计算正确的 CRC 时,它工作正常。这是我使用的 CRC7 计算代码,对我来说效果很好:

https://github.com/hazelnusse/crc7

除非您注意禁用 CRC 检查,否则我认为最好假设它没有被禁用并确保为每个命令帧计算正确的 CRC。据我所知,有些卡在 SPI 模式下默认禁用它,而另一些卡则启用它,即使 SD 规范规定它应该在 SPI 模式下默认禁用,但 CMD8 除外。

于 2012-05-11T09:28:47.407 回答
2

你说你用于CRC 0失败的命令。我假设您的意思是将整个最后一个字节发送为0x00. 请注意,CRC7 只是最后一个字节的前 7 位——最后调用的位end bit应该始终是1。因此,如果您0x00作为最后一个字节发送,0作为最后一位,失败是可以理解的,甚至错误代码也是有意义的。如果您1作为最后一位发送,它应该可以工作,即。使用类似0x010xFF作为最后一个字节的东西。

于 2013-07-31T16:17:06.290 回答
1

这很正常,可能是用于产生擦除电压的内部电荷泵需要比平时更长的时间才能准备好……您必须坚持使用 CMD55+ACMD41 组合,直到初始化完成。

CMD58 还可以帮助您检查是否提供了正确的电压电平(有时插座有接触问题)。

于 2009-06-05T13:15:58.753 回答
1

单独发送带有芯片选择(0)的 CMD0 不会在 SPI 模式下初始化卡。这仅设置 SPI 模式。在接受 ACMD41 返回之前,不会初始化卡。然后 CRC 默认关闭。

于 2014-08-11T06:22:55.843 回答
0

在 CMD55 (0xFF sent+received) 和 CMD41 之前插入几个虚拟 SPI 周期。

我必须为我的旧测试卡 - 16MB Panasonic 和 Sandisk 64MB 这样做。

笔记:我意识到我参加聚会已经很晚了,但我希望它可以帮助将来的人。

于 2020-04-03T20:16:07.420 回答