我有一张32 GB的Kingston SDHC microSD卡,必须通过MSP430F2618与SPI进行通信。我无法使用CMD55 + ACMD41(bit30设置为1)对其进行初始化,如SD规范文件中所述。有效的是这个序列:
CMD0, arg: 0 , CRC: 0x95 (response:0x01)
CMD8, arg: 0x1AA , CRC: 0x87 (response:0x01)
CMD1, arg: 0x40000000, CRC: 0xFF (response:0x00)
我也尝试使用8 GB的SanDisk卡,也适用于此。所以实际上,我在这里使用CMD1,而不是ACMD41,HCS位设置为1.但是,它不稳定,有时它可以工作,有时却不行。这可能与硬件有关。
卡片使用参数0x40000000
响应CMD1并不奇怪吗?
答案 0 :(得分:9)
您不应使用CMD1
初始化SDHC卡;如SD卡规范中所述:
在任何情况下都不建议使用CMD1,因为主机可能难以区分MultiMediaCard和SD存储卡。
如果向CMD1
发出CMD8 0x1AA
,某些控制器(大多数是较新的和较高容量的卡)只会处于空闲状态。
您应该在重置后CMD0
发出CMD55 + ACMD41
,然后使用CMD0
。
tl; dr 初始化您应该使用的卡片:
0x0
arg:0x95
,CRC:0x01
(回复:CMD8
)
0x000001AA
arg:0x87
,CRC:0x01
(回复:CMD55
)
0x0
arg:CMD55
,CRC:任意(ACMD
是每个 ACMD41
的前缀)
0x40000000
,arg:0x0
,CRC:any
如果回复:0x1
,你没事;如果是CMD0
,请转到3。
请注意,大多数卡需要步骤3/4重复,通常一次,即实际序列为CMD8
/ CMD55
/ ACMD41
/ { {1}} / CMD55
/ ACMD41
- 当然,请尝试n
次(在您的理由中选择n
),如果不是,请假设失败。
另外,请注意,您应该在CMD0
之前和之后至少在处声明SS(也称为CS)低 - 实际上,可能始终在向SD卡发送任何命令时。