1.SD卡的命令格式:
SD卡的指令由6字節(Byte)組成,如下:
Byte1:0 1 x x x x x x(命令號,由指令標志定義,如CMD39為100111即16進制0x27,那么完整的CMD39第一字節為01100111,即0x27+0x40) Byte2-5:Command Arguments,命令參數,有些命令沒有參數 Byte6:前7位為CRC(Cyclic Redundacy Check,循環冗余校驗)校驗位,最后一位為停止位0
2.SD卡的命令
SD卡命令共分為12類,分別為class0到class11,
不同的SDd卡,主控根據其功能,支持不同的命令集 如下:
Class0 :(卡的識別、初始化等基本命令集)
CMD0:復位SD 卡.
CMD1:讀OCR寄存器.
CMD9:讀CSD寄存器.
CMD10:讀CID寄存器.
CMD12:停止讀多塊時的數據傳輸
CMD13:讀 Card_Status 寄存器
Class2 (讀卡命令集):
CMD16:設置塊的長度
CMD17:讀單塊.
CMD18:讀多塊,直至主機發送CMD12為止 .
Class4(寫卡命令集) :
CMD24:寫單塊.
CMD25:寫多塊.
CMD27:寫CSD寄存器 .
Class5 (擦除卡命令集):
CMD32:設置擦除塊的起始地址.
CMD33:設置擦除塊的終止地址.
CMD38: 擦除所選擇的塊.
Class6(寫保護命令集):
CMD28:設置寫保護塊的地址.
CMD29:擦除寫保護塊的地址.
CMD30: Ask the card for the status of the write protection bits
class7:卡的鎖定,解鎖功能命令集
class8:申請特定命令集 。
class10 -11 :保留
其中 class1, class3,class9:SPI模式不支持
了解了指令的形式和具體的控制內容,下面主要解決的就是MCU與SD卡的通信問題,通信主要需要注意下面的問題:
(1)供電電壓:必須是3.3V
(2) 通信模式的切換:SD卡有兩種通信模式:SPI模式和SD模式,默認情況下的通信模式是SD模式,但是我們常用的模式是SPI模式,這就需要一個切換模式的方法,具體的實現方法在其他地方也都有介紹,其關鍵的地方就是先上電延時大於74個時鍾周期后發送復位命令,復位成功(接收到0x01的響應)后,連續發送CMD55和ACMD41,直到響應0X00為止,此時SD卡已經進入SPI模式。
(3)上面所說的發送復位命令(CMD0)以及CMD55和ACMD41要有具體的實現方法,需要解決的就是時序問題,
下圖就為復位的時序圖,只要能夠按照下圖的時序進行操作,肯定能夠復位成功.
本復位分為(1)上電,(2)延時74個周期以上,(3)發送命令CMD0,(4)發送命令參數0X0000,(5)發送CRC校驗0X95,(6)等待響應(7)響應0X01此時得到正確響應復位成功,否則重復以上操作直到成功為止。
介紹復位的同時其他的命令也和復位命令類似,只是根據命令的作用不同有着不同的響應類型和不同的后續操作,下面給出集中常用命令的時序圖。
(1)讀CID寄存器時序圖

說明:當發送命令並得到響應0X00后就開始准備接收CID寄存器中的內容,此時只要接收到起始標志0XFE后,之后的16個字節的內容即為CID寄存器的內容。
(2)讀CSD寄存器內容時序和讀CID的類似,只是此時發送的命令為CMD9
SD卡數據的讀寫是以塊為單位:默認情況下一塊的大小為512字節
(3) 讀SD卡一個塊(512字節)時序

(4) 寫一個塊(512字節)時序圖
