SD卡初始化步驟詳解

2021-07-25 09:53:22 字數 1361 閱讀 4088

硬體平台:飛思卡爾s12xep100

開發環境:codewarrior 5.2

結果:批量儲存穩定

最近在做檔案系統的公升級,先前用的是21ic論壇上面down的znfat,相信做微控制器軟體的兄弟們應該都知道。

後來用的過程中發現此檔案系統超時機制做的不是很好,而且不精簡,會占用比較大的ram和flash,產品用了幾個月後,決定公升級一下檔案系統,後來就發現了fatfs。

這裡先從sd卡的初始化說起吧,只說初始化流程以及一些細節問題(spi模式)。

1、第一步,在將spi模組初始化好之後,將spi速度設為低速模式,我這裡用的是250k

2、保持select腳為高電平,並向sd卡傳送不低於74個時鐘脈衝,此時sd卡將進入它的native operation mode(翻譯為本地操作模式了),並做好接收本地指令的準備。

3、此時將select腳拉低並向sd卡傳送cmd0指令,sd卡在檢測到select腳為低並收到cmd0指令後將進入spi模式,並返回0x01空閒狀態。

4、成功進入空閒狀態後,繼續傳送cmd8指令,攜帶的引數為0x000001aa,如果sd卡不能識別並返回錯誤碼5,說明此卡非2.0卡(進入步驟6)。如果指令能被識別,則sd卡將返回r1+32位共40位資料,其中r1位0x01,32位資料為0x000001aa。此時可判斷卡為2.0卡。

5、判斷為2.0卡後,緊接著傳送cmd55+acmd41指令(應該是在cmd55返回1的情況下再接著傳送acmd41),如果返回0,則初始化成功。此時如果你想繼續判斷是標準2.0卡scsd還是大容量hcsd,則需要繼續傳送cmd58指令,並在cmd58指令被成功響應後連續從sd卡讀取4個位元組的ocr資料,若其第31位為1,表示初始化成功,其第30位為1表示是hcsd,為0表示scsd。 此時2.0卡初始化結束。

6、步驟4對cmd8無響應,則繼續判斷卡為1.0或mmc卡。此時同步驟5一樣向卡傳送cmd55+acmd41指令,如果返回0,則表示1.0卡初始化成功,如果返回錯誤,則確定卡為mmc卡。 在確定卡為mmc卡後,繼續向卡傳送cmd1指令,如果返回0,則mmc卡初始化成功,否則失敗,判斷為錯卡!!

7、初始化成功後,將spi切換為高速模式,我這裡用的是4m。

至此,sd卡初始化過程就結束了,記得幾點:在傳送cmd函式後,記得補償時鐘;在讀暫存器位時,需要select拉低;初始化時,一定要是低速模式並且有超過74個時鐘脈衝!

注:在測試的過程中,也是遇到了些比較蛋疼的問題,我手裡有3張卡,2張8ghc,1張2gsc。這兩張8g卡在讀ocr時,其最高位元組一直返回0x80,也就是說從ocr上面判斷不出是hc大容量卡,那張2g卡返回也是0x80是正常的。  於是找啊找查啊查,究竟是**出問題了。最後實在是差不出來,重新買了個新的hc,還好,果然成功了,ocr最高位元組終於為0xc0。 所以說就是提醒大家在測試過程中,多找些,多對比現象。

SD卡初始化

傳送指令時可能會有狀態轉換,尤其是初始化時。指令分為兩類 一類為通用指令,另一類為針對某種卡的特定指令,但特定指令的實際數可以通用指令相同,所以cmd55 特定指令來傳送特定指令,1 傳送cmd0指令 go idle state 卡進入idle狀態 2 傳送指令cmd8 send if cond 如...

SD卡初始化以及識別過程

sd卡上電後進入sd模式,如果sd卡在接收cmd0命令時cs為低,則sd卡進入spi模式,並且應答為r1應答,sd卡處於idle狀態,回到sd模式的唯一方法就是重新上電。spi模式初始化 1.上電後主機應傳送至少74個時鐘,在這期間應保持cs為 高電平,然後sd卡進入idle模式。2.傳送cmd0命...

STM32初始化SD卡流程

1,初始化sdio外設,關閉sdio時鐘。2,上電,開啟時鐘,注意此時時鐘應不能超過400khz,且此時是只有一位資料線,要到初始化完成後再調時鐘與資料線寬度。3,延時最低74個時鐘週期。使時鐘與sd卡穩定,否則會出錯。4,傳送cmd0,需要返回0x01,進入idle狀態 5,為了區別sd卡是2.0...