我有一个32 GB的金士顿SDHC microSD卡,它必须通过SPI与MSP430F2618通信.我无法使用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)
Run Code Online (Sandbox Code Playgroud)
我也尝试使用8 GB SanDisk卡,也适用于此.所以实际上,我在这里使用CMD1,而不是ACMD41,HCS位设置为1.但是,它不稳定,有时它可以工作,有时却不行.这可能与硬件有关.
卡片用参数响应CMD1并不奇怪0x40000000吗?
小智 9
您不应该使用CMD1初始化SDHC卡; 如SD卡规范中所述:
在任何情况下都不建议使用CMD1,因为主机可能难以区分MultiMediaCard和SD存储卡.
一些控制器(大多数更新和更高容量的卡)如果你CMD1向它们发出问题,它们就会处于空闲状态.你应该先CMD8 0x1AA在reset(CMD0)之后发出,然后再使用CMD55 + ACMD41.
tl; dr来初始化你应该:
CMD0ARG:0x0,CRC: 0x95(响应:0x01)
CMD8ARG:0x000001AA,CRC: 0x87(响应:0x01)
CMD55arg:0x0,CRC:any(CMD55作为每个 的前缀ACMD)
ACMD41,arg : 0x40000000, CRC:任何
如果回应:0x0你没事; 如果是的话0x1,转到3.
请注意,大多数卡需要的步骤3/4重复,一般一次,即在实际的序列CMD0/ CMD8/ CMD55/ ACMD41/ CMD55/ ACMD41-可以肯定,尝试n时间(选择n您的合理范围内),并假设如果没有失败.
此外,请注意,你应该断言SS(又名CS)低的至少前后CMD0-发送任何命令到SD卡时,在现实中,可能永远.