版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、51單片機(jī)實(shí)現(xiàn)對SD卡的讀寫文章編號:5文章分類:單片機(jī) 51系列 點(diǎn) 擊:.關(guān) 鍵 詞:SD文章來源:網(wǎng)絡(luò)摘 要:對于SD卡的硬件結(jié)構(gòu),在官方的文檔上有很詳細(xì)的介紹,如SD卡內(nèi)的存儲(chǔ)器結(jié)構(gòu)、存儲(chǔ)單元組織方式等內(nèi)容。要實(shí)現(xiàn)對它的讀寫,最核心的是它的時(shí)序. SD卡在現(xiàn)在的日常生活與工作中使用非常廣泛,時(shí)下已經(jīng)成為最為通用的數(shù)據(jù)存儲(chǔ)卡。在諸如MP3、數(shù)碼相機(jī)等設(shè)備上也都采用SD卡作為其存儲(chǔ)設(shè)備。SD卡之所以得到如此廣泛的使用,是因?yàn)樗鼉r(jià)格低廉、存儲(chǔ)容量大、使用方便、通用性與安全性強(qiáng)等優(yōu)點(diǎn)。既然它有著這么多優(yōu)點(diǎn),那么如果將它加入到單片機(jī)應(yīng)用開發(fā)系統(tǒng)中來,將使系統(tǒng)變得更加出色。這就要求對SD卡的硬件與
2、讀寫時(shí)序進(jìn)行研究。對于SD卡的硬件結(jié)構(gòu),在官方的文檔上有很詳細(xì)的介紹,如SD卡內(nèi)的存儲(chǔ)器結(jié)構(gòu)、存儲(chǔ)單元組織方式等內(nèi)容。要實(shí)現(xiàn)對它的讀寫,最核心的是它的時(shí)序,筆者在經(jīng)過了實(shí)際的測試后,使用51單片機(jī)成功實(shí)現(xiàn)了對SD卡的扇區(qū)讀寫,并對其讀寫速度進(jìn)行了評估。下面先來講解SD卡的讀寫時(shí)序。(1)SD卡的引腳定義:SD卡引腳功能詳述:引腳編號SD模式 SPI模式名稱類型描述名稱類型描述1CD/DAT3IO或PP卡檢測/數(shù)據(jù)線3#CSI片選2CMDPP命令/回應(yīng)DII數(shù)據(jù)輸入3VSS1S電源地VSSS電源地4VDDS電源VDDS電源5CLKI時(shí)鐘SCLKI時(shí)鐘6VSS2S電源地VSS2S電源地7DAT0I
3、O或PP數(shù)據(jù)線0DOO或PP數(shù)據(jù)輸出8DAT1IO或PP數(shù)據(jù)線1RSV9DAT2IO或PP數(shù)據(jù)線2RSV注:S:電源供給 I:輸入 O:采用推拉驅(qū)動(dòng)的輸出 PP:采用推拉驅(qū)動(dòng)的輸入輸出SD卡SPI模式下與單片機(jī)的連接圖: SD卡支持兩種總線方式:SD方式與SPI方式。其中SD方式采用6線制,使用CLK、CMD、DAT0DAT3進(jìn)行數(shù)據(jù)通信。而SPI方式采用4線制,使用CS、CLK、DataIn、DataOut進(jìn)行數(shù)據(jù)通信。SD方式時(shí)的數(shù)據(jù)傳輸速度與SPI方式要快,采用單片機(jī)對SD卡進(jìn)行讀寫時(shí)一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。這里只對其SPI方式進(jìn)
4、行介紹。(2)SPI方式驅(qū)動(dòng)SD卡的方法 SD卡的SPI通信接口使其可以通過SPI通道進(jìn)行數(shù)據(jù)讀寫。從應(yīng)用的角度來看,采用SPI接口的好處在于,很多單片機(jī)內(nèi)部自帶SPI控制器,不光給開發(fā)上帶來方便,同時(shí)也見降低了開發(fā)成本。然而,它也有不好的地方,如失去了SD卡的性能優(yōu)勢,要解決這一問題,就要用SD方式,因?yàn)樗峁└蟮目偩€數(shù)據(jù)帶寬。SPI接口的選用是在上電初始時(shí)向其寫入第一個(gè)命令時(shí)進(jìn)行的。以下介紹SD卡的驅(qū)動(dòng)方法,只實(shí)現(xiàn)簡單的扇區(qū)讀寫。1)命令與數(shù)據(jù)傳輸1.命令傳輸SD卡自身有完備的命令系統(tǒng),以實(shí)現(xiàn)各項(xiàng)操作。命令格式如下: 命令的傳輸過程采用發(fā)送應(yīng)答機(jī)制,過程如下: 每一個(gè)命令都有自己命令應(yīng)答
5、格式。在SPI模式中定義了三種應(yīng)答格式,如下表所示:字節(jié)位含義17開始位,始終為06參數(shù)錯(cuò)誤5地址錯(cuò)誤4擦除序列錯(cuò)誤3CRC錯(cuò)誤2非法命令1擦除復(fù)位0閑置狀態(tài)字節(jié)位含義17開始位,始終為06參數(shù)錯(cuò)誤5地址錯(cuò)誤4擦除序列錯(cuò)誤3CRC錯(cuò)誤2非法命令1擦除復(fù)位0閑置狀態(tài)27溢出,CSD覆蓋6擦除參數(shù)5寫保護(hù)非法4卡ECC失敗3卡控制器錯(cuò)誤2未知錯(cuò)誤1寫保護(hù)擦除跳過,鎖解鎖失敗0鎖卡字節(jié)位含義17開始位,始終為06參數(shù)錯(cuò)誤5地址錯(cuò)誤4擦除序列錯(cuò)誤3CRC錯(cuò)誤2非法命令1擦除復(fù)位0閑置狀態(tài)25全部操作條件寄存器,高位在前寫命令的例程:1. /- 2. 向SD卡中寫入命令,并返回回應(yīng)的第二個(gè)字節(jié) 3. /
6、- 4. unsignedcharWrite_Command_SD(unsignedchar*CMD) 5. 6. unsignedchartmp; 7. unsignedcharretry=0; 8. unsignedchari; 9. 10. /禁止SD卡片選 11. SPI_CS=1; 12. /發(fā)送8個(gè)時(shí)鐘信號 13. Write_Byte_SD(0xFF); 14. /使能SD卡片選 15. SPI_CS=0; 16. 17. /向SD卡發(fā)送6字節(jié)命令 18. for(i=0;i0x06;i+) 19. 20. Write_Byte_SD(*CMD+); 21. 22. 23. /獲
7、得16位的回應(yīng) 24. Read_Byte_SD();/readthefirstbyte,ignoreit. 25. do 26. /讀取后8位 27. tmp=Read_Byte_SD(); 28. retry+; 29. 30. while(tmp=0xff)&(retry100); 31. return(tmp); 32. 2)初始化SD卡的初始化是非常重要的,只有進(jìn)行了正確的初始化,才能進(jìn)行后面的各項(xiàng)操作。在初始化過程中,SPI的時(shí)鐘不能太快,否則會(huì)造初始化失敗。在初始化成功后,應(yīng)盡量提高SPI的速率。在剛開始要先發(fā)送至少74個(gè)時(shí)鐘信號,這是必須的。在很多讀者的實(shí)驗(yàn)中,很多是因?yàn)槭韬隽?/p>
8、這一點(diǎn),而使初始化不成功。隨后就是寫入兩個(gè)命令CMD0與CMD1,使SD卡進(jìn)入SPI模式 初始化時(shí)序圖: 初始化例程:1. /- 2. 初始化SD卡到SPI模式 3. /- 4. unsignedcharSD_Init() 5. 6. unsignedcharretry,temp; 7. unsignedchari; 8. unsignedcharCMD=0x40,0x00,0x00,0x00,0x00,0x95; 9. SD_Port_Init();/初始化驅(qū)動(dòng)端口 10. 11. Init_Flag=1;/將初始化標(biāo)志置1 12. 13. for(i=0;isector_count=sec
9、torBuffer.dat6&0x03; 18. vinf-sector_countsector_count+=sectorBuffer.dat7; 20. vinf-sector_countsector_count+=(sectorBuffer.dat8&0xc0)6; 22. /獲取multiplier 23. vinf-sector_multiply=sectorBuffer.dat9&0x03; 24. vinf-sector_multiplysector_multiply+=(sectorBuffer.dat10&0x80)7; 26. /獲取SD卡的容量 27. vinf-size
10、_MB=vinf-sector_count(9-vinf-sector_multiply); 28. /getthenameofthecard 29. Read_CID_SD(sectorBuffer.dat); 30. vinf-name0=sectorBuffer.dat3; 31. vinf-name1=sectorBuffer.dat4; 32. vinf-name2=sectorBuffer.dat5; 33. vinf-name3=sectorBuffer.dat6; 34. vinf-name4=sectorBuffer.dat7; 35. vinf-name5=0x00;/en
11、dflag 36. 37. 以上程序?qū)⑿畔⒀b載到一個(gè)結(jié)構(gòu)體中,這個(gè)結(jié)構(gòu)體的定義如下: 38. typedefstructSD_VOLUME_INFO 39. /SD/SDCardinfo 40. unsignedintsize_MB; 41. unsignedcharsector_multiply; 42. unsignedintsector_count; 43. unsignedcharname6; 44. VOLUME_INFO_TYPE; 5)扇區(qū)讀扇區(qū)讀是對SD卡驅(qū)動(dòng)的目的之一。SD卡的每一個(gè)扇區(qū)中有512個(gè)字節(jié),一次扇區(qū)讀操作將把某一個(gè)扇區(qū)內(nèi)的512個(gè)字節(jié)全部讀出。過程很簡單,先寫入
12、命令,在得到相應(yīng)的回應(yīng)后,開始數(shù)據(jù)讀取。扇區(qū)讀的時(shí)序: 扇區(qū)讀的程序例程:1. unsignedcharSD_Read_Sector(unsignedlongsector,unsignedchar*buffer) 2. 3. unsignedcharretry; 4. /命令16 5. unsignedcharCMD=0x51,0x00,0x00,0x00,0x00,0xFF; 6. unsignedchartemp; 7. 8. /地址變換由邏輯塊地址轉(zhuǎn)為字節(jié)地址 9. sector=sector24); 12. CMD2=(sector&0x00FF0000)16); 13. CMD3=(
13、sector&0x0000FF00)8); 14. 15. /將命令16寫入SD卡 16. retry=0; 17. do 18. /為了保證寫入命令一共寫100次 19. temp=Write_Command_MMC(CMD); 20. retry+; 21. if(retry=100) 22. 23. return(READ_BLOCK_ERROR);/blockwriteError! 24. 25. 26. while(temp!=0); 27. 28. /ReadStartByteformMMC/SD-Card(FEh/StartByte) 29. /Nowdataisready,yo
14、ucanreaditout. 30. while(Read_Byte_MMC()!=0xfe); 31. readPos=0; 32. SD_get_data(512,buffer);/512字節(jié)被讀出到buffer中 33. return0; 34. 35. 其中SD_get_data函數(shù)如下: 36. /- 37. 獲取數(shù)據(jù)到buffer中 38. /- 39. voidSD_get_data(unsignedintBytes,unsignedchar*buffer) 40. 41. unsignedintj; 42. for(j=0;jBytes;j+) 43. *buffer+=Rea
15、d_Byte_SD(); 44. 45. 6)扇區(qū)寫扇區(qū)寫是SD卡驅(qū)動(dòng)的另一目的。每次扇區(qū)寫操作將向SD卡的某個(gè)扇區(qū)中寫入512個(gè)字節(jié)。過程與扇區(qū)讀相似,只是數(shù)據(jù)的方向相反與寫入命令不同而已。 扇區(qū)寫的時(shí)序:扇區(qū)寫的程序例程:1. /- 2. 寫512個(gè)字節(jié)到SD卡的某一個(gè)扇區(qū)中去返回0說明寫入成功 3. /- 4. unsignedcharSD_write_sector(unsignedlongaddr,unsignedchar*Buffer) 5. 6. unsignedchartmp,retry; 7. unsignedinti; 8. /命令24 9. unsignedcharCMD=
16、0x58,0x00,0x00,0x00,0x00,0xFF; 10. addr=addr24); 13. CMD2=(addr&0x00FF0000)16); 14. CMD3=(addr&0x0000FF00)8); 15. 16. /寫命令24到SD卡中去 17. retry=0; 18. do 19. /為了可靠寫入,寫100次 20. tmp=Write_Command_SD(CMD); 21. retry+; 22. if(retry=100) 23. 24. return(tmp);/sendcommamdError! 25. 26. 27. while(tmp!=0); 28.
17、29. 30. /在寫之前先產(chǎn)生100個(gè)時(shí)鐘信號 31. for(i=0;i100;i+) 32. 33. Read_Byte_SD(); 34. 35. 36. /寫入開始字節(jié) 37. Write_Byte_MMC(0xFE); 38. 39. /現(xiàn)在可以寫入512個(gè)字節(jié) 40. for(i=0;i512;i+) 41. 42. Write_Byte_MMC(*Buffer+); 43. 44. 45. /CRC-Byte 46. Write_Byte_MMC(0xFF);/DummyCRC 47. Write_Byte_MMC(0xFF);/CRCCode 48. 49. 50. tmp=
18、Read_Byte_MMC();/readresponse 51. if(tmp&0x1F)!=0x05)/寫入的512個(gè)字節(jié)是未被接受 52. 53. SPI_CS=1; 54. return(WRITE_BLOCK_ERROR);/Error! 55. 56. /等到SD卡不忙為止 57. /因?yàn)閿?shù)據(jù)被接受后,SD卡在向儲(chǔ)存陣列中編程數(shù)據(jù) 58. while(Read_Byte_MMC()!=0xff); 59. 60. /禁止SD卡 61. SPI_CS=1; 62. return(0);/寫入成功 63. 64. 此上內(nèi)容在筆者的實(shí)驗(yàn)中都已調(diào)試通過。單片機(jī)采用STC89LE單片機(jī)(SD
19、卡的初始化電壓為2.0V3.6V,操作電壓為3.1V3.5V,因此不能用5V單片機(jī),或進(jìn)行分壓處理),工作于22.1184M的時(shí)鐘下,由于所采用的單片機(jī)中沒硬件SPI,采用軟件模擬SPI,因此讀寫速率都較慢。如果要半SD卡應(yīng)用于音頻、視頻等要求高速場合,則需要選用有硬件SPI的控制器,或使用SD模式,當(dāng)然這就需要各位讀者對SD模式加以研究,有了SPI模式的基礎(chǔ),SD模式應(yīng)該不是什么難事。相關(guān)文章:SD卡的SPI模式的初始化順序些天沒有出門,一直在家研究SD卡的SPI模式的初始化順序,這里為大家總結(jié)了一下編寫該程序所需要的知識1. SD卡的官方資料(我承認(rèn)這個(gè)資料很垃圾,比起民間的技術(shù)總結(jié)它的內(nèi)
20、容可謂又臭又長,但是作為基礎(chǔ)也要了解一下,SD協(xié)議不用看) 2. 清晰明了的MMC卡時(shí)序圖(雖然這個(gè)是MMC卡的,但是在初始化的時(shí)候CMD0的時(shí)序是一樣的) 電路:我用的SD卡的電路其實(shí)很簡單,參考SD卡的官方資料中的電路鏈接就可以的。供電問題:由于SD卡的電壓是3.3V,所以你的CPU必須支持3.3V的IO端口輸出。再來說一說雞毛蒜皮的細(xì)節(jié):1. 為了使SD卡初始化進(jìn)入SPI模式,我們需要使用的命令有3個(gè):CMD0,ACMD41,CMD55(使用ACMD類的指令前應(yīng)先發(fā)CMD55,CMD55起到一個(gè)切換到ACMD類命令的作用)。 2. 為什么在使用CMD0以后不使用CMD1?CMD1是MMC卡使用的指令,雖然本文并不想討論MM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 超市商品銷售及售后服務(wù)制度
- 流轉(zhuǎn)稅培訓(xùn)課件
- 執(zhí)業(yè)藥師培訓(xùn)機(jī)構(gòu)前十名
- 流乞人員救助工作培訓(xùn)
- 2024-2025學(xué)年山西省卓越聯(lián)盟高一下學(xué)期5月沖刺考試歷史試題(解析版)
- 2024-2025學(xué)年山東省青島市高一上學(xué)期期末選科考試歷史試題(解析版)
- 2026年財(cái)務(wù)管理基礎(chǔ)考試題集與解析
- 2024-2025學(xué)年江蘇省丹陽市高一下學(xué)期5月質(zhì)量檢測歷史試題(解析版)
- 2026年生物科學(xué)生物信息學(xué)技術(shù)試題庫
- 2026年中級電力工程師理論實(shí)踐筆試題目
- 2026年普洱市墨江縣中醫(yī)醫(yī)院招聘編外人員(11人)筆試備考試題及答案解析
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會(huì)成熟人才招聘備考題庫附答案詳解
- 碼頭安全專題培訓(xùn)內(nèi)容
- GB/T 46559-2025二氧化碳地質(zhì)封存場地評價(jià)指標(biāo)體系
- DB11∕T 2490-2025 文物保護(hù)單位無障礙設(shè)施設(shè)置規(guī)范
- 2026年數(shù)據(jù)服務(wù)企業(yè)數(shù)據(jù)交易合規(guī)培訓(xùn)課件與數(shù)據(jù)變現(xiàn)風(fēng)控
- 填飼對鵝肝膽固醇合成相關(guān)基因表達(dá)的影響:基于分子機(jī)制與生理響應(yīng)的研究
- 2025年關(guān)于落實(shí)全面從嚴(yán)治黨主體責(zé)任情況的自查報(bào)告
- 開發(fā)票運(yùn)輸合同范本
- CJ/T 510-2017城鎮(zhèn)污水處理廠污泥處理穩(wěn)定標(biāo)準(zhǔn)
- 血流動(dòng)力學(xué)不穩(wěn)定骨盆骨折急診處理
評論
0/150
提交評論