2009-06-05 144 views
15

我在嵌入式设计中使用microSD卡。该卡使用SPI接口连接到微控制器。对于之前使用过的所有卡片都可以正常工作,但现在我的新卡片不会初始化。该卡是Transcend 2   GB microSD卡(TS2GUSD)。使用SPI接口初始化microSD卡

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

  1. CMD0(参数0,CRC位0x95) - >响应0×01 - >行

  2. CMD8(参数0x000001AA,CRC×87) - >响应0×01 0x000001AA - >意味着它是SDC V2 +卡,电压范围2.7   N - 3.6   V的支持 - >确定

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

我该如何解决这个问题?

回答

14

我似乎发现了这个问题。当我为CMD55计算正确的CRC并发送它而不是虚拟CRC时,该命令被接受(结果为0x01)。如果您在第7.2.2节中查看the physical layer specification,则明确指出:

默认情况下,SPI接口在CRC OFF模式下初始化。 (命令CMD0和CMD8除外)。

对于这一系列的创见卡来说,这似乎并不是这样,因此违反了规范。同样在CRC错误的情况下,应答应该是0x09而不是0x05。我试图明确地关闭使用CMD59的CRC校验,但这似乎没有帮助。

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

我与Transcend支持部门联系。如果我学到一些有用的东西,我会在这里知道。请注意,我之前使用过其他2   GB创见卡,但是它们是在台湾制造的,而新的则是在韩国制造的(而且似乎是三星卡(MMAGR02GUDCA))。

+1

不错!好,你把问题挖出来了......我只是惊呆了,因为接缝指出USB读卡器不使用组合命令。 您可以/应该将您的答案标记为正确答案。 BTW,sandisk,transcent等没有半导体代工厂...他们为他们的产品提供控制器和数字设计服务(他们实际上并没有制造芯片) – jpinto3912 2009-06-08 17:21:19

+0

我必须等待48小时才能将我的答案标记为正确因为某些原因。 我认为USB读卡器会使用“真正的”SD存储卡协议“接口(具有更高的速度),在这种模式下,你必须使用CRC,并且可能没有问题 – Ron 2009-06-09 10:33:14

1

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

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

+1

卡无限期地在CMD55上循环,结果为0x05。我已经等了很久,没有任何变化。 CMD58具有相同的结果0x05。与此同时,我指出了这个问题,请参阅下面的答案。 – Ron 2009-06-07 10:39:40

2

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

https://github.com/hazelnusse/crc7

除非你有照顾禁用CRC校验,我想这可能是最好的假设未禁用,使确定你为每个命令帧计算正确的CRC。从我所知道的情况来看,有些卡在SPI模式下默认禁用它,而其他卡则禁用它,即使SD规范声明它应该在除CMD8之外的SPI模式下被默认禁用。

2

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

1

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