SD卡的控制方法與時序
1
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要有具體的實現方法,需要解決的就是時序問題,
2
下圖就為復位的時序圖,只要能夠按照下圖的時序進行操作,肯定能夠復位成功.
SD卡的復位和初始化
當 SD 卡完成上電後,主機FPGA先對從機SD卡傳送74 個以上的同步時鐘(且保持拉高CS和(CMD)IN),然拉低CS,然後向SD 卡傳送第1位元組的命令字CMD0 命令(因命令號的最高位始終為0,次高位為1,因此傳送給SD 卡的命令是0 與0x40 進行或運算的結果)。命令字的第2、3、4、5 位元組皆為0x00。命令字的第6 位元組為CRC 校驗位元組,固定為0x95。
主機FPGA命令字傳送完成後,傳送若干個8 位的同步時鐘(即FPGA等待),直至FPGA接收到SD 卡發出響應位元組0x01。接收完SD 卡的響應位元組後,主機FPGA把CS 線拉高,再發送8 個空時鐘,復位過程完成。
當 SD卡執行完復位過程後,主機FPGA接著向從機SD卡傳送初始化指令CMD1,以啟用SD 卡SPI 方式。
首先發送指令號CMD1(0x01|0x40=0x41),然後傳送4 個0x00 位元組,最後傳送CRC 校驗碼,此處為0xFF,原因是此時SD卡已經工作在SPI 模式,在SPI 模式下,SD卡預設為不進行CRC 校驗,因此我們可以隨意寫入一個0xFF位元組以填充滿整個命令字的結構。
當主機FPGA向SD卡傳送完CMD1 指令後,傳送若干個8 位的同步時鐘(即FPGA等待),直至FPGA接收SD卡發出響應位元組0x00。接收完SD卡的響應位元組後,FPGA拉高CS線,再發送8個空時鐘,初始化過程完成。
至此,完成了SD卡的復位、初始化而進入到SPI方式的所有步驟。
3
五、SD卡的SPI方式讀寫
SD卡讀寫一次的資料量必須為512 位元組的整數倍,亦即,對SD卡讀寫操作的最少資料量為512 位元組。我們也可以通過向SD 卡寫修改扇區大小的指令CMD16(CMD16—為接下來的塊操作指令設定塊長度)以使每次讀寫的資料量變為(n×512)位元組(n≥1),本文中我們使用SD卡預設的一次操作512 位元組的模式對SD 卡進行讀寫操作。
對SD卡讀操作的時序為:
(1) 寫入讀單資料塊命令CMD17(0x11|0x40=0x51)。
(2) 寫4 個地址引數,4 個位元組湊成一個32 位的地址值,第一個位元組是32 位地址值的最高8 位資料,第4 個位元組 是32 位地址值的最低8 位資料。(與寫操作不同)
(3) 寫CRC 校驗位0xFF。
(4) 寫若干個0xFF 的空操作。
(5) SD 卡傳送0x00 響應。
(6) 寫若干個0xFF 的空操作(等待)。
(7) SD 卡傳送0x FE 資料頭。
(8) SD 卡傳送指令指定地址的512 位元組資料塊。
(9) SD 卡傳送兩位元組的CRC 校驗碼,由於SPI 模式預設不需要CRC 校驗,因此這兩個位元組的資料可丟棄不用。
(10)拉高CS,傳送8 個空時鐘。
至此,完成了對SD卡指定地址資料塊的讀操作。
對SD卡寫操作的時序為:
(1) 寫入讀單資料塊命令CMD24(0x18|0x40=0x58)。
(2) 寫4 個地址引數,4 個位元組湊成一個32 位的地址值,第一個位元組是32 位地址值的最低8 位資料,第4 個位元組 是32 位地址值的最高8位資料。(與讀操作不同)
(3) 寫CRC 校驗位0xFF。
(4) 寫若干個0xFF 的空操作。
(5) SD 卡傳送0x00 響應。
(6) 寫若干個0xFF 的空操作。
(7) 寫0x FE 資料頭,表示接下來要傳送512 位元組的資料塊。
(8) 寫512 位元組資料塊。
(9) 寫兩位元組的0xFF 作為CRC 校驗碼的填充位元組。
(10)SD 卡傳送xxx00101B 響應碼。
(11)在SD 卡將512 位元組資料向指定地址寫完之前,其資料輸出斷時鐘被拉低。
(12)SD 卡釋放資料輸出線DataOut。
(13)拉高CS,傳送8 個空時鐘。
至此,完成了對SD 卡指定地址資料塊的寫操作。