公司目前項目軟t卡功能只支持2g以下的t卡。但聽說有的廠家已經實現了對2g以上sdhc卡的讀寫。於是想嘗試看能不能通過修改代碼的方式實現對sdhc卡的讀寫。上網搜索了下相關知識。普通的t卡和sdhc卡的區別主要有以下幾點:
1.在對t卡復位後,如果要實現對sdhc卡的讀寫操作,必須要先發出cmd8命令cmd8[]= {0x48,0x00,0x00,0x01,0xaa,0x87};
2.其後對卡進行激活操作時,所發出的cmd1命令也有區別CMD1[]={0x41,0x40, 0x00, 0x00, 0x00, 0xff};否則可能導致在激活sdhc卡時失敗.
3.獲取卡的容量大小時,通過讀取CSD參數從而計算出卡的容量大小,在這裏普通t卡與sdhc卡也不相同,在此簡單列出sdhc的block容量計算方法:
c_size = csdbuf[7]&0x3f;
c_size <<= 8;
c_size |= csdbuf[8];
c_size <<= 8;
c_size |= csdbuf[9];
c_size++;
gSpiSd_Handle->sds.block_num =c_size*1024;
4.在ReadSectors和writeSector時,sdhc卡和普通的卡傳遞的命令地址參數也是不相同的,普通的t卡的地址參數是Sector * 512,而sdhc直接傳遞Sector 即可.
根據以上列出的4點,在代碼中做了相應的修改,調試了一下,順利實現了對金士頓的4gt卡的讀寫.當然,如果要達到量產要求,還得做更多的修改完善.