51單片機實現(xiàn)對SD卡地讀寫_第1頁
51單片機實現(xiàn)對SD卡地讀寫_第2頁
51單片機實現(xiàn)對SD卡地讀寫_第3頁
51單片機實現(xiàn)對SD卡地讀寫_第4頁
51單片機實現(xiàn)對SD卡地讀寫_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實用文檔51單片機實現(xiàn)對SD卡的讀寫SD卡在現(xiàn)在的日常生活與工作中使用非常廣泛,時下已經成為最為通用的數據存儲卡。在 諸如MP3數碼相機等設備上也都采用 SD卡作為其存儲設備。SD卡之所以得到如此廣泛的使 用,是因為它價格低廉、存儲容量大、使用方便、通用性與安全性強等優(yōu)點。既然它有著這么 多優(yōu)點,那么如果將它加入到單片機應 用開發(fā)系統(tǒng)中來,將使系統(tǒng)變得更加出色。這就要求 對SD#的硬件與讀寫時序進行研究。對于SD#的硬件結構,在官方的文檔上有很詳細的介紹, 如SD卡內的存儲器結構、存儲單元組織方式等內容。要實現(xiàn)對它的讀寫,最核心的是它的時 序,筆者在經過了實際的測試后,使用 51單片機成功實現(xiàn)

2、了對SD卡的扇區(qū)讀寫, 并對其讀 寫速度進行了評估。下面先來講解 SD卡的讀寫時序。(1) SD卡的引腳定義:限摞,SD Memory *PCardSD卡引腳功能詳述:11引腳編號SD模式SPI模式名稱描述名稱描述1CS/DAT3IO 或 PP卡檢測/數據線3#CSI片選2CMDpp命令/回應DII數據輸入3VSS1S電源地VSSS電源地4VDdS電源VDDS電源5CLKI時鐘SCLKI時鐘6VSS2S電源地VSS2S電源地7DAT0IO 或 PP數據線0DO?;騊P數據輸出DAT1IO 或 PP數據線1RSV9rDAT2IO 或 PP數據線2RSV注:S:電源供給 I :輸入O:采用推拉驅動

3、的輸出 PP:采用推拉驅動的輸入輸出文案大全實用文檔SD卡SPI模式下與單片機的連接圖: 口. L單片機3CK開蛇位始舞為命令內容他迎力姓碼穌位蛇終為1cuat*VS91cuesvsssWtwSD卡支持兩種總線方式:SD方式與SPI方式。其中SD方式采用6線制,使用CLK CMD DAT0DAT3行數據通信。而 SPI方式采用4線制,使用CS CLK Dataln、DataOut 進行數據通信。SD方式時的數據傳輸速度與SPI方式要快,采用單片機對SD卡進行讀寫時一 般都采用SPI模式。采用不同的初始化方式可以使 SD卡工彳于SD方式或SPI方式。這里只 對其SPI方式進行介紹。(2) SPI

4、方式驅動SD卡的方法SD卡的SPI通信接口使其可以通過 SPI通道進行數據讀寫。從應用的角度來看,采 用SPI接口的好處在于,很多單片機內部自帶SPI控制器,不光給開發(fā)上帶來方便,同時也見 降低了開發(fā)成本。然而,它也有不好的地方,如失去了SD卡的性能優(yōu)勢,要解決這一問題,就要用SD方式,因為它提供更大的總線數據帶寬。 SPI接口的選用是在上電初始時向其寫入 第一個命令時進行的。以下介紹 SD卡的驅動方法,只實現(xiàn)簡單的扇區(qū)讀寫。1) 命令與數據傳輸1 .命令傳輸SD卡自身有完備的命令系統(tǒng),以實現(xiàn)各項操作。命令格式如下:U 1 CONTENTCRC 1總長度為明個位,即白個字節(jié)命令的傳輸過程采用發(fā)

5、送應答機制,過程如下:文案大全實用文檔i cmigponx由1B.ifnOv*-10匕眄T每一個命令都有自己命令應答格式。在SPI模式中定義了三種應答格式,如下表所示:字節(jié)位含義17:開始位,始終為06 z參數錯誤5 J地址錯誤4:察除序列錯誤3(CRC昔誤2 二上法命令14察除復位0 1對置狀態(tài)了節(jié)位含義17開始位,始終為06參數錯誤5地址錯誤4擦除序列錯誤3CRC昔誤2非法命令1擦除復位0對置狀態(tài)27溢出,CSD®蓋6擦除參數5寫保護非法4卡ECCfe敗3卡控制器錯誤2未知錯誤1寫保護擦除跳過,鎖/解鎖失敗0鎖卡文案大全實用文檔字節(jié)位含義17開始位,始終為06參數錯誤5地址錯誤4

6、擦除序列錯誤一3CRC昔誤2非法命令1擦除復位0閑置狀態(tài)25全部操作條件寄存器,高位在前寫命令的例程:/向SD卡中寫入命令,并返回回應的第二個字節(jié)unsigne d char/Write_Command_SDUnsigne d char *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位的

7、回應it.Read_Byte_SD(); /read the first byte,ignore do /讀取后8位文案大全實用文檔tmp = Read_Byte_SD(); retry+; while (tmp=0xff)&&(retry<100); return (tmp);2) 初始化SD卡的初始化是非常重要的,只有進行了正確的初始化,才能進行后面的各項操作。在初始 化過程中,SPI的時鐘不能太快,否則會造初始化失敗。在初始化成功后,應盡量提高SPI的速率。在剛開始要先發(fā)送至少74個時鐘信號,這是必須的。在很多讀者的實驗中,很多是因 為疏忽了這一點,而使初始化不成功

