实际上,您可能会在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模式初始化卡,您应该:
CMD0
arg:0x0
,CRC:0x95
(response:0x01
)-请注意,如果0xFF
发生响应或出现乱码,则只需重复此步骤;请参阅下面的更多信息。
CMD8
arg:0x000001AA
,CRC:(在这种情况下,0x87
response 0x01
:,然后是arg的回显0x000001AA
)-尽管此命令似乎是可选的,但对于较新的卡来说是完全必需的。虽然0x1AA
这里是一个普通的arg值,但实际上您也可以传递其他值;请参见第23页的“表7-5:CMD8在SPI模式下的卡操作”。规格中的108。
3a。CMD55
ARG:0x0
,CRC:有,0x65
其实(回应:0x01
; CMD55
作为前缀,以每 ACMD
;如果响应是0x05
,你有一个旧卡-重复CMD1
与ARG 0x0
[CRC 0xF9
]而非CMD55
/ ACMD41
)
3b。ACMD41
,arg:0x40000000
,CRC:0x77
实际上是任意值(请注意,此参数假定卡是HCS卡,通常是这种情况;对于较旧的卡,请使用0x0
arg [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拉高[高],只好过压/欠压一些销等) -只要给它一些时间,冲洗和重复次。以乱码的反应也是相当有时-如果你送了它几次,响应还是既不也没有,试着向前走。如果可行,那就很好了;如果没有- 可能是坏了。ñCMD0
0xFF
0x01
CMD8
请注意,设置了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卡进行任何实际事务处理之前将引脚置为低电平。
此外,虽然性能指标说,只有CMD0
和CMD8
应有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模式)
CMD8
事先发行就根本无法启动。另外,只要在合理范围内,时钟通常就不是问题。