SPI中的microSD卡初始化的正确命令顺序是什么?


18

我正在尝试将microSD卡(2 GB,金斯敦,Sandisk)与Silicon Labs C8051F931控制器接口。

我对初始化必须遵循的顺序感到非常困惑。在第135页的《使用PIC控制器进行SD卡项目》一书中,提到:

因此,将SD卡切换到SPI模式的步骤应如下:上
电。
•在CS和数据轮廓设置为逻辑“ 1”的情况下,向卡发送至少74个时钟脉冲。
•将CD线设置为低电平。
•发送6字节的CMD0命令“ 40 00 00 00 00 95”以将卡置于SPI模式。
•检查R1响应以确保没有设置错误位。
•重复发送命令CMD1,直到R1响应中的“空闲状态”位设置为“ 0”,
并且•没有设置错误位。卡已准备就绪,可以进行读/写操作。

我试过了,但是即使对于CDM1我也得到01。预期为00。

同样在这里,我看到了一个不同的命令序列,其中他在CMD0之后发送CMD8。但是这本书说我必须发送CMD1。

正确的顺序是什么?

Answers:


34

实际上,您可能会在SD初始化中找到的大多数信息/代码都是过时的或不准确的,因为它比SDHC和SDXC早了数年。如今,该过程更加复杂,因为它迫使您以向后兼容的方式处理旧硬件。

首先,如其他人所述,选择较低的初始时钟速率(通常在100 kHz-400 kHz范围内;如果可能,使用400 kHz);如果设备允许,您以后可以切换到更高的时钟。尽管新卡可以安全地承受MHz级时钟,但旧卡会抱怨(即不进行通信或返回垃圾)。

接下来的事情是,CMD1除非您的卡无法识别CMD55/ ACMD41,否则您不应该使用它来初始化SD / SDHC / SDXC卡。如SD卡规范中所述:

在任何情况下都不建议使用CMD1,因为主机可能很难区分MultiMediaCard和SD存储卡。

如果您发给某些控制器(大多数是更高容量的卡)CMD1,它们只会停留在IDLE中。您应该先CMD8 0x1AA在reset(CMD0)之后发出,然后尝试使用CMD55 + ACMD41当且仅当失败时,使用CMD1

tl; dr以SPI模式初始化卡,您应该:

  1. CMD0arg:0x0,CRC:0x95(response:0x01)-请注意,如果0xFF发生响应或出现乱码,则只需重复此步骤;请参阅下面的更多信息。

  2. CMD8arg:0x000001AA,CRC:(在这种情况下,0x87response 0x01:,然后是arg的回显0x000001AA)-尽管此命令似乎是可选的,但对于较新的卡来说是完全必需的。虽然0x1AA这里是一个普通的arg值,但实际上您也可以传递其他值;请参见第23页的“表7-5:CMD8在SPI模式下的卡操作”。规格中的108。

    3a。CMD55ARG:0x0,CRC:有,0x65其实(回应:0x01; CMD55作为前缀,以 ACMD ;如果响应是0x05,你有一个旧卡-重复CMD1与ARG 0x0[CRC 0xF9]而非CMD55/ ACMD41

    3b。ACMD41,arg:0x40000000,CRC:0x77实际上是任意值(请注意,此参数假定卡是HCS卡,通常是这种情况;对于较旧的卡,请使用0x0arg [CRC 0xE5])。如果响应为0x0,则表示没有问题。如果是0x01,请转到3a; 如果是0x05,请参见上面的注释(在3a。中);如果两者都不存在,则说明存在问题(另请参见下文)。

大多数卡要求CMD1重复步骤3a / 3b(或旧卡),即使您在它们之间稍等片刻通常至少要重复一次;即实际序列CMD0/ CMD8/ CMD55/ ACMD41/ CMD55/ ACMD41(或CMD0/ CMD8/ CMD1/ CMD1) -可以肯定,尝试CMD55/ ACMD41(或者CMD1,如果你有0x05从他们)倍(选择您合理的范围内,它实际上是相当常见的有等待如果设备刚开机就需要几百毫秒的时间,因此请为此而努力),如果您愿意,可以尝试之间稍加延迟,如果响应则认为失败ññ0不会出现(即,如果设备由于某种原因而处于“空闲”模式)。此外,接收0xFF来自CMD0通常如果设备在一些“奇怪”的状态之前(例如,挂断了电话,得到了SS拉高[高],只好过压/欠压一些销等) -只要给它一些时间,冲洗和重复次。以乱码的反应也是相当有时-如果你送了它几次,响应还是既不也没有,试着向前走。如果可行,那就很好了;如果没有- 可能是坏了ñCMD00xFF0x01CMD8

请注意,设置了MSB但0xFF通常不表示SPI时钟发生了变化(例如Vcc下降,这在执行SD热插拔时通常会发生)。要修复它,您可以尝试完全重置设备(打开/关闭电源,取消激活/确认S̲S̲等);它通常有效。

另外,规范说

在最后一次SD存储卡总线事务处理之后,要求主机在关闭时钟之前为卡提供8个(八个)时钟周期以完成操作。

没有它也可以工作,但是因为8个周期= 1个SPI输出字节,它不会造成太大的伤害,拥有它只是很好。

请注意,您至少应在每次前后都将S̲S̲(aka CS)设置为低电平CMD-这是完全强制性的,以防万一CMD0(如果没有它,设备将无法开启),实际上,CMD如果您有标准的话,所有其他设备都必须这样做兼容的SD卡。似乎将卡的S̲S̲永久连接到GND如果该卡是您的主机将要连接的唯一SPI客户端,则是个好主意,因为这将节省您uC输出引脚和所有通过代码进行管理的需要,并且因为该卡应假定已全部选中的时间。实际上,某些卡(如果不是大多数卡)实际上期望从高到低的斜率开启而不是简单地检测到低,因此,如果根本不切换S̲S̲位,就会生气,然后要么滞后时钟或吐垃圾;YMMV(再次)应该可以使用某些(通常是较新的)卡,而某些(较旧的)则不能。尽管如此,对于任何更强大的SPI配置(> 1个从设备),请记住在使用给定SD卡进行任何实际事务处理之前将引脚置为低电平。

此外,虽然性能指标说,只有CMD0CMD8应有CRC在SPI模式下,一些SD卡(如创见的)似乎需要进行适当的CRC CMD55/ ACMD41-如果你想成为安全起见,简单地使用他们的一个预先计算的值。

同样,虽然SPI本身不需要上拉/下拉,但在MISO上抛出47k上拉可能是个好主意;一些设备在特定情况下(例如未初始化)将其DO引脚保持高阻态,而浮动引脚始终可能是引起奇怪问题的根源。如果您的uC具有3.3 Vcc,则可以使用内部上拉电阻;否则,请参见上图。如果是5V,请不要这样做,除非您的MISO线路已经具有适当的5-> 3.3V逻辑转换。

进一步阅读:

如何使用MMC / SDC

SD规范第1部分简化的物理层简化的规范 -最重要的是,第6.4.1节上7.2.1模式选择和初始化图7-1):SD存储卡状态图(SPI模式)


