欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5067|回復: 0
收起左側

SD卡初始化及讀寫流程

[復制鏈接]
ID:104835 發表于 2016-2-1 00:27 | 顯示全部樓層 |閱讀模式
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碼通常設為0x00或0xFF。

讀多塊操作和寫多塊操作的傳輸停止形式不一樣,讀多塊操作時用用命令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卡協議就容易多了。


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表