找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5082|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

SD卡初始化及讀寫流程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104835 發(fā)表于 2016-2-1 00:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
SD卡調(diào)試關(guān)鍵點(diǎn):


1.      上電時(shí)要延時(shí)足夠長(zhǎng)的時(shí)間給SD卡一個(gè)準(zhǔn)備過程,在我的程序里是5秒,根據(jù)不同的卡設(shè)置不同的延時(shí)時(shí)間。SD卡初始化第一步在發(fā)送CMD命令之前,在片選有效的情況下首先要發(fā)送至少74個(gè)時(shí)鐘,否則將有可能出現(xiàn)SD卡不能初始化的問題。

2.      SD卡發(fā)送復(fù)位命令CMD0后,要發(fā)送版本查詢命令CMD8,返回狀態(tài)一般分兩種,若返回0x01表示此SD卡接受CMD8,也就是說此SD卡支持版本2;若返回0x05則表示此SD卡支持版本1。因?yàn)椴煌姹镜腟D卡操作要求有不一樣的地方,所以務(wù)必查詢SD卡的版本號(hào),否則也會(huì)出現(xiàn)SD卡無法正常工作的問題。

3.      理論上要求發(fā)送CMD58獲得SD卡電壓參數(shù),但實(shí)際過程中由于事先都知道了SD卡的工作電壓,因此可省略這一步簡(jiǎn)化程序。協(xié)議書上也建議盡量不要用這個(gè)命令。

4.      SD卡讀寫超時(shí)時(shí)間要按照協(xié)議說明書書上的給定值(讀超時(shí):100ms;寫超時(shí):250ms),這個(gè)值要在程序中準(zhǔn)確計(jì)算出來,否則將會(huì)出現(xiàn)不能正常讀寫數(shù)據(jù)的問題。我自己定義了一個(gè)計(jì)算公式:超時(shí)時(shí)間=(8/clk)*arg。

5.      2GB以內(nèi)的SD卡(標(biāo)準(zhǔn)卡)和2GB以上的SD卡(大容量卡)在地址訪問形式上不同,這一點(diǎn)尤其要注意,否則將會(huì)出現(xiàn)無法讀寫數(shù)據(jù)的問題。如標(biāo)準(zhǔn)卡在讀寫操作時(shí),對(duì)讀或?qū)懨盍钆飘?dāng)中的地址域符初值0x10,表示對(duì)第16個(gè)字節(jié)以后的地址單元進(jìn)行操作(前提是此SD卡支持偏移讀寫操作),而對(duì)大容量卡讀或?qū)懨盍钆飘?dāng)中的地址域符初值0x10時(shí),則表示對(duì)第16塊進(jìn)行讀寫操作,而且大容量卡只支持塊讀寫操作,塊大小固定為512字節(jié),對(duì)其進(jìn)行字節(jié)操作將會(huì)出錯(cuò)。

6.      對(duì)某一塊要進(jìn)行寫操作時(shí)最好先執(zhí)行擦出命令,這樣寫入的速度就能大大提高。進(jìn)行擦除操作時(shí)不管是標(biāo)準(zhǔn)卡還是大容量卡都按塊操作執(zhí)行,也就是一次擦除至少512字節(jié)。

7.      對(duì)標(biāo)準(zhǔn)卡進(jìn)行字節(jié)操作時(shí),起始和終止必須在一個(gè)物理扇區(qū)內(nèi),否則將不能進(jìn)行讀寫操作。實(shí)際操作過程中建議用塊操作以提高效率。不管是標(biāo)準(zhǔn)卡還是大容量卡一個(gè)讀寫命令只能對(duì)一個(gè)塊進(jìn)行操作,不允許跨物理層地址操作。

8.      在寫數(shù)據(jù)塊前要先寫入若干個(gè)dummy data字節(jié),寫完一個(gè)塊數(shù)據(jù)時(shí),主機(jī)要監(jiān)測(cè)MISO數(shù)據(jù)線,如果從機(jī)處于忙狀態(tài)這根數(shù)據(jù)線會(huì)保持低電平,這樣主機(jī)就可以根據(jù)這根數(shù)據(jù)線的狀態(tài)以決定是否發(fā)送下一個(gè)命令,在從機(jī)沒有釋放MISO數(shù)據(jù)線之前,主機(jī)絕對(duì)不能執(zhí)行其他命令,否則將會(huì)導(dǎo)致寫入的數(shù)據(jù)出錯(cuò),而且從機(jī)也不會(huì)響應(yīng)主機(jī)的命令。

