这几天一直在调大容量SDHC卡的驱动,期间遇到一些问题,现在只调好一张4G容量的卡,8G容量的卡还不行。
不得不感叹SD卡协议的混乱和兼容性之差。特别是命令响应这部分,看了很多文档,还是云里雾里。期间参考正点原子的SPI驱动SDHC的例子,那例子里判断CMD17的正确响应应该是0x00,然而在Verilog代码里一直不起作用,最后参考了特权的代码应该为0xfe,我查了些文档,也没查出个所以然。
还有SD卡的逻辑地址和物理地址一定要分清楚,而且2GB以内的标准卡和2GB以上的HC卡在地址访问形式上是不同的。这一点很重要:标准卡在读写操作时,命令中的地址参数是以字节为单位寻址的,而HC则是以块为单位进行寻址的。
在SPI模式CRC校验是被忽略的,但仍然要求主从机发送CRC码,数值可以为任意值。读多块操作和写多块操作的传输停止形式也不一样,读多块时用命令CMD12终止传输,写多块操作时用Stop Tran Token(停止传输令牌,值为0xFD)来终止传输。
在ACMD41命令响应无效时,应重复多次发送CMD55+ACMD41命令,直到响应超时(这时应该检查硬件问题和之前的初始化步骤(比如上电等待SD卡就绪的延时是不是足够等等,我这里设置为2ms))。