使用SPI接口初始化microSD卡

问题描述 投票:17回答:6

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

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

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

  2. CMD8(参数0x000001AA,CRC 0x87)->响应0x01 0x000001AA->表示它是SDC V2 +卡,电压范围为2.7V-3.6V-> OK

    ]

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

如何解决此问题?

embedded sd-card
6个回答
16
投票

我似乎已经找到了问题。当我为CMD55计算正确的CRC并发送该值而不是虚拟CRC时,该命令将被接受(结果0x01)。如果查看7.​​2.2节中的the physical layer specification,它会明确指出:

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

此系列创见卡似乎并非如此,因此违反了规格。同样在发生CRC错误的情况下,回复应为0x09而不是0x05。我试图用CMD59显式关闭CRC检查,但这似乎无济于事。

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

我正在与创见的支持人员联系。如果我学到有用的东西,我会在这里告诉你。

[请注意,我以前使用过其他2 GB的创见卡,但它们是在台湾制造的,而新的是在韩国制造的(似乎是三星卡(MMAGR02GUDCA)。]]


2
投票

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


2
投票

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


1
投票

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


1
投票

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


0
投票

在CMD55之后(发送+接收0xFF)并在CMD41之前插入几个虚拟SPI周期。

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

© www.soinside.com 2019 - 2024. All rights reserved.