4

SD卡的规格可在sdcard.org找到。简化版本省略了一些细节,但是您应该看一下第1部分中的图7-2,其中解释了SDHC和SD卡的初始化序列。

<= 2 GB的MicroSD卡可以像旧卡一样工作,因此它们应该最终为您提供0x00结果。这可能需要进行多次重试,因为该卡可以使用SPI总线上的外部时钟来驱动某些内部处理。CMD1


2

除了@vaxquis的出色答案外,我想引用“ 物理层简化规范版本4.10,©版权所有2001-2013 SD Group(Panasonic,SanDisk,Toshiba)和SD卡协会” 的相应图表(图7-2) :SPI模式初始化流程):

SD卡SPI初始化序列

在这里,您可以查看以什么顺序发送的命令以及有关卡类型的响应告诉我们。我认为希望设备支持尽可能多的卡;只要涉及到512字节读写块的基本操作,那么至少对所有V1.x和V2.0 SD和HC卡都应该可行。


2

我提供了另一种可能性。在SPI模式下,Samsung MicroSD EVO 32GB要求所有命令代码都具有有效的CRC代码。我敢打赌他们不是唯一的人。我读到一条评论,该人认为32GB以上的所有卡可能都是这种方式。我已经调试了一个多星期的错误。在发送到卡上的所有密码均具有有效的crc密码之前,我的密码无法使用。我用它来计算所有CRC代码 https://github.com/hazelnusse/crc7/blob/master/crc7.cc 我什至尝试使用命令59关闭CRC代码,不。我希望这可以节省其他人的时间和精力。

我的初始化代码带有CRC值。

Power On..
Clock card at least 74 (I use 80) cycles with cs high
CMD0 0, crc=0x95
CMD8 0x01aa, crc=0x87
CMD58 0, crc=0xfd
CMD55 0, crc=0x65
CMD41 0x40000000, crc=0x77
CMD9 0, crc=0xaf
CMD16, 512, crc=0x81 (If you want block length of 512)

Some random other commands..
CMD17 0, crc=0x3b (Read one block)
CMD18 0, crc=0x57 (Read multiple blocks)
CMD24 0, crc=0x6f (set write address for single block)
CMD25 0, crc=0x03 (set write address for first block)

-2

您确定SPI总线的频率为400 kHz吗?初始化必须在SPI总线以400 kHz运行的情况下进行,直到SD卡报告其处于空闲状态为止,在此状态下SPI总线时钟速率可能会提高(确切的最大值似乎因制造商而异,但似乎对于大多数卡来说,12 MHz是一个不错的选择)。

另外,据此:http : //elm-chan.org/docs/mmc/mmc_e.html CMD1是正确的初始化。仅需要CMD8来查询电压范围,对于非SDHC(<= 2GB)卡,这不是问题。


实际上,许多SD卡(大多数是更新的SD卡,我的Sony SR-32C4 32GB都是其中之一),如果没有CMD8事先发行就根本无法启动。另外,只要在合理范围内,时钟通常就不是问题。
vaxquis 2016年

-3

也许为时已晚,但是卡的响应还可以!在CMD0之后,响应必须为0x01-这意味着卡处于IDLE状态并可以工作。如果您有类似0b00000101之类的内容,则第二位的1表示这是非法命令,而在0位置的1则表示sard仍处于IDLE状态并可以工作。如果响应为0x00,则表示卡未处于空闲状态,您必须发送另一个RESET命令。


你有没有看过这个问题?OP明确表示I tried this, but I am getting 01 even for CDM1-让响应闲置CMD1 OK。您无法通过“答案”解决他的真正问题。
vaxquis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.