我正在嵌入式设计中使用microSD卡。该卡使用SPI接口连接到微控制器。我以前使用过的所有卡都可以正常工作,但是现在我的新卡将无法初始化。该卡是创见2 GB microSD卡(TS2GUSD)。
发送初始时钟序列以切换到SPI模式后,请执行以下操作:
CMD0(参数0,CRC 0x95)->响应0x01-> OK
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卡正常工作。
如何解决此问题?
我似乎已经找到了问题。当我为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)。]]
我有几乎相同的问题。发送ACMD41时,我先发送了CMD55,然后又发送了CMD41。 CMD55的响应为0x01,表示处于空闲状态并正在运行初始化过程(我认为这很正常)。 CMD41将以0x05响应,指示非法命令。事实证明,即使在SPI模式下,我的特定卡也默认情况下执行CRC检查,并将CRC错误错误报告为非法命令(即不遵循SD规范)。当我计算适当的CRC时,它工作正常。这是我使用的CRC7计算代码,对我来说效果很好:
您说您使用CRC 0
作为失败的命令。我假设您的意思是您将整个最后一个字节发送为0x00
。请注意,CRC7只是最后一个字节的前7位-称为end bit
的最后一位应始终为1
。因此,如果将0x00
作为最后一个字节发送,而将0
作为最后一个字节发送,则失败是可以理解的,甚至错误代码也可以理解。如果将1
作为最后一位发送,则它应该工作,即。最后一个字节使用0x01
或0xFF
之类的内容。
[正常,很可能是用于产生擦除电压的内部电荷泵所需的时间比平时更长……您必须坚持使用CMD55 + ACMD41组合,直到初始化完成。
仅发送带有芯片选择(0)的CMD0不会在SPI模式下初始化卡。这仅设置SPI模式。在ACMD41返回接受之前,不会初始化卡。然后,CRC默认为关闭。
在CMD55之后(发送+接收0xFF)并在CMD41之前插入几个虚拟SPI周期。
我必须为我的两个旧测试卡都这样做-16MB Panasonic和Sandisk 64MB。