SDMMC卡初始化及讀寫流程_第1頁
SDMMC卡初始化及讀寫流程_第2頁
SDMMC卡初始化及讀寫流程_第3頁
SDMMC卡初始化及讀寫流程_第4頁
SDMMC卡初始化及讀寫流程_第5頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、二、MMC/SD卡的模型和工作原理 PIN腳、SD卡總線、SD卡結構、SD卡寄存器、上電過程 SD卡寄存器:OCR:操作電壓寄存器: 只讀,32位 第31位:表示卡上電的狀態位CID: 卡身份識別寄存器 只讀 128位 生產廠商、產品ID,生產日期和串號等CSD: 部分可寫 128位 卡的容量、擦出扇區大小、讀寫最大數據塊的大小、讀操作的電流、電壓等等CSR: 卡配置寄存器 64位 數據位寬RCA: 16位 相關的卡地址寄存器,卡識別過程中主控器和卡協商出來的一個地址三、SD卡命令和響應格式 命令和相應格式 SD卡命令,命令類型,ACMD命令 響應類型、卡類型、卡狀態轉換表 命令的格式: 48

2、位 起始位0 方向位(host to card: 1, card to host: 0) 內容 CRC7 結束位1響應的格式:48位 或者136位卡命令: 命令的類型:bc: broadcast without Response無響應的廣播bcr: broadcast with Response有響應的廣播ac: Address(point-to-point) Command:點對點,DATA0DATA3數據線上無數據adtc: Adress(point-to-point) Data Transfer Commands 點對點,DATA0DATA3數據線上有數據CMD0, CMD2, CMD3

3、, CMD55, ACMD41 命令可能會導致卡的狀態發生變化響應類型: R1,R1b, R2, R3,R6(SD2.0擴展了R7)擴展內容:SPI工作模式: 要知道的特點:只支持一個卡,沒有RCA,命令只是MMC/SD的基本的子集SDHC:(支持2GB32GB):理解CMD8的作用,命令格式和響應,了解CSDV2.0寄存器做了擴展 SDIO WIFI: 增加CMD52, CMD53CMD8可以通過重新定義先前保留的位,來擴展一些已經存在的命令的新功能。ACMD41擴大到支持高容量SD記憶卡的初始化上面介紹了一個控制寄存器等信息綠色表示sd和mmc的不同點對于計算卡的容量 要注意對于sd 卡

4、可以參考Simplified_Physical_Layer_Spec v2.0.pdf手冊上面有對于mmc 可以參考JESD84-A441.pdf 注意對于大卡的mmc 是通過發送8號命令 來獲取ext_csd 中的212到215位置來得到的-S-static void sd_init(void)int retries;u8 *resp;unsigned int cardaddr;/resp = mmc_cmd(2, 0, MSC_CMDAT_RESPONSE_R2, MSC_CMDAT_RESPONSE_R2);/serial_puts( SD carsd CID =R2= ); seria

5、l_dump_data(resp, 15);resp = mmc_cmd(3, 0, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);cardaddr = (resp4 8) | resp3; /發生3命令 來或者rcarca = cardaddr 6;/serial_puts(sd2_0=); serial_puts_hex(sd2_0);/serial_puts( SD carsd CSD Register =R2= ); serial_dump_data(resp, 16);OUTREG16(A_MSC_CLKRT(0), 0);resp =

