1. 程式人生 > >SD卡初始化及讀寫流程

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碼通常設為0x000xFF


讀多塊操作和寫多塊操作的傳輸停止形式不一樣,讀多塊操作時用用命令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步順序不能顛倒。
最後說一下我的一點體會:SD卡就是一個儲存器,只不過用命令的方式來進行操作,我們只要掌握了各條命令及操作方式,就可以靈活的操作SD卡了,另外我所瞭解的IC卡也是類似的原理,還有就是建議開始看MMC的協議,簡單明瞭易懂些,有了對MMC卡的一些瞭解後看SD卡協議就容易多了。

相關推薦

SD初始流程

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

基於STC12C5A60S2的SDHC初始過程

最近學習一了下SD卡的驅動,網上程式的版本很多,使用的MCU和SD卡的型號千奇百怪,學起來反而沒有方向,感覺上亂七八糟的,直到現在才知到我們平常說的SD卡實際上有很多中類別。0到2G的SD卡,最普通的卡;2G到32G的SDHC卡,也就是現在最常用的大容量SD卡;還有我沒有見

Android SD簡單的檔案操作

Android SD卡簡單的檔案讀寫操作   最近有這樣的需求,把每次統計到的資料,以txt形式儲存到手機SD卡或是手機記憶體中,遇到一些問題,記錄下來。   首先如果要在程式中使用sdcard進行儲存,我們必須要在AndroidManifset.xml檔案進行下

Qualcomm平臺qcril初始訊息處理流程(原)

        本節主要來介紹Qcril的初始化流程以及訊息在Qcril中如何傳遞。         Android平臺不同廠商的AP側可以相同,但是Modem側肯定會有很大的差異,RIL層要解決一個問題就是適配不同廠商的Modem,為了達到相容性要求,Android在AP

HBase系列(二):HBase架構流程

本篇博文從分析HBase架構開始,首先從架構中各個組成部分開始,接著從HBase寫入過程角度入手,分析HFile的Compaction合併、Region的Split分裂過程及觸發機制。 架構分析 1、HMaster 負責管理HBase元資料,

Qualcomm平臺qcril初始訊息處理流程

        Android平臺不同廠商的AP側可以相同,但是Modem側肯定會有很大的差異,RIL層要解決一個問題就是適配不同廠商的Modem,為了達到相容性要求,Android在AP與Modem之間搭建了RILC的框架,由不同的Modem廠商將自己的協議連線到AP側。對於高通平臺來說,他的RILC就

node——1-node 的初始 檔案

node 初始化(helloworld) 新建 helloworld.js 檔案,內容如下: var foo = 'hello world!'; console.log(foo); // 在 node 中,採用 EcmaScript 進行編碼 // 沒有 BOM、DOM,和瀏覽

Exyons4412音訊驅動----初始之暫存器流程(一)

核心載入驅動: module_init(snd_soc_init);  載入完成之後進入:snd_soc_init() 初始化函式 static int __init snd_soc_init(void) { #ifdef CONFIG_DEBUG_FS snd_soc

CentOS7系統環境初始安裝的時候網改名為eth*

ati cfg iyu ios tcpdump log sysconfig emctl 更新 操作系統安裝: 將網卡名稱設置為eth*,不使用CentOS 7默認的網卡命名規則。所以需要在安裝的時候,增加內核參數。1. 光標選擇“Install CentOS 7”

NSQ原始碼分析(一)——nsqd的初始啟動流程

nsq原始碼地址:https://github.com/nsqio/nsq 版本1.1.0  NSQ原始碼分析系列是我通過閱讀nsq的原始碼及結合網上的相關文章整理而成,由於在網上沒有找到很詳細和完整的文章,故自己親自整理了一份。如果有錯誤的地方,還請指正,希望這系列的文章給您帶來

ili9486液晶驅動函式8位模式,使用PB0到PB7為資料口,初始點函式、點函式

void LCD_INIT_ILI9486(void) {     LCD_GPIOInit();          //************* Reset LCD Driver ****************//     LCD_RST_SET;    delay_m

HBase的Compact引數設定資料流程剖析-OLAP商業環境實戰

1 HBase Compact 功能剖析 Compaction會從一個region的一個store中選擇一些hfile檔案進行合併。合併說來原理很簡單,先從這些待合併的資料檔案中讀出KeyValues,

hadoop 之 hbase 原理 (hmaster, hregionserver, zookeeper, 流程元件職責)

目錄 1、體系圖 2、寫流程 3、flush過程 4、合併過程 5、讀過程 6、hmaster職責 7、hregionserver職責 8、client職責   1、體系圖 2、寫流程 client向hre

HBase-流程JavaAPI

1、讀寫流程 1.1、HBase 讀資料流程 1) HRegionServer 儲存著 meta 表以及表資料,要訪問表資料,首先 Client 先去訪問 zookeeper,從 zookeeper 裡面獲取 meta 表所在的位置資訊,即找到這個 meta 表在哪個 HRegionServ

BMP影象的結構和灰度

1.文件目的 本文件主要給出24位真彩BMP影象的結構、讀寫和灰度化方法。 2.一般BMP影象的結構 一般的bmp檔案的結結構主要包括檔案頭,BMP資訊頭,調色盤,點陣圖資料內容 (1)BMP檔案頭(14位元組) ,檔案的第0位元組到第13位元組為BMP影象的檔案

USB介面ID讀卡器oem軟體/測試程式原始碼/VB原始碼

詳細程式碼如下(如有疑問可13826029618進行相關提問並解答) '廣州榮士電子,,定製13826029618 地址:--www.icmcu.com '讀卡函式宣告Private Declare Function idr_read Lib "OUR_IDR.dl

R語言使用RMySQL連接Mysql數據庫

技術分享 fcm list adl 創建數據庫 package install sql安裝 packages 簡單說下安裝過程,一般不會有問題,重點是RMySQL的使用方式。 系統環境說明 Redhat系統:Linux 460-42.6.32-431.29.2.el6.

mysql 主從實戰分離

logs 啟動 毫秒 class -- systemctl position 讀寫 mas 1. MYSQL主從原理    1) 至少需要2臺數據庫服務器,一主一從,Master開啟bin-log功能用於記錄主庫增加、刪除、修改、更新SQL語句。   2) 異步復

Android 推斷SD是否存在容量查詢

rect hit block 容量 java sdc dia edi code 首先先要加入權限 <uses-permission android :name ="android.permission.MOUNT_UNMOUNT_FILESYSTEM

LWIP network interface 網 初始 以 STM32 為例子 後面會有 用 2G 或者4G 模塊 用 PPP撥號的 形式 虛擬出網 所以先以 這個為 前提

lan 函數 網卡 描述 ane details 我們 err img LWIP network interface 網卡 初始化 以 STM32 為例子 後面會有 用 2G 或者4G 模塊 用 PPP撥號的 形式 虛擬出網卡 所以先以 這個為