9.      在SPI模式下,CRC校驗(yàn)是被忽略的,但依然要求主從機(jī)發(fā)送CRC碼,只是數(shù)值可以是任意值,一般主機(jī)的CRC碼通常設(shè)為0x00或0xFF。

讀多塊操作和寫多塊操作的傳輸停止形式不一樣,讀多塊操作時(shí)用用命令CMD12終止傳輸,而寫多塊操作時(shí)用Stop Tran Token(停止傳輸令牌,值為0xFD)終止傳輸。
----------------------------------------------------------------------------------------
1、
初始化步驟:
(1)   
延時(shí)至少74clock,等待SD卡內(nèi)部操作完成,在MMC協(xié)議中有明確說明。
(2)CS低電平選中SD卡。
(3)
發(fā)送CMD0,需要返回0x01,進(jìn)入Idle狀態(tài)
(4)為了區(qū)別SD卡是2.0還是1.0,或是MMC卡,這里根據(jù)協(xié)議向上兼容的原理,首先發(fā)送只有SD2.0才有的命令CMD8,如果CMD8返回?zé)o錯(cuò)誤,則初步判斷為2.0卡,進(jìn)一步發(fā)送命令循環(huán)發(fā)送CMD55+ACMD41,直到返回0x00,確定SD2.0卡初始化成功,進(jìn)入Ready狀態(tài),再發(fā)送CMD58命令來判斷是HCSD還是SCSD,到此SD2.0卡初始化成功。如果CMD8返回錯(cuò)誤則進(jìn)一步判斷為1.0卡還是MMC卡,循環(huán)發(fā)送CMD55+ACMD41返回?zé)o錯(cuò)誤,則為SD1.0卡,到此SD1.0卡初始成功,如果在一定的循環(huán)次數(shù)下,返回為錯(cuò)誤,則進(jìn)一步發(fā)送CMD1進(jìn)行初始化,如果返回?zé)o錯(cuò)誤,則確定為MMC卡,如果在一定的次數(shù)下,返回為錯(cuò)誤,則不能識(shí)別該卡,初始結(jié)束。
(5)CS拉高。
2、
步驟:
(1)   
發(fā)送CMD17(單塊)或CMD18(多塊)讀命令,返回0x00
(2)
   
接收數(shù)據(jù)開始令牌0xfe(或0xfc+正式數(shù)據(jù)512Bytes + CRC校驗(yàn)2Bytes
默認(rèn)正式傳輸?shù)臄?shù)據(jù)長(zhǎng)度是512Bytes,可用CMD16設(shè)置塊長(zhǎng)度。
3、
步驟:
(1)   
發(fā)送CMD24(單塊)或CMD25(多塊)寫命令,返回0x00
(2)
   
發(fā)送數(shù)據(jù)開始令牌0xfe(或0xfc+正式數(shù)據(jù)512Bytes + CRC校驗(yàn)2Bytes
4、

擦除步驟:
(1)   
發(fā)送CMD32,跟一個(gè)參數(shù)來指定首個(gè)要擦除的起始地址(SD手冊(cè)上說是塊號(hào))
(2)   
發(fā)送CMD33,,指定最后的地址
(3)   
發(fā)送CMD38,擦除指定區(qū)間的內(nèi)容
3步順序不能顛倒。
最后說一下我的一點(diǎn)體會(huì):SD卡就是一個(gè)存儲(chǔ)器,只不過用命令的方式來進(jìn)行操作,我們只要掌握了各條命令及操作方式,就可以靈活的操作SD卡了,另外我所了解的IC卡也是類似的原理,還有就是建議開始看MMC的協(xié)議,簡(jiǎn)單明了易懂些,有了對(duì)MMC卡的一些了解后看SD卡協(xié)議就容易多了。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表