6、mmc_cmd(7, rca, MSC_CMDAT_BUSY | MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);resp = mmc_cmd(55, rca, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);resp = mmc_cmd(6, 0x2, MSC_CMDAT_BUS_WIDTH_4BIT | MSC_CMDAT_RESPONSE_R1|MSC_CMDAT_BUSY, MSC_CMDAT_RESPONSE_R1);/應答類型R1b/while(!(INREG16(A_MSC_STAT(0)&(

7、12G)還是標準卡 其實也可以利用cmd9命令讀取cds來判斷 在sd就是這么做的#if 0serial_puts( OCR =R3= ); serial_dump_data(resp, 6);if (resp4& 0x80)serial_puts(nnMMC init oknn);/表示上電完成elseserial_puts(nnMMC init failnn);#endifresp = mmc_cmd(2, 0, MSC_CMDAT_RESPONSE_R2, MSC_CMDAT_RESPONSE_R2); /獲取CID/serial_puts( CID CSD =R2= ); serial

8、_dump_data(resp, 16);resp = mmc_cmd(3, 0x10, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);/這個東西就很惡心了 在sd卡和mmc卡的參數不一樣 mmc卡的參數是自己設定一個rca值 ,但是sd卡是通過回復值中讀取rca,上面sd卡的初始化中有描述OUTREG16(A_MSC_CLKRT(0), 1);resp = mmc_cmd(7, 0x10, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);/設置新地址為有效地址 這樣就進入了tarnsport mode

9、.只有發送了7號命令 還有設置位寬CMD6 才能發生正在的進行讀寫發生16 17 18等resp = mmc_cmd(6, 0x3b70101, MSC_CMDAT_BUS_WIDTH_4BIT|MSC_CMDAT_RESPONSE_R1|MSC_CMDAT_BUSY, MSC_CMDAT_RESPONSE_R1);/應答類型R1b,設置位寬 為4BIT模式resp = mmc_cmd(13, rca, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);card_status = (resp4 24) | (resp3 16) | (resp2 8)

10、| resp1;serial_puts(mmc_cmd 13n);if(card_status & 0x900) != 0x900) /ready & tranreturn OPEN_CARD_INIT_CHECK_STATUS_ERROR;/對于mmc卡經常要加CMD13,不然經常會出現問題的,CMD13在發生玩cmd3后就可以隨時發送while(!(INREG16(A_MSC_STAT(0)&(1cmd2 (讀取cid)進入Ident狀態 - CMD3(設置rca)進入stand state狀態-cmd7進入transport狀態 在這里還可以利用CMD6設置位寬的大小 sd不支持8BIT

11、 mmc支持當卡發生完CMD3后進入待機狀態(stand-by state),cmd7可以讓卡進入transport狀態,-SD卡調試關鍵點:1. 上電時要延時足夠長的時間給SD卡一個準備過程,在我的程序里是5秒,根據不同的卡設置不同的延時時間。SD卡初始化第一步在發送CMD命令之前,在片選有效的情況下首先要發送至少74個時鐘,否則將有可能出現SD卡不能初始化的問題。2. SD卡發送復位命令CMD0后,要發送版本查詢命令CMD8,返回狀態一般分兩種,若返回0x01表示此SD卡接受CMD8,也就是說此SD卡支持版本2;若返回0x05則表示此SD卡支持版本1。因為不同版本的SD卡操作要求有不一樣的

12、地方,所以務必查詢SD卡的版本號,否則也會出現SD卡無法正常工作的問題。3. 理論上要求發送CMD58獲得SD卡電壓參數,但實際過程中由于事先都知道了SD卡的工作電壓,因此可省略這一步簡化程序。協議書上也建議盡量不要用這個命令。4. SD卡讀寫超時時間要按照協議說明書書上的給定值(讀超時:100ms;寫超時:250ms),這個值要在程序中準確計算出來,否則將會出現不能正常讀寫數據的問題。我自己定義了一個計算公式:超時時間=(8/clk)*arg。5. 2GB以內的SD卡(標準卡)和2GB以上的SD卡(大容量卡)在地址訪問形式上不同,這一點尤其要注意,否則將會出現無法讀寫數據的問題。如標準卡在讀

13、寫操作時,對讀或寫命令令牌當中的地址域符初值0x10,表示對第16個字節以后的地址單元進行操作(前提是此SD卡支持偏移讀寫操作),而對大容量卡讀或寫命令令牌當中的地址域符初值0x10時,則表示對第16塊進行讀寫操作,而且大容量卡只支持塊讀寫操作,塊大小固定為512字節,對其進行字節操作將會出錯。6. 對某一塊要進行寫操作時最好先執行擦出命令,這樣寫入的速度就能大大提高。進行擦除操作時不管是標準卡還是大容量卡都按塊操作執行,也就是一次擦除至少512字節。7. 對標準卡進行字節操作時,起始和終止必須在一個物理扇區內,否則將不能進行讀寫操作。實際操作過程中建議用塊操作以提高效率。不管是標準卡還是大容

14、量卡一個讀寫命令只能對一個塊進行操作,不允許跨物理層地址操作。8. 在寫數據塊前要先寫入若干個dummy data字節,寫完一個塊數據時,主機要監測MISO數據線,如果從機處于忙狀態這根數據線會保持低電平,這樣主機就可以根據這根數據線的狀態以決定是否發送下一個命令,在從機沒有釋放MISO數據線之前,主機絕對不能執行其他命令,否則將會導致寫入的數據出錯,而且從機也不會響應主機的命令。9. 在SPI模式下,CRC校驗是被忽略的,但依然要求主從機發送CRC碼,只是數值可以是任意值,一般主機的CRC碼通常設為0x00或0xFF。讀多塊操作和寫多塊操作的傳輸停止形式不一樣,讀多塊操作時用用命令CMD12

15、終止傳輸,而寫多塊操作時用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還

16、是SCSD,到此SD2.0卡初始化成功。如果CMD8返回錯誤則進一步判斷為1.0卡還是MMC卡,循環發送CMD55+ACMD41,返回無錯誤,則為SD1.0卡,到此SD1.0卡初始成功,如果在一定的循環次數下,返回為錯誤,則進一步發送CMD1進行初始化,如果返回無錯誤,則確定為MMC卡,如果在一定的次數下,返回為錯誤,則不能識別該卡,初始結束。(5)CS拉高。我們在讀寫的前面可以最好 讀取下狀態CMD13來檢查狀態位,判斷上一次的命令是否傳輸完了2、讀步驟:(1) 發送CMD17(單塊)或CMD18(多塊)讀命令,返回0x00(2) 接收數據開始令牌0xfe(或0xfc)+正式數據512Byt

17、es + CRC校驗2Bytes默認正式傳輸的數據長度是512Bytes,可用CMD16設置塊長度。3、寫步驟:(1) 發送CMD24(單塊)或CMD25(多塊)寫命令,返回0x00(2) 發送數據開始令牌0xfe(或0xfc)+正式數據512Bytes + CRC校驗2Bytes4、擦除步驟:(1) 發送CMD32,跟一個參數來指定首個要擦除的起始地址(SD手冊上說是塊號)(2) 發送CMD33,,指定最后的地址(3) 發送CMD38,擦除指定區間的內容此3步順序不能顛倒。最后說一下我的一點體會:SD卡就是一個存儲器,只不過用命令的方式來進行操作,我們只要掌握了各條命令及操作方式,就可以靈活

18、的操作SD卡了,另外我所了解的IC卡也是類似的原理,還有就是建議開始看MMC的協議,簡單明了易懂些,有了對MMC卡的一些了解后看SD卡協議就容易多了。SD卡命令共分為12類,分別為class0到class11,不同的SDd卡,主控根據其功能,支持不同的命令集 如下Class0 :(卡的識別、初始化等基本命令集)CMD0:復位SD 卡.CMD1:讀OCR寄存器.CMD9:讀CSD寄存器.CMD10:讀CID寄存器.CMD12:停止讀多塊時的數據傳輸CMD13:讀 Card_Status 寄存器Class2 (讀卡命令集):CMD16:設置塊的長度CMD17:讀單塊.CMD18:讀多塊,直至主機發送CMD12為止 .Class4(寫卡命令集) :CMD24

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論