版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二手船舶交易合同協(xié)議
- 個人借款動產(chǎn)抵押合同范本
- 上海市倉儲物流租賃合同范本
- 中外文化交流合作合同范本
- 臨時攤位租賃合同條款
- 個人房產(chǎn)轉(zhuǎn)讓及過戶合同協(xié)議
- 三方股權(quán)交易合同:權(quán)益分配與責(zé)任承擔(dān)
- 專利權(quán)許可合作合同(全新)
- 2025年定制產(chǎn)品銷售協(xié)議文本
- 2025年電氣設(shè)備外協(xié)加工協(xié)議
- 《既有軌道交通盾構(gòu)隧道結(jié)構(gòu)安全保護(hù)技術(shù)規(guī)程》
- 2024年安徽省中考數(shù)學(xué)試卷含答案
- 2024年湖南省公務(wù)員錄用考試《行測》真題及答案解析
- 心尖球形綜合征
- DBJT 13-460-2024 既有多層住宅建筑增設(shè)電梯工程技術(shù)標(biāo)準(zhǔn)
- 中國證監(jiān)會證券市場交易結(jié)算資金監(jiān)控系統(tǒng)證券公司接口規(guī)范
- 2025屆天津市部分學(xué)校高三年級八校聯(lián)考英語試題含解析
- 微項目 探討如何利用工業(yè)廢氣中的二氧化碳合成甲醇-2025年高考化學(xué)選擇性必修第一冊(魯科版)
- 廣東省廣州市黃埔區(qū)2024-2025學(xué)年八年級物理上學(xué)期教學(xué)質(zhì)量監(jiān)測試題
- 水產(chǎn)品冷凍加工原料處理與加工技術(shù)考核試卷
- 全新保密協(xié)議模板公安下載(2024版)
評論
0/150
提交評論