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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、二、MMC/SD卡的模型和工作原理 PIN腳、SD卡總線、SD卡結(jié)構(gòu)、SD卡寄存器、上電過程 SD卡寄存器: OCR:操作電壓寄存器: 只讀,32位 第31位: 表示卡上電的狀態(tài)位  CID: 卡身份識別寄存器 只讀 128位 生產(chǎn)廠商、產(chǎn)品ID,生產(chǎn)日期和串號等  CSD: 部分可寫 128位 卡的容量、擦出扇區(qū)大小、讀寫最大數(shù)據(jù)塊的大小、讀操作的電流、電壓等等 CSR: 卡配置寄存器 64位 數(shù)據(jù)位寬  RCA: 16位 相關(guān)的卡地址寄存器,卡識別過程中主控器和卡協(xié)商出來的一個地址 

2、0;三、SD卡命令和響應(yīng)格式 命令和相應(yīng)格式 SD卡命令,命令類型,ACMD命令 響應(yīng)類型、卡類型、卡狀態(tài)轉(zhuǎn)換表 命令的格式: 48位 起始位0 方向位(host to card: 1, card to host: 0) 內(nèi)容 CRC7 結(jié)束位1· 響應(yīng)的格式:48位 或者136位 卡命令: 命令的類型: bc: broadcast without Response 無響應(yīng)的廣播  bcr: broadcast with Response 有響應(yīng)的廣播  ac: Address(point-to

3、-point) Command: 點(diǎn)對點(diǎn),DATA0DATA3數(shù)據(jù)線上無數(shù)據(jù)  adtc: Adress(point-to-point) Data Transfer Commands 點(diǎn)對點(diǎn),DATA0DATA3數(shù)據(jù)線上有數(shù)據(jù) CMD0, CMD2, CMD3, CMD55, ACMD41 命令可能會導(dǎo)致卡的狀態(tài)發(fā)生變化  響應(yīng)類型: R1,R1b, R2, R3,R6(SD2.0擴(kuò)展了R7)  擴(kuò)展內(nèi)容: SPI工作模式: 要知道的特點(diǎn):只支持一個卡,沒有RCA,命令只是MMC/SD的基本的子集

4、0; SDHC:(支持2GB32GB):理解CMD8的作用,命令格式和響應(yīng),了解CSDV2.0寄存器做了擴(kuò)展 SDIO WIFI: 增加CMD52, CMD53  CMD8可以通過重新定義先前保留的位,來擴(kuò)展一些已經(jīng)存在的命令的新功能。ACMD41擴(kuò)大到支持高容量SD記憶卡的初始化上面介紹了一個控制寄存器等信息 綠色表示sd和mmc的不同點(diǎn)對于計算卡的容量 要注意對于sd 卡 可以參考Simplified_Physical_Layer_Spec v2.0.pdf手冊上面有對于mmc  可以參考JESD84-A441.pdf 注意對于大卡的mmc

5、 是通過發(fā)送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=  ");  serial_dump_data(resp, 15);resp = mmc_cmd(3, 0,

6、 MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);cardaddr = (resp4 << 8) | resp3;  /發(fā)生3命令 來或者rcarca = cardaddr << 16;/serial_puts("rca="); serial_puts_hex(rca);resp = mmc_cmd(9, rca, MSC_CMDAT_RESPONSE_R2, MSC_CMDAT_RESPONSE_R2);sd2_0 = (resp14 & 0xc0) >> 6;/serial

