SD卡讀寫 Verilog實現SD卡讀寫

2021-09-26 01:47:55 字數 2009 閱讀 8660

目前常見的sd卡有兩種形式,一種是標準的sd卡,另外一種是tf卡,無論標準的sd卡或者tf卡,其基本協議是相同的,因此對於程式設計來說,這兩種型別的sd卡的讀寫方式是相同的。

針對兩種不同型別的sd卡,其引腳介面訊號定義如下圖所示:

標準sd卡:

tf卡:

對於上述的兩種型別的sd卡,都支援兩種操作模式,分別是sd模式和spi模式,通過這兩種模式都可以實現對sd卡的讀寫,本文主要介紹現在常用的spi模式。而sd卡的引腳介面在不同的模式下分別表示不同的功能,具體方式如下表所示:

因此,對於spi模式,除電源和地訊號外,我們只需要四個資料線分別是clk、cs、miso和mosi,對應sd的介面分別是clk、cs/dat3、dat0和cmd。

我們在實際應用中,常用的一些重要的sd命令及其響應資料格式如下:

首先延時74個clk(spi時鐘頻率是25mhz),等到sd卡內部操作完成;

片選cs低電平選中sd卡;

然後傳送cmd0( )命令,需要得到返回值0x01,進入idle狀態;

然後進入卡型別檢驗,為了檢驗卡的型別,首先傳送只有v2.0版的sd卡才具有的命令cmd8( ),然後檢測返回值;

返回值若是0x01,則表示此卡為v2.0卡,然後再傳送迴圈命令cmd55()+acmd41(),直到返回0x00,確定sd2.0卡初始化成功;然後再傳送cmd58命令,接收返回的ocr 暫存器的資料,其中第31位用於判斷v2.0的卡是否為sdhc型別(初始化成功後,也可以不驗證是否為sdhc型別)。

若返回值不為0x01,則進一步判斷是v1.0卡還是mmc卡;先傳送迴圈命令cmd55+acmd41,如果返回0x00,則為v1.0卡並且初始化成功;

否則考慮是mmc卡,再使用cmd1進行初始化,如果無返回錯誤,則表明是mmc卡並且初始化成功;否則表示是無法識別的卡。

從上面的初始化過程可以看出主要涉及到幾個特殊的命令:cmd8、cmd55、acmd41和cmd58。對於cmd55和acmd41的講解,有很多文章都有,不多解釋,此復位命令的返回值和cmd1的返回值相同,成功復位時返回0x00;對於cmd58,其命令碼格式是標準格式,其中資料填充0即可,crc也可省略,只要最後加上停止位『1』即可,不作詳解;其返回值為r3型別,首先接收到乙個位元組應該為0x00,表示sd卡響應命令成功,然後接收4位元組的ocr暫存器值;ocr暫存器的第30位(ccs)指示了卡的型別是否為sdhc,此位為1則為sdhc,為0則為sdsc;

其中,cmd17 指令的具體內容是 ;sec_i是乙個32bit的資料,表示的是讀sd卡的扇區的位址。

其中,cmd24 指令的具體內容是 ;sec_i是乙個32bit的資料,表示的是寫sd卡的扇區的位址。

sd卡的讀寫

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

SD卡中讀寫檔案

在往sd卡中讀寫檔案時,遇到一些問題 當我們想要往sd卡中寫檔案時,檔名為 file targetfile new file environment getexternalstoragedirectory getcanonicalpath test.bin 一定要記得加 不然會出現錯誤.在看瘋狂安卓...

SD儲存卡讀寫速度比較

前一段時間給我的手機配了一張512mb的minisd卡,可惜用了乙個多月就壞了,只好退回換新卡,經過了乙個月時間於今年元月初終於又回到我手中。之前用過好幾個快閃儲存器卡,用了幾年一點問題也沒有,這次買的minisd卡壞的這麼快,讓我以為快閃儲存器卡不會壞的想法也完全沒有了。用atto disk be...