學(xué)習(xí)STM32之SD卡總結(jié)
調(diào)試關(guān)鍵點(diǎn):
1. 上電時要延時足夠長的時間給SD卡一個準(zhǔn)備過程,在我的程序里是5秒,根據(jù)不同的卡設(shè)置不同的延時時間。SD卡初始化第一步在發(fā)送CMD命令之前,在片選有效的情況下首先要發(fā)送至少74個時鐘,否則將有可能出現(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卡的版本號,否則也會出現(xiàn)SD卡無法正常工作的問題。
3. 理論上要求發(fā)送CMD58獲得SD卡電壓參數(shù),但實(shí)際過程中由于事先都知道了SD卡的工作電壓,因此可省略這一步簡化程序。協(xié)議書上也建議盡量不要用這個命令。
4. SD卡讀寫超時時間要按照協(xié)議說明書書上的給定值(讀超時:100ms;寫超時:250ms),這個值要在程序中準(zhǔn)確計算出來,否則將會出現(xiàn)不能正常讀寫數(shù)據(jù)的問題。我自己定義了一個計算公式:超時時間=(8/clk)*arg。
5. 2GB以內(nèi)的SD卡(標(biāo)準(zhǔn)卡)和2GB以上的SD卡(大容量卡)在地址訪問形式上不同,這一點(diǎn)尤其要注意,否則將會出現(xiàn)無法讀寫數(shù)據(jù)的問題。如標(biāo)準(zhǔn)卡在讀寫操作時,對讀或?qū)懨盍钆飘?dāng)中的地址域符初值0x10,表示對第16個字節(jié)以后的地址單元進(jìn)行操作(前提是此SD卡支持偏移讀寫操作),而對大容量卡讀或?qū)懨盍钆飘?dāng)中的地址域符初值0x10時,則表示對第16塊進(jìn)行讀寫操作,而且大容量卡只支持塊讀寫操作,塊大小固定為512字節(jié),對其進(jìn)行字節(jié)操作將會出錯。
6. 對某一塊要進(jìn)行寫操作時最好先執(zhí)行擦出命令,這樣寫入的速度就能大大提高。進(jìn)行擦除操作時不管是標(biāo)準(zhǔn)卡還是大容量卡都按塊操作執(zhí)行,也就是一次擦除至少512字節(jié)。
7. 對標(biāo)準(zhǔn)卡進(jìn)行字節(jié)操作時,起始和終止必須在一個物理扇區(qū)內(nèi),否則將不能進(jìn)行讀寫操作。實(shí)際操作過程中建議用塊操作以提高效率。不管是標(biāo)準(zhǔn)卡還是大容量卡一個讀寫命令只能對一個塊進(jìn)行操作,不允許跨物理層地址操作。
8. 在寫數(shù)據(jù)塊前要先寫入若干個dummy data字節(jié),寫完一個塊數(shù)據(jù)時,主機(jī)要監(jiān)測MISO數(shù)據(jù)線,如果從機(jī)處于忙狀態(tài)這根數(shù)據(jù)線會保持低電平,這樣主機(jī)就可以根據(jù)這根數(shù)據(jù)線的狀態(tài)以決定是否發(fā)送下一個命令,在從機(jī)沒有釋放MISO數(shù)據(jù)線之前,主機(jī)絕對不能執(zhí)行其他命令,否則將會導(dǎo)致寫入的數(shù)據(jù)出錯,而且從機(jī)也不會響應(yīng)主機(jī)的命令。
9. 在SPI模式下,CRC校驗(yàn)是被忽略的,但依然要求主從機(jī)發(fā)送CRC碼,只是數(shù)值可以是任意值,一般主機(jī)的CRC碼通常設(shè)為0x00或0xFF。
讀多塊操作和寫多塊操作的傳輸停止形式不一樣,讀多塊操作時用用命令CMD12終止傳輸,而寫多塊操作時用Stop Tran Token(停止傳輸令牌,值為0xFD)終止傳輸。
評論