8、。隨后就是寫入兩個命令 CMD0f CMD 1使$嚇進入SP 模式elk(CMD) IN初始化時序圖:® M 8 irriAxi 8Ncr ' 4uCQh刖cs(CMOHM(DATAJOUT初始化例程:/初始化SD卡到SPI模式/文案大全實用文檔unsigned char SD_Init() unsignedcharretry,temp;unsignedchari;unsignedcharCMD口 =0x40,0x00,0x00,0x00,0x00,0x95;SD_Port_Init(); /初始化驅動端口Init_Flag=1; /將初始化標志置1 for (i=0;i&l

9、t;0x0f;i+)Write_Byte_SD(0xff); /發(fā)送至少74個時鐘信號/向SD卡發(fā)送CMD0 retry=0;do /為了能夠成功寫入CMDC這里寫200次 temp=Write_Command_SD(CMD);retry+;if (retry=200) /超過200次return (INIT_CMD0_ERROR/CMD0 Error! while (temp!=1);/ 回應 01h,停止寫入/發(fā)送CMD倒SD卡CMD0 = 0x41; /CMD1CMD5 = 0xFF;retry=0;do /為了能成功寫入CMD1寫100次 temp=Write_Command_SD(C

10、MD); retry+;if (retry=100) 超過100次return (INIT_CMD1_ERROR/CMD1 Error! while (temp!=0); / 回應 00h 停止寫入文案大全實用文檔Init_Flag=0; /初始化完畢,初始化標志清零SPI_CS=1; /片選無效return (0);/初始化成功3) 讀取CIDCID寄存器存儲了 SD卡的標識碼。每一個卡都有唯一的標識碼CID寄存器長度為128位。它的寄存器結構如下:名稱域數據寬度CID劃分生產標識號MID8127:120OEM應用標識OID16119:104產品名稱PNM40103:64產品版本PRV863

11、:56產品序列號PSN3255:24保留一423:20生產日期MDT1219:8CRC菽驗合CRC77:1未使用,始終為1一10:0它的讀取時序如下:工出DATA) OUT與此時序相對應的程序如下:/讀取SD卡的CID寄存器16字節(jié)成功返回0char ReadCIDchar *文案大全實用文檔/讀取CID寄存器的命令unsigned char CMD = 0x4A,0x00,0x00,0x00,0x00,0xFF;unsigned char temp;temp=SD_Read_Block(CMD,Buffer,16); /read 16 bytes return (temp);4)讀取CSDC

