掌握與SD卡「交流」的方法

2021-09-24 11:28:04 字數 1599 閱讀 5985

很久以前寫出了微控制器讀寫sd卡的程式,前些日子拿出來用,發現不能直接用,自己寫的程式現在不能用,很是著急。後來是靜下心來,分析sd卡的反饋,修改相應的地方,很快就解決了問題。

有人說,給sd卡傳送cmd1,收到0x00表示成功。這是對的,但是如果收到0x01呢?0x04呢?0x0a呢?0x70呢?我認為這個返回值很重要,介紹給大家,希望可以幫助大家解決問題。(我先介紹這個與sd卡「交流」的方法,之後再介紹微控制器讀取sd卡整個過程)

在官方英文資料《sd卡協議》中,有一項很重要的介紹,sd卡的返回值。我們給sd卡發乙個訊號,sd卡有沒有收到?sd卡有沒有響應?是否符合sd卡協議?我們都可以從sd卡的返回值中得到sd卡想要「表達」的意思。

sd卡的乙個位元組返回值:

bit0:空閒狀態位—置位表示sd卡處於空閒狀態,正在初始化過程中。

bit1:擦除重置位—在執行接收到的擦除序列命令之前擦除序列被重置。

bit2:非法命令位—接收到的命令是非法的命令**(不符合sd卡協議命令**)。

bit3: crc錯誤位—當前命令的crc校驗失敗。

bit4:擦除序列錯誤位—在擦除序列命令中發生錯誤。

bit5:位址錯誤位—在命令中使用了乙個不匹配塊長度的位址。

bit6:引數錯誤位—當前命令的位址或塊長度超出了該sd卡的允許範圍。

bit7:預留。

掌握了這個sd卡的返回值,可以很清楚的知道自己的程式****出了問題,解決起來就很簡單。下面簡單介紹一下sd卡的復位,初始化,讀操作和寫操作。

復位:①拉高cs,傳送至少74個時鐘週期(等待同步);

②拉低cs,傳送cmd0(六個位元組命令,0x40,0x00,0x00,0x00,0x00,0x95),接收sd卡返回值,若返回值為0x01表示成功(具體含義對照上文中返回值介紹);

③拉高cs,傳送八個時鐘週期。

讀操作:①拉低cs,傳送cmd17(0x51,0x00,0x00,0x00,0x00,0xff);

②若返回值為0x00,則讀資料直至讀到0xfe(有效資料開始標誌位);

③讀取512個位元組的有效資料;

④讀取兩個crc位元組;

⑤拉高cs,傳送八個時鐘週期。

寫操作:①拉低cs,傳送cmd24(0x58,0x00,0x00,0x00,0x00,0xff);

②若返回值為0x00,則傳送0xfc(寫操作開始標誌位元組);

③繼續傳送512個位元組的有效資料;

④傳送兩個crc位元組0xff;

⑤讀取返回值直至讀到***00101(二進位制)表示512位元組資料寫入成功;

⑥進行查忙操作,直至返回值位0xff;

⑦拉高cs,傳送八個時鐘週期。

完成上述操作就基本完成了sd卡的驅動程式。之後會上傳自己編寫的基於飛思卡爾mc9s12xep100微控制器讀取8g 高速sdhc卡完整底層驅動程式(汽車級)。

修復sd卡的方法

最近在做6410的專案,其啟動方式是通過sd卡啟動.因此得做乙個比較方便使用的工具.winhex這款工具不錯,但是對sd卡操作來說不適合量產使用,更不適合一般人員操作,所以得 寫乙個讀寫sd卡的軟體,吧uboot等bootloader zimage寫入到sd卡中,從而實現接入sd卡後上電 自動完成b...

SD卡與MMC卡的區別

首先得從mmc卡的發展談起。mmc卡是由西門子設計,和sandisk合作開發的小型儲存卡標準。在1997年,作為使用快閃儲存器的儲存卡 i o卡或rom卡都可以 開始發售,日立和 ec,摩托羅拉,諾基亞等共同建立了 多 卡協會 並促進了標準 化和市場推廣。sandisk公司,也是在94年提出小型快閃...

sd卡的讀寫

sd卡全稱為 secrue digital memory card,具有輕巧 可加密 傳輸速度高 適用於手持裝置使用等優點。二 匯流排介面 sd需要高速讀寫,同時也要使手持等嵌入式裝置能方便使用,特設有兩個訪問介面中 sd 模式介面和spi 介面。sd卡在上電初期,卡主控通過檢測引腳 dat3 來決...