版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、51單片機實現(xiàn)對SD卡的讀寫SD卡在現(xiàn)在的日常生活與工作中使用非常廣泛,時下已經(jīng)成為最為通用的數(shù)據(jù)存儲卡。在諸如MP3數(shù)碼相機等設備上也都采用SD卡作為其存儲設備。SD卡之所以得到如此廣泛的使用,是因為它價格低廉、存儲容量大、使用方便、通用性與安全性強等優(yōu)點。既然它有著這么多優(yōu)點,那么如果將它加入到單片機應用開發(fā)系統(tǒng)中來,將使系統(tǒng)變得更加出色。這就要求對SD#的硬件與讀寫時序進行研究。對于SD#的硬件結構,在官方的文檔上有很詳細的介紹,如SD卡內(nèi)的存儲器結構、存儲單元組織方式等內(nèi)容。要實現(xiàn)對它的讀寫,最核心的是它的時序,筆者在經(jīng)過了實際的測試后,使用51單片機成功實現(xiàn)了對SD卡的扇區(qū)讀寫,并對
2、其讀寫速度進行了評估。下面先來講解SD卡的讀寫時序。(1)SD卡的引腳定義:SD卡引腳功能詳述:1;引腳編號SD模式-SPI模式名稱描述名稱類型描述1CS/DAT3IO或PP卡檢測/數(shù)據(jù)線3#CSI片選2CMDpp命令/回應DII數(shù)據(jù)輸入3VsS1S電源地VSSS電源地4VDdS電源VDDS電源5CLKI時鐘SCLKI時鐘6VsS2S電源地VSS2S電源地7DAT0IO或PP數(shù)據(jù)線0DOO或PP數(shù)據(jù)輸出8DAT1IO或PP數(shù)據(jù)線1RSV9rDAT2IO或PP數(shù)據(jù)線2RSV注:S:電源供給I:輸入O:采用推拉驅(qū)動的輸出PP:采用推拉驅(qū)動的輸入輸出SD卡SPI模式下與單片機的連接圖:090kves
3、t*CT«C1K-SC>-¥532-a-m-苗MOBl單片機tec*DATtFiriSD卡支持兩種總線方式:SD方式與SPI方式。其中SD方式采用6線制,使用CLKCMDDAT0DAT3行數(shù)據(jù)通信。而SPI方式采用4線制,使用CSCLKDataln、DataOut進行數(shù)據(jù)通信。SD方式時的數(shù)據(jù)傳輸速度與SPI方式要快,采用單片機對SD卡進行讀寫時一般都采用SPI模式。采用不同的初始化方式可以使SD卡工彳于SD方式或SPI方式。這里只對其SPI方式進行介紹。(2) SPI方式驅(qū)動SD卡的方法SD卡的SPI通信接口使其可以通過SPI通道進行數(shù)據(jù)讀寫。從應用的角度來看,采用
4、SPI接口的好處在于,很多單片機內(nèi)部自帶SPI控制器,不光給開發(fā)上帶來方便,同時也見降低了開發(fā)成本。然而,它也有不好的地方,如失去了SD卡的性能優(yōu)勢,要解決這一問題,就要用SD方式,因為它提供更大的總線數(shù)據(jù)帶寬。SPI接口的選用是在上電初始時向其寫入第一個命令時進行的。以下介紹SD卡的驅(qū)動方法,只實現(xiàn)簡單的扇區(qū)讀寫。1) 命令與數(shù)據(jù)傳輸1 .命令傳輸SD卡自身有完備的命令系統(tǒng),以實現(xiàn)各項操作。命令格式如下:此典為I說嬖主機給SD卡的命爭開始位船駕為工_、j命芋容丁使。劉學日評定位蛤用為】Q1CONTENTCRC1'總長度為曲個位,即G個字節(jié)命令的傳輸過程采用發(fā)送應答機制,過程如下:I)
5、jtainHcoinmntidiramwhair如下表所小:每一個命令都有自己命令應答格式。在SPI模式中定義了三種應答格式,字節(jié)位含義17:開始位,始終為06z參數(shù)錯誤5J地址錯誤4:察除序列錯誤3(CRC昔誤2二上法命令14察除復位01對置狀態(tài)了節(jié)位含義17開始位,始終為06參數(shù)錯誤5地址錯誤4擦除序列錯誤3CRC昔誤2非法命令1擦除復位0對置狀態(tài)27溢出,CSC®蓋6擦除參數(shù)5寫保護非法4卡ECOfe敗3卡控制器錯誤2未知錯誤1寫保護擦除跳過,鎖/解鎖失敗0鎖卡字節(jié)位含義17開始位,始終為06參數(shù)錯誤5地址錯誤4擦除序列錯誤一3CRC昔誤2非法命令1擦除復位0閑置狀態(tài)25全部操
6、作條件寄存器,高位在前寫命令的例程:/向SD卡中寫入命令,并返回回應的第二個字節(jié)unsignedchar/Write_Command_SDUnsignedchar*CMD)unsignedchartmp;unsignedcharretry=0;unsignedchari;/禁止SD卡片選SPI_CS=1;/發(fā)送8個時鐘信號Write_Byte_SD(0xFF);/使能SD卡片選SPI_CS=0;/向SD卡發(fā)送6字節(jié)命令for(i=0;i<0x06;i+)(Write_Byte_SD(*CMD+);/獲彳導16位的回應it.Read_Byte_SD();/readthefirstbyte,
7、ignoredo/讀取后8位tmp=Read_Byte_SD();retry+;while(tmp=0xff)&&(retry<100);return(tmp);2) 初始化SD卡的初始化是非常重要的,只有進行了正確的初始化,才能進行后面的各項操作。在初始化過程中,SPI的時鐘不能太快,否則會造初始化失敗。在初始化成功后,應盡量提高SPI的速率。在剛開始要先發(fā)送至少74個時鐘信號,這是必須的。在很多讀者的實驗中,很多是因為疏忽了這一點,而使初始化不成功。隨后就是寫入兩個命令CMD(0fCMD1使$嚇進入SP模式Cik(CML»IN1DATA1OUT初始化時序圖:
8、elkCS(CM口IN(DATAOUT兇兇嶇:yonuOOh初始化例程:/初始化SD卡到SPI模式/unsignedcharSD_Init()(unsignedcharretry,temp;unsignedchari;unsignedcharCMD口=0x40,0x00,0x00,0x00,0x00,0x95;SD_Port_Init();/初始化驅(qū)動端口Init_Flag=1;/將初始化標志置1for(i=0;i<0x0f;i+)Write_Byte_SD(0xff);/發(fā)送至少74個時鐘信號/向SD卡發(fā)送CMD0retry=0;do/為了能夠成功寫入CMDC這里寫200次temp=W
9、rite_Command_SD(CMD);retry+;if(retry=200)/超過200次return(INIT_CMD0_ERROR/CMD0Error!while(temp!=1);/回應01h,停止寫入/發(fā)送CMD倒SD卡CMD0=0x41;/CMD1CMD5=0xFF;retry=0;do/為了能成功寫入CMD1寫100次temp=Write_Command_SD(CMD);retry+;if(retry=100)超過100次return(INIT_CMD1_ERROR/CMD1Error!while(temp!=0);/回應00h停止寫入Init_Flag=0;/初始化完畢,初
10、始化標志清零SPI_CS=1;/片選無效return(0);/初始化成功)3) 讀取CIDCID寄存器存儲了S嚇的標識碼。每一個卡都有唯一的標識碼CID寄存器長度為128位。它的寄存器結構如下:名稱域數(shù)據(jù)寬度CID劃分生產(chǎn)標識號MID8127:120OEM應用標識OID16119:104產(chǎn)品名稱PNM40103:64產(chǎn)品版本PRV863:56產(chǎn)品序列號PSN3255:24保留一423:20生產(chǎn)日期MDT1219:8CRC菽驗合CRC77:1未使用,始終為1一10:0它的讀取時序如下:(CtlDjIM(OATA)OUT8州為Ca:0I7;H、1h再Q(mào)A皿532的兇反兇1/1*I:»11
11、*MM:翊賣:TT國匕心心口以與此時序相對應的程序如下:/讀取SD卡的CID寄存器16字節(jié)成功返回0/unsignedcharRead_CID_SD(nsignedchar*Buffer)/讀取CID寄存器的命令unsignedcharCMD=0x4A,0x00,0x00,0x00,0x00,0xFF;unsignedchartemp;temp=SD_Read_Block(CMD,Buffer,16);/read16bytesreturn(temp);4)讀取CSDCSD(Card-SpecificData)寄存器提供了讀寫SD卡的一些信息。其中的一些單元可以由用戶重新編程。具體的CSM構如下
12、:名稱域數(shù)據(jù)寬度單元CSDJ分CS陰構CSD_STRUCTURE2R127:126保留-6R125:120數(shù)據(jù)讀取時間1TAAC8R119:112數(shù)據(jù)在CLK周期內(nèi)讀取時間2(NSAC*100NSAC8R111:104最大數(shù)據(jù)傳輸率TRAN_SPEED8R103:96卡命令集合CCC12R95:84最大讀取數(shù)據(jù)塊長READ_BL_LEN4R83:80允許讀的部分塊READ_BL_PARTIAL1R79:79非線寫塊WRITE_BLK_MISALIGN1R78:78非線讀塊READ_BLK_MISALIGN1R77:77DS舔件DSR_IMP1R76:76保留-2R75:74設備容量C_SIZE
13、12R73:62最大讀取電流VminVDD_R_CURR_MIN3R61:59最大讀取電流VmaxVDD_R_CURR_MAX3R58:56最大寫電流VDmin'VDDWCURRMIN3R55:53最大寫電流VmaxVDDWCURRMAX3R52:50設備容量乘子C_SIZE_MULT3R49:47擦除單塊使能ERASE_BLK_EN1R46:46擦除扇區(qū)大小SECTOR_SIZE7R45:39寫保護群大小WP_GRP_SIZE7R38:32寫保護群使能WP_GRP_ENABLE1R31:31保留-2R30:29寫速度因子R2W_FACTOR3R28:26最大寫數(shù)據(jù)塊長度WRITE_B
14、L_LEN4R25:22允許寫的部分部WRITE_BL_PARTIAL1R21:21保留-5R20:16文件系統(tǒng)群FILE_OFRMAT_GRP1R/W15:15拷貝標志COPY1R/W14:14永久寫保護PERM_WRITE_PROTECT1R/W13:13暫時寫保護TMP_WRITE_PROTECT1R/W12:12文件系統(tǒng)FIL_FORMAT2R/W11:10保留-2R/W9:8CRCCRC7R/W7:1未用,始終為1-10:0(CMD)IN國IM(DATA)OUTFFH6x2審Xg,"!£<EGF,二讀取CSD的時序:a49hiCMMi相應的程序例程如下:/讀
15、SD卡的CSDS存器共16字節(jié)返回0說明讀取成功charReadCSDchar*/讀取CSDJ存器的命令unsignedcharCMD=0x49,0x00,0x00,0x00,0x00,0xFF;unsignedchartemp;temp=SD_Read_Block(CMD,Buffer,16);/read16bytesreturn(temp);4) 讀取SD卡信息以下程序可以獲取這綜合上面對CID與CSDW存器的讀取,可以知道很多關于SD卡的信息,些信息。如下:/返回/SD卡的容量,單位為M/sectorcountandmultiplierMBarein/u08=C_SIZE/(2A(9-C
16、_SIZE_MULT)/SD卡的名稱/voidSD_get_volume_info()unsignedchari;unsignedcharc_temp5;VOLUME_INFO_TYPED_volume_Info,*vinf;vinf=&SD_volume_Info;/Initthepointoer;/讀取CSDU存器Read_CSD_SD(sectorBuffer.dat);/獲取總扇區(qū)數(shù)vinf->sector_countvinf->sector_countvinf->sector_countvinf->sector_countvinf->sector
17、_count/獲取multipliervinf->sector_multiplyvinf->sector_multiplyvinf->sector_multiply=sectorBuffer.dat6<<=8;+=sectorBuffer.dat7;<<=2;+=(sectorBuffer.dat8=sectorBuffer.dat9<<=1;+=(sectorBuffer.dat10&0x03;&0xc0)>>&0x03;&0x80)6;>>7;/獲取SD卡的容量vinf->s
18、izeMBvinf->sector_count>>(9-vinf->sector_multiply);/getthenameofthecardRead_CID_SD(sectorBuffer.dat);vinf->name0vinf->name1vinf->name2vinf->name3vinf->name4vinf->name5)sectorBuffer.dat3;sectorBuffer.dat4;sectorBuffer.dat5;sectorBuffer.dat6;sectorBuffer.dat7;0x00;/endfla
19、gtypedefstruct以上程序?qū)⑿畔⒀b載到一個結構體中,這個結構體的定義如下:SDVOLUMEINFO/SD/SDCardinfounsignedunsignedunsignedunsignedintcharintcharsize_MB;sector_multiply;sector_count;name6;VOLUME_INFO_TYPE;5)扇區(qū)讀扇區(qū)讀是對SD卡驅(qū)動的目的之一。SD卡的每一個扇區(qū)中有512個字節(jié),一次扇區(qū)讀操作將把某一個扇區(qū)內(nèi)的512個字節(jié)全部讀出。過程很簡單,先寫入命令,在得到相應的回應后,開始數(shù)據(jù)讀取。扇區(qū)讀的時序:(LMD)lhr-(DATA)OUT»
20、BytesMtbyCMD161Default512)扇區(qū)讀的程序例程:char*buffer)unsignedcharSD_Read_Sector(unsignedlongsector,unsigned(unsignedcharretry;0x51,0x00,0x00,0x00,0x00,0xFF;/命令16unsignedcharCMD口unsignedchartemp;/地址變換由邏輯塊地址轉(zhuǎn)為字節(jié)地址sector=:sector<<9;/sector=sector*512CMD1=二(sector&0xFF000000)>>24);CMD2=二(secto
21、r&0x00FF0000)>>16);CMD3=二(sector&0x0000FF00)>>8);/將命令16寫入SD卡retry=0;do/為了保證寫入命令一共寫100次temp=Write_Command_MMC(CMD);retry+;if(retry=100)return(READ_BLOCK_ERROR/blockwriteError!while(temp!=0);/ReadStartByteformMMC/SD-Card(FEh/StartByte)/Nowdataisready,youcanreaditout.while(Read_Byte
22、_MMC()!=0xfe);readPos=0;SD_get_data(512,buffer);/512字節(jié)被讀出到buffer中return0;其中SD_get_data函數(shù)如下:/獲取數(shù)據(jù)到buffer中/voidSD_get_data(unsignedintBytes,unsignedchar*buffer)(unsignedintj;for(j=0;j<=""span=""style="word-wrap:break-word;”>*buffer+=Read_Byte_SD();6)扇區(qū)寫扇區(qū)寫是SD卡驅(qū)動的另一目的。每次扇
23、區(qū)寫操作將向SD卡的某個扇區(qū)中寫入512個字節(jié)。過程與扇區(qū)讀相似,只是數(shù)據(jù)的方向相反與寫入命令不同而已。扇區(qū)寫的時序:扇區(qū)寫的程序例程:/寫512個字節(jié)到SD卡的某一個扇區(qū)中去返回0說明寫入成功/unsignedcharSD_write_sector(unsignedlongaddr,unsignedchar*Buffer)(unsignedchartmp,retry;unsignedinti;/命令24unsignedcharCMD口=0x58,0x00,0x00,0x00,0x00,0xFF;addr=addr<<9;/addr=addr*512CMD1=(addr&0xFF000000)>>24);CMD2=(addr&0x00FF0000)>>16);CMD3=(addr&0x0000FF00)&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030家居布藝行業(yè)市場供需現(xiàn)狀分析及產(chǎn)業(yè)鏈投資評估規(guī)劃發(fā)展研究報告
- 2025-2030家園地產(chǎn)項目開發(fā)與財務投資評估規(guī)劃
- 2025-2030家具制造實木床工藝技術優(yōu)化市場分析研究報告規(guī)劃
- 2025-2030完整考察中國農(nóng)產(chǎn)品加工業(yè)品牌建設與市場推廣報告
- 2025-2030孕婦用品制造業(yè)市場競爭分析及行業(yè)發(fā)展投資評估規(guī)劃報告
- 2025-2030如此部署該國內(nèi)儀表儀器行業(yè)現(xiàn)狀分析及策略投入調(diào)研課題
- 2025-2030外科手術器械行業(yè)市場供需動態(tài)監(jiān)測及智能化升級發(fā)展策略研究指導
- 2025-2030夏熱冬冷地區(qū)差異化節(jié)能窗解決方案市場接受度調(diào)研
- 2025-2030土庫曼斯坦油氣田開發(fā)行業(yè)技術優(yōu)化與經(jīng)濟引進規(guī)劃研究
- 2025-2030圖瓦盧旅游基礎設施建設跨境保險旅游簽證政策市場培育投資發(fā)展建議報告
- 2026年包頭輕工職業(yè)技術學院高職單招職業(yè)適應性測試備考題庫及答案詳解
- 草原補償協(xié)議書
- 九年級物理 2025-2026學年九年級上學期期末物理試題及答案 2025-2026學年度上學期期末教學質(zhì)量測查九年級物理試卷
- 北京市西城區(qū)2024-2025學年七年級上學期期末語文試題及答案
- 江蘇省2025年普通高中學業(yè)水平合格性考試試卷英語試卷(含答案詳解)
- GB/T 18457-2024制造醫(yī)療器械用不銹鋼針管要求和試驗方法
- 手機維修單完整版本
- 流感防治知識培訓
- 呼吸內(nèi)科進修匯報課件
- 康復治療進修匯報
- 離婚協(xié)議書模板(模板)(通用)
評論
0/150
提交評論