12、SD(Card-Specific Data)寄存器提供了讀寫SD卡的一些信息。其中的一些單元可以由用戶 重新編程。具體的CSM構如下:名稱域數據 寬度單元CSC® 分CS陰構CSD_STRUCTURE2R127:126保留-6R125:120數據讀取時間1TAAC8R119:112數據在CLK周期內 讀取時間2(NSAC*100NSAC8R111:104最大數據傳輸率TRAN_SPEED8R103:96卡命令集合CCC12R95:84最大讀取數據塊長READ_BL_LEN4R83:80允許讀的部分塊READ_BL_PARTIAL1R79:79非線寫塊WRITE_BLK_MISALIG

13、N1R78:78非線讀塊READ_BLK_MISALIGN1R77:77DS舔件DSR_IMP1R76:76保留-2R75:74設備容量C_SIZE12R73:62最大讀取電流VminVDD_R_CURR_MIN3R61:59最大讀取電流VDmaxVDD_R_CURR_MAX3R58:56最大寫電流VDmin 'VDD W CURR MIN3R55:53最大寫電流VmaxVDD W CURR MAX3R52:50文案大全實用文檔設備容量乘子C_SIZE_MULT3R49:47擦除單塊使能ERASE_BLK_EN1R46:46擦除扇區(qū)大小SECTOR_SIZE7R45:39寫保護群大小W

14、P_GRP_SIZE7R38:32寫保護群使能WP_GRP_ENABLE1R31:31保留-2R30:29寫速度因子R2W_FACTOR3R28:26最大寫數據塊長度WRITE_BL_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未用,

15、始終為1-10:0讀取CSD的時序:PF®(CMDi IN-(CATAj OUT4&n,:皿 rFFh.”二用K 口 8始豆00) aA相應的程序例程如下:/c*wCWww l已一比讀SD卡的CSDW存器共16字節(jié)返回0說明讀取成功/unsigned char Read_CSD_SDQsigned char *Buffer)文案大全實用文檔/讀取CSDW存器的命令unsigned char CMD口 = 0x49,0x00,0x00,0x00,0x00,0xFF;unsigned char temp;temp=SD_Read_Block(CMD,Buffer,16); /re

16、ad 16 bytes return (temp);4) 讀取SD卡信息綜合上面對CID與CSDW存器的讀取,可以知道很多關于 SD卡的信息, 些信息。如下:以下程序可以獲取這/返回/SD卡的容量,單位為M/sector count andmultiplierMB are in/u08= C_SIZE / (2A(9-C_SIZE_MULT)/SD卡的名稱/void SD_get_volume_info() unsigned char i;unsigned char c_temp5;VOLUME_INFO_TYPED_volume_Info,*vinf;vinf=&SD_volume_

17、Info; /Init the pointoer;/讀取CSDU存器Read_CSD_SD(sectorBuffer.dat);/獲取總扇區(qū)數vinf->sector_count vinf->sector_count vinf->sector_count vinf->sector_count vinf->sector_count / 獲取 multiplier vinf->sector_multiply vinf->sector_multiply vinf->sector_multiply=sectorBuffer.dat6< <=8

18、;+= sectorBuffer.dat7;< <=2;+= (sectorBuffer.dat8=sectorBuffer.dat9< <=1;+= (sectorBuffer.dat10& 0x03;& 0xc0) >>& 0x03;& 0x80)6;>> 7;文案大全實用文檔/獲取SD卡的容量vinf->sizeMBvinf->sector_count >> (9-vinf->sector_multiply);/ get the name of the card Read_CID

19、_SD(sectorBuffer.dat);vinf->name0 vinf->name1 vinf->name2 vinf->name3vinf->name4 vinf->name5sectorBuffer.dat3;sectorBuffer.dat4;sectorBuffer.dat5;sectorBuffer.dat6;sectorBuffer.dat7;0x00; /end flagtypedef struct以上程序將信息裝載到一個結構體中,這個結構體的定義如下:SDVOLUMEINFO/SD/SD Cardinfounsigned unsigne

20、d unsigned unsignedintcharintcharsize_MB;sector_multiply;sector_count;name6;VOLUME_INFO_TYPE;5)扇區(qū)讀扇區(qū)讀是對SD卡驅動的目的之一。SD卡的每一個扇區(qū)中有512個字節(jié),一次扇區(qū)讀操作將把 某一個扇區(qū)內的512個字節(jié)全部讀出。過程很簡單,先寫入命令,在得到相應的回應后,開始 數據讀取。扇區(qū)讀的時序:(CND) IN* ff Byt«3 3»T by CMD16 rDefault 512)扇區(qū)讀的程序例程:文案大全實用文檔char*buffer)unsigned char SD_Re

21、ad_Sector(unsigned long sector, unsigned unsignedcharretry;0x51,0x00,0x00,0x00,0x00,0xFF;/命令16unsignedcharCMD口unsignedchartemp;/地址變換由邏輯塊地址轉為字節(jié)地址sector =: sector<<9; /sector=sector* 512CMD1=二(sector&0xFF000000)>>24 );CMD2=二(sector&0x00FF0000)>>16 );CMD3=二(sector&0x0000FF

22、00)>>8 );/將命令16寫入SD卡retry=0;do/為了保證寫入命令一共寫100次temp=Write_Command_MMC(CMD);retry+;if (retry=100) return (READ_BLOCK_ERROR/block write Error! while (temp!=0);/Read Start Byte form MMC/SD-Card (FEh/Start Byte)/Now data is ready,you can read it out.while (Read_Byte_MMC() != 0xfe);readPos=0;SD_get_

23、data(512,buffer) ;/512 字節(jié)被讀出到 buffer 中return 0;其中SD_get_data函數如下:/獲取數據到buffer中/文案大全實用文檔void SD_get_data( unsigned int Bytes, unsigned char *buffer) unsigned int j;for (j=0;j<="" span=""style="word-wrap: break-word;”> *buffer+ = Read_Byte_SD();6) 扇區(qū)寫512個字節(jié)。過扇區(qū)寫是SD卡驅動的另一

24、目的。每次扇區(qū)寫操作將向SD卡的某個扇區(qū)中寫入 程與扇區(qū)讀相似,只是數據的方向相反與寫入命令不同而已。扇區(qū)寫的時序:扇區(qū)寫的程序例程:/寫512個字節(jié)到SD卡的某一個扇區(qū)中去返回0說明寫入成功/unsigned char SD_write_sector( unsigned long addr, unsigned charunsigned char tmp,retry;unsigned int i;/命令24*Buffer)文案大全unsignedchar CMD口=0x58,0x00,0x00,0x00,0x00,0xFF;addr =addr <<9;/addr =addr * 512CMD1:=(addr&0xFF000000)>>24 );CMD2:=(addr&0x00FF0000)>>16 );CMD3:=(addr&0x0000FF00)>>8 );實用文檔/寫命

溫馨提示

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

評論

0/150

提交評論