SD MMC插口的規範之三 初始化及熱插拔檢測機制

2021-06-26 17:15:21 字數 2302 閱讀 6329

sd卡的技術是基於**********卡(mmc)格式上發展而來,sd卡與mmc卡保持著向上相容。sd卡的內部結構主要分兩部分:sd控制器和nand儲存器。

sd卡型別總共分成三種:mmc卡,結構類似sd卡,採用mmc協議;sd1.0,sd1.0卡最大支援2gbyte;sd2.0,sd2.0卡最大容量hcsd可達32gbyte。從mmc到sd1.0再到sd2.0協議是向上相容的。即mmc協議的指令可以操作sd1.0,sd2.0,同理sd1.0協議的命令可以操作sd2.0卡。

(1)硬體引腳封裝

sd卡介面:sd卡介面支援spi模式和sd模式。sd模式採用4線並行模式,作為多**儲存裝置為提高傳輸速度都會採用這種介面。而spi更方便低端mcu訪問傳輸速度有限。

(2)sd協議命令格式

我們來了解一下sd卡協議命令的格式,mmc卡只有基本命令,即cmd0-cmd38,當然這中間不是連續。sd卡有基本命令和特定命令,特定命令必須跟在基本命令cmd55後面,即要想用特定命令,必須先發一條cmd55通知sd卡,然後才能傳送特定的命令。每條命令由6byte組成,分三部分,1位元組為操作碼,2-5位元組為引數,有的命令沒有引數,那就填0,有引數的根據引數說明而定,最後一位元組為crc校驗,不過spi模式不需要crc校驗,故可以任意填寫,不過有幾個特殊命令有指定的crc校驗碼,必須加上。每條命令都有響應,根據命令的不同可能有r1,r1b,r2,r3(ocr)暫存器響應,通過它們判斷命令是否操作成功。

(3)初始化及讀操作、寫操作、擦操作

對命令有了解後,只要知道各個操作的過程就可以操作sd卡了,主要操作有初始化、讀、寫、擦除等,下面分別介紹:

a,初始化:

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拉高。

b,讀步驟:

1,傳送cmd17(單塊)或cmd18(多塊)讀命令,返回0x00。

2,接收資料開始令牌0xfe(或0xfc)+正式資料512bytes + crc校驗2bytes,預設正式傳輸的資料長度是512bytes,可用cmd16設定塊長度。

c,寫步驟:

1,傳送cmd24(單塊)或cmd25(多塊)寫命令,返回0x00。

2,傳送資料開始令牌0xfe(或0xfc)+正式資料512bytes + crc校驗2bytes。

d,擦除步驟:

1,傳送cmd32,跟乙個引數來指定首個要擦除的起始位址(sd手冊上說是塊號)。

2,傳送cmd33,,指定最後的位址。

3,傳送cmd38,擦除指定區間的內容。

e,總之,sd卡就是乙個儲存器,只不過用命令的方式來進行操作,我們只要掌握了各條命令及操作方式,就可以靈活的操作sd卡了。

(4)熱插拔檢測

sd卡的檢測一共有三種方法: 

1, 在開機的時候通過cmd傳送命令檢測t卡是否存在,這種方式不支援熱插拔。

2,通過t卡座來檢測,訊號tcard_detect連在中斷控制器上。在沒有插卡時,tcard_detect訊號為低電平。插入t卡後,訊號 tcard_detect 被拉高為高電平,從而產生乙個中斷。即實現了熱插拔。注意:由低到高或者由高到低的觸發,是由硬體和軟體共同協作,是可以設定的。

3,通過cd/dat3 訊號來檢測,cd/dat3 訊號連在中斷控制器上,並通過470k電阻下拉,在沒有t卡插入時,該訊號為低電平,一但有t卡插入,t卡內部通過50kohm把 data3 訊號拉高至高電平,隨即產生乙個中斷,實現了熱插拔。該pin腳的說明如下:

具體到實踐中,我們會發現dat3/cd不同的應用場合。有的電路圖中cd/dat3 訊號有下拉,有的沒有下拉。如果t卡卡座設計在電池下面的話,就沒有熱插拔的需求,只要在開機的時候檢測一下有沒有t卡就可以了,這時候 cd/dat3 訊號就不需要下拉電阻了,如圖a。當t卡卡座設計在機身外面的時候,就需要支援熱插拔了,需要接下拉電阻,如圖b。

a,b,

這樣就比較清晰。

參考原文:

參考:

初始化 關於tensorflow的初始化

在寫mnist手寫體識別任務 已放github 時遇到的 問題 我們都知道在session run的時候需要初始化。但是初始化在什麼位置是至關重要的。來看下這段 sess tf.session sess.run tf.global variables initializer mnist model ...

Uber Go 語言程式設計規範 初始化 Maps

對於空的 maps,請使用make 初始化,並且以程式設計的方式填充的。這使得map的初始化在表現上不同於宣告,並且可以方便地在以後新增容量大小提示 如果有的話 badvar m1 可以安全的讀寫 m2 在寫時會panic m1 map t1 t2 m2 map t1 t2 宣告和初始化看起來非常相...

初始化列表成員變數的初始化

對於以下程式 include using namespace std class base base b 0 a b int get a int get b int main 本想得到的結果是a,b都為90。但是實際結果卻是 4273046 90process returned 0 0x0 exec...