7、_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 = mmc_cmd(7, rca, MSC_CMDAT_BUSY | MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);resp = mmc_cmd(55, rca, MSC_CMDAT_RESPONS

8、E_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);/應(yīng)答類型R1b/while(!(INREG16(A_MSC_STAT(0)&(1<<13);/等待編程完成-從這兒開始看int  mmc_init(void) /int retries;u8 *resp;OUTREG32(A_CPM_MSCCDR,13);SETREG32(A_CPM_C

9、PCCR, CPCCR_CHANGE_EN);MMC_INIT_GPIO();_msc_reset();MMC_IRQ_MASK();OUTREG32(A_MSC_CLKRT(0), 7);/extclk/128/OUTREG32(A_MSC_LPM(0),0x01);/sd2_0 = 0; /默認(rèn)為標(biāo)準(zhǔn)SD卡resp = mmc_cmd(0, 0, 80, 0); /先80個時鐘 resp = mmc_cmd(8, 0x1aa, 0x1, MSC_CMDAT_RESPONSE_R1); /判斷是sd2(返回0x1)以后的卡還是sd1(返回0x5)現(xiàn)在基本都是sd2以后 的

10、所以都沒有對返回值判斷resp = mmc_cmd(55, 0, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1); /根據(jù)cmd55來判斷是mmc卡還是sd卡,只有卡才有55命令 才能正確有返回值 返回值有command index =0x37=55 的話說明是sd /serial_puts(" Application Specific Commands =R1= "); serial_dump_data(resp, 6);if(resp5 != 0x37)  /是mmc卡/serial_puts(&

11、quot;MMC card found!n");retries = 200;doresp = mmc_cmd(1, 0x40ff8000, MSC_CMDAT_RESPONSE_R3, MSC_CMDAT_RESPONSE_R3); /匹配電壓 mmc卡是CMD1  SD卡是CMD41  因為上電是要一個時間的 所以就利用一個dowhile 來延時sd_mdelay(10);while (retries- && !(resp4 & 0x80); /直到r3中的ocr回復(fù)值中的31位為1的時候表示上電完成了if(resp4&0x40)

12、/電壓驗證最后一次應(yīng)答中帶有數(shù)據(jù)訪問模式位,如果為1,則類似SDHC卡基于塊地址訪問sd2_0 = 1;  / 也可以利用r3 返回值中的ocr的30位來檢查是高容量卡(>2G)還是標(biāo)準(zhǔn)卡  其實(shí)也可以利用cmd9命令讀取cds來判斷 在sd就是這么做的#if 0serial_puts("  OCR =R3= ");  serial_dump_data(resp, 6);if (resp4& 0x80) serial_puts("nnMMC init oknn");/ 表示上電完成

13、else serial_puts("nnMMC init failnn");#endifresp = mmc_cmd(2, 0, MSC_CMDAT_RESPONSE_R2, MSC_CMDAT_RESPONSE_R2); /獲取CID/serial_puts("  CID CSD =R2= ");  serial_dump_data(resp, 16);resp = mmc_cmd(3, 0x10, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1); /這個東西就很惡心了

14、  在sd卡和mmc卡的參數(shù)不一樣  mmc卡的參數(shù)是自己設(shè)定一個rca值 ,但是sd卡是通過回復(fù)值中讀取rca,上面sd卡的初始化中有描述OUTREG16(A_MSC_CLKRT(0), 1);resp = mmc_cmd(7, 0x10, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);/設(shè)置新地址為有效地址  這樣就進(jìn)入了tarnsport mode .只有發(fā)送了7號命令 還有設(shè)置位寬CMD6  才能發(fā)生正在的進(jìn)行讀寫發(fā)生16 17 18等resp = mmc_cmd(6, 0x3b70101, MSC_

15、CMDAT_BUS_WIDTH_4BIT|MSC_CMDAT_RESPONSE_R1|MSC_CMDAT_BUSY, MSC_CMDAT_RESPONSE_R1);/應(yīng)答類型R1b,設(shè)置位寬  為4BIT模式resp = mmc_cmd(13, rca, MSC_CMDAT_RESPONSE_R1, MSC_CMDAT_RESPONSE_R1);card_status = (resp4 << 24) | (resp3 << 16) | (resp2 << 8) | resp1;serial_puts("mmc_cmd 13n")

16、;if(card_status & 0x900) != 0x900) /ready && tranreturn OPEN_CARD_INIT_CHECK_STATUS_ERROR;/對于mmc卡經(jīng)常要加CMD13,不然經(jīng)常會出現(xiàn)問題的,CMD13在發(fā)生玩cmd3后就可以隨時發(fā)送while(!(INREG16(A_MSC_STAT(0)&(1<<13);/等待編程完成else/如果是sd卡sd_init();return 0;-上圖就是我在手冊上面截取的初始化部分圖片 系統(tǒng)上電后發(fā)生cmd0命令后就進(jìn)入idle 狀態(tài),CMD1檢查電壓,然后就進(jìn)入Rea

17、dy state ->cmd2 (讀取cid)進(jìn)入Ident狀態(tài)  -> CMD3(設(shè)置rca)進(jìn)入stand state狀態(tài)-cmd7進(jìn)入transport狀態(tài) 在這里還可以利用CMD6設(shè)置位寬的大小  sd不支持8BIT mmc支持當(dāng)卡發(fā)生完CMD3后進(jìn)入待機(jī)狀態(tài)(stand-by state),cmd7可以讓卡進(jìn)入transport狀態(tài),-SD卡調(diào)試關(guān)鍵點(diǎn):1.      上電時要延時足夠長的時間給SD卡一個準(zhǔn)備過程,在我的程序里是5秒,根據(jù)不同的卡設(shè)置不同的延時時間。SD卡初始化第一步在發(fā)送CMD命令之前

18、,在片選有效的情況下首先要發(fā)送至少74個時鐘,否則將有可能出現(xiàn)SD卡不能初始化的問題。2.      SD卡發(fā)送復(fù)位命令CMD0后,要發(fā)送版本查詢命令CMD8,返回狀態(tài)一般分兩種,若返回0x01表示此SD卡接受CMD8,也就是說此SD卡支持版本2;若返回0x05則表示此SD卡支持版本1。因為不同版本的SD卡操作要求有不一樣的地方,所以務(wù)必查詢SD卡的版本號,否則也會出現(xiàn)SD卡無法正常工作的問題。3.      理論上要求發(fā)送CMD58獲得SD卡電壓參數(shù),但實(shí)際過程中由于事先都知道了SD卡的工作電

19、壓,因此可省略這一步簡化程序。協(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)中的

20、地址域符初值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é)操作時,起始和終止必須在一個物理扇

21、區(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.      在

22、SPI模式下,CRC校驗是被忽略的,但依然要求主從機(jī)發(fā)送CRC碼,只是數(shù)值可以是任意值,一般主機(jī)的CRC碼通常設(shè)為0x00或0xFF。讀多塊操作和寫多塊操作的傳輸停止形式不一樣,讀多塊操作時用用命令CMD12終止傳輸,而寫多塊操作時用Stop Tran Token(停止傳輸令牌,值為0xFD)終止傳輸。-1、初始化步驟:(1)    延時至少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é)議向上兼容的原

23、理,首先發(fā)送只有SD2.0才有的命令CMD8,如果CMD8返回?zé)o錯誤,則初步判斷為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返回錯誤則進(jìn)一步判斷為1.0卡還是MMC卡,循環(huán)發(fā)送CMD55+ACMD41,返回?zé)o錯誤,則為SD1.0卡,到此SD1.0卡初始成功,如果在一定的循環(huán)次數(shù)下,返回為錯誤,則進(jìn)一步發(fā)送CMD1進(jìn)行初始化,如果返回?zé)o錯誤,則確定為MMC卡,如果在一定的次數(shù)下,返回為錯誤,則不能識別該卡,初始結(jié)束。(5)CS

24、拉高。我們在讀寫的前面可以最好 讀取下狀態(tài)CMD13來檢查狀態(tài)位,判斷上一次的命令是否傳輸完了2、讀步驟:(1)    發(fā)送CMD17(單塊)或CMD18(多塊)讀命令,返回0x00(2)    接收數(shù)據(jù)開始令牌0xfe(或0xfc)+正式數(shù)據(jù)512Bytes + CRC校驗2Bytes默認(rèn)正式傳輸?shù)臄?shù)據(jù)長度是512Bytes,可用CMD16設(shè)置塊長度。3、寫步驟:(1)    發(fā)送CMD24(單塊)或CMD25(多塊)寫命令,返回0x00(2)    發(fā)送數(shù)據(jù)開始令牌0xfe(或0xfc)+正式數(shù)據(jù)512Bytes + CRC校驗2Bytes4、擦除步驟:(1)    

溫馨提示

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

評論

0/150

提交評論