天天看點

SD 卡初始化流程

SD卡調試關鍵點:

1.      上電時要延時足夠長的時間給 SD 卡一個準備過程,在我的程式裡是 5 秒,根據不同的卡設定不同的延時時間。 SD 卡初始化第一步在發送 CMD 指令之前,在片選有效的情況下首先要發送至少 74 個時鐘,否則将有可能出現 SD 卡不能初始化的問題。

2.      SD 卡發送複位指令 CMD0 後,要發送版本查詢指令 CMD8 ,傳回狀态一般分兩種,若傳回 0x01 表示此 SD 卡接受 CMD8, 也就是說此 SD 卡支援版本 2 ;若傳回 0x05 則表示此 SD 卡支援版本 1 。因為不同版本的 SD 卡操作要求有不一樣的地方,是以務必查詢 SD 卡的版本号,否則也會出現 SD 卡無法正常工作的問題。

3.      理論上要求發送 CMD58 獲得 SD 卡電壓參數,但實際過程中由于事先都知道了 SD 卡的工作電壓,是以可省略這一步簡化程式。協定書上也建議盡量不要用這個指令。

4.      SD 卡讀寫逾時時間要按照協定說明書書上的給定值 ( 讀逾時: 100ms ;寫逾時: 250ms) ,這個值要在程式中準确計算出來,否則将會出現不能正常讀寫資料的問題。我自己定義了一個計算公式:逾時時間 =( 8/clk )*arg 。

5.      2GB 以内的 SD 卡 ( 标準卡 ) 和 2GB 以上的 SD 卡 ( 大容量卡 ) 在位址通路形式上不同,這一點尤其要注意,否則将會出現無法讀寫資料的問題。如标準卡在讀寫操作時,對讀或寫指令令牌當中的位址域符初值 0x10 ,表示對第 16 個位元組以後的位址單元進行操作 ( 前提是此 SD 卡支援偏移讀寫操作 ) ,而對大容量卡讀或寫指令令牌當中的位址域符初值 0x10 時,則表示對第 16 塊進行讀寫操作,而且大容量卡隻支援塊讀寫操作,塊大小固定為 512 位元組,對其進行位元組操作将會出錯。

6.      對某一塊要進行寫操作時最好先執行擦出指令,這樣寫入的速度就能大大提高。進行擦除操作時不管是标準卡還是大容量卡都按塊操作執行,也就是一次擦除至少 512 位元組。

7.      對标準卡進行位元組操作時,起始和終止必須在一個實體扇區内,否則将不能進行讀寫操作。實際操作過程中建議用塊操作以提高效率。不管是标準卡還是大容量卡一個讀寫指令隻能對一個塊進行操作,不允許跨實體層位址操作。

8.      在寫資料塊前要先寫入若幹個 dummy data 位元組,寫完一個塊資料時,主機要監測 MISO 資料線,如果從機處于忙狀态這根資料線會保持低電平,這樣主機就可以根據這根資料線的狀态以決定是否發送下一個指令,在從機沒有釋放 MISO 資料線之前,主機絕對不能執行其他指令,否則将會導緻寫入的資料出錯,而且從機也不會響應主機的指令。

9.      在 SPI 模式下, CRC 校驗是被忽略的,但依然要求主從機發送 CRC 碼,隻是數值可以是任意值,一般主機的 CRC 碼通常設為 0x00 或 0xFF 。

讀多塊操作和寫多塊操作的傳輸停止形式不一樣,讀多塊操作時用用指令 CMD12 終止傳輸,而寫多塊操作時用 Stop Tran Token( 停止傳輸令牌,值為 0xFD) 終止傳輸。

----------------------------------------------------------------------------------------

1、

初始化 步驟:

(1)    

延時至少 74clock,等待SD卡内部操作完成,在MMC協定中有明确說明。

(2)CS低電平選中SD卡。

(3) 發送 CMD0 ,需要傳回 0x01 ,進入 Idle 狀态

(4) 為了差別SD卡是2.0還是1.0,或是MMC卡,這裡根據協定向上相容的原理,首先發送隻有SD2.0才有的指令CMD8,如果CMD8傳回無錯誤,則初步判斷為2.0卡,進一步發送指令循環發送 CMD55+ACMD41 ,直到傳回 0x00 ,确定SD2.0卡初始化成功,進入Ready 狀态,再發送CMD58指令來判斷是HCSD還是SCSD,到此SD2.0卡初始化成功 。如果CMD8傳回錯誤則進一步判斷為1.0卡還是MMC卡,循環發送CMD55+ACMD41 ,傳回無錯誤,則為SD1.0卡,到此SD1.0卡初始成功,如果在一定的循環次數下,傳回為錯誤,則進一步發送CMD1進行初始化,如果傳回無錯誤,則确定為MMC卡,如果在一定的次數下,傳回為錯誤,則不能識别該卡,初始結束。

(5)CS拉高。

2、

讀 步驟:

(1)    

發送 CMD17 (單塊)或 CMD18 (多塊)讀指令,傳回 0x00

(2)    

接收資料開始令牌 0xfe (或 0xfc ) + 正式資料 512Bytes + CRC 校驗 2Bytes

預設正式傳輸的資料長度是 512Bytes ,可用 CMD16 設定塊長度。

3、

寫 步驟:

(1)    

發送 CMD24 (單塊)或 CMD25 (多塊)寫指令,傳回 0x00

(2)    

發送資料開始令牌 0xfe (或 0xfc ) + 正式資料 512Bytes + CRC 校驗 2Bytes

4、

擦除 步驟:

(1)    

發送 CMD32 ,跟一個參數來指定首個要擦除的起始位址( SD 手冊上說是塊号)

(2)    

發送 CMD33, ,指定最後的位址

(3)    

發送 CMD38 ,擦除指定區間的内容

此 3 步順序不能颠倒。

繼續閱讀