sd卡學(xué)習(xí)筆記參考模板_第1頁(yè)
sd卡學(xué)習(xí)筆記參考模板_第2頁(yè)
sd卡學(xué)習(xí)筆記參考模板_第3頁(yè)
sd卡學(xué)習(xí)筆記參考模板_第4頁(yè)
sd卡學(xué)習(xí)筆記參考模板_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1、 簡(jiǎn)介:SD卡(Secure Digital Memory Card)是一種為滿足安全性、容量、性能和使用環(huán)境等各方面的需求而設(shè)計(jì)的一種新型存儲(chǔ)器件,SD卡允許在兩種模式下工作,即SD模式和SPI模式,本 系統(tǒng)采用SPI模式。本小節(jié)僅簡(jiǎn)要介紹在SPI模式下,STM32處理器如何讀寫(xiě)SD卡,如果讀者如希望詳細(xì)了解SD卡,可以參考相關(guān)資料。SD 卡內(nèi)部結(jié)構(gòu)及引腳如下圖所示:SD卡內(nèi)部圖.JPG2、SD卡管腳圖:1 / 23SD卡圖.JPG3、SPI模式下SD各管腳名稱為:sd 卡:SPI模式下SD各管腳名稱 為.JPG注: 一般SD有兩種模式:SD模式和SPI模式,管腳定義如下:(A)、SD

2、MODE 1、CD/DATA3 2、CMD 3、VSS1 4、VDD 5、CLK 6、VSS2 7、DATA0 8、DATA1 9、DATA2(B)、SPI MODE 1、CS 2、DI 3、VSS 4、VDD 5、SCLK 6、VSS2 7、DO 8、RSV 9、RSVSD 卡主要引腳和功能為:CLK:時(shí)鐘信號(hào),每個(gè)時(shí)鐘周期傳輸一個(gè)命令或數(shù)據(jù)位,頻率可在025MHz之間變化,SD卡的總線管理器可以不受任何限制的自由產(chǎn)生025MHz 的頻率;CMD:雙向命令和回復(fù)線,命令是一次主機(jī)到從卡操作的開(kāi)始,命令可以是從主機(jī)到單卡尋址,也可以是到所有卡;回復(fù)是對(duì)之前命令的回答,回復(fù)可以來(lái)自單 卡或所有卡

3、;DAT03:數(shù)據(jù)線,數(shù)據(jù)可以從卡傳向主機(jī)也可以從主機(jī)傳向卡。SD卡以命令形式來(lái)控制SD卡的讀寫(xiě)等操作??筛鶕?jù)命令對(duì)多塊或單塊進(jìn)行讀寫(xiě)操作。在SPI模式下其命令由6個(gè)字節(jié)構(gòu)成,其中高位在前。SD卡命令 的格式如表1所示,其中相關(guān)參數(shù)可以查閱SD卡規(guī)范。4、MicroSD卡管腳圖:MicroSD卡管腳圖.JPG5、MicroSD卡管腳名稱:MicroSD卡管腳名 稱.JPGSD 卡與MicroSD卡僅僅是封裝上的不同,MicroSD卡更小,大小上和一個(gè)SIM卡差不多,但是協(xié)議與SD卡相同。一般我們用單片機(jī)操作SD 卡時(shí),都不需要對(duì)FAT分區(qū)表信息做處理,原因如下:1)、操作FAT分區(qū)表要增加程序

4、代碼量、增加SRAM的消耗,對(duì)于便攜應(yīng)用來(lái)說(shuō)代碼大小和 占用SRAM的多少至關(guān)重要。2)、即使我們對(duì)FAT分區(qū)表不做任何了解,實(shí)際上我們一樣可以向SD卡上寫(xiě)入數(shù)據(jù),這就表明使用FAT對(duì)我們做數(shù) 據(jù)存儲(chǔ)應(yīng)用來(lái)說(shuō)如同雞肋。3)、耗費(fèi)大量經(jīng)歷和時(shí)間去了解FAT分區(qū)表對(duì)于我們做嵌入式軟件開(kāi)發(fā)的人來(lái)說(shuō)有些得不償失。4)、SD卡支持 兩種操作模式,SD模式和SPI模式,SPI模式做SD數(shù)據(jù)操作時(shí)根本不需要知道FAT,這時(shí)候SD卡對(duì)于我們來(lái)說(shuō)實(shí)際上就是個(gè)大的、快速的、方便的、容 量可變的外部存儲(chǔ)器。基于以上原因,一般情況下對(duì)SD卡的操作只需要了解SPI通訊就可以了,而現(xiàn)在大部分單片機(jī)都有SPI接口,那么操作

5、SD卡 易如反掌。以下是做SD卡試驗(yàn)時(shí)使用的電路圖:SD卡試驗(yàn)時(shí)使用的電路 圖.JPGSD_CS/ 連接到單片機(jī)的片選SD管腳,只有單片機(jī)設(shè)置SD_CS/為低電平時(shí)才可以操作SD卡。MOSI連接單片機(jī)SPI總線的MOSI管腳(SPI數(shù)據(jù) 輸入),單片機(jī)從這個(gè)管腳讀取SD卡內(nèi)的數(shù)據(jù)。MISO連接單片機(jī)SPI總線的MISO管腳(SPI數(shù)據(jù)輸出)、單片機(jī)通過(guò)這個(gè)管腳向SD卡內(nèi)寫(xiě) 入數(shù)據(jù)。SCK連接單片機(jī)SPI總線的SCK(SPI時(shí)鐘)SD管腳實(shí)際上在SD卡內(nèi)部連接到了GND,當(dāng)SD插座上沒(méi)插入SD卡時(shí),單 片機(jī)從這個(gè)管腳能讀到高電平(前提是使用單片機(jī)內(nèi)部上拉輸入,或者外部增加一個(gè)上拉電阻),一旦插入

6、SD卡,這個(gè)管腳就變成低電平,這個(gè)功能用來(lái)檢測(cè)是否 插入SD卡。RSV1和RSV2是保留功能管腳,不需要操作。MicroSD卡的連接和SD卡大同小異,只是MicroSD卡比SD卡少 一個(gè)GND管腳,所以不能使用上面做的這種插入卡的檢測(cè),實(shí)際上現(xiàn)在很多SD卡/MicroSD卡插座都有插入檢測(cè)管腳,當(dāng)然,一分錢一分貨,價(jià)格上當(dāng)然 也要貴一些順便提一下,普通SD卡插座最多5塊錢。SPI命令格式Byte 1Byte2-5Byte 6765 031 07001CommandCommand ArgumentCRC1以下是一個(gè)簡(jiǎn)單的測(cè)試SD卡讀 寫(xiě)的程序,程序是基于Atmega128單片機(jī)編寫(xiě)的,對(duì)于Atm

7、ega的其他單片機(jī)僅需要做管腳改動(dòng)就可以使用,其他單片機(jī)更改要更大。sd.h/*/SPI 各線所占用的端口#define SD_SS PB6 #define SD_SCK PB1#define SD_MOSI PB2#define SD_MISO PB3/*#define SD_DDR DDRB#define SD_PORT PORTB#define SD_PIN PINB#define SD_SS_H SD_PORT |= (1#define SDSS_L SD_PORT &= (1#define SD_SCK_H SD_PORT |= (1#define SD_SCK_L SD_PORT

8、&= (1#define SD_MOSI_H SD_PORT |= (1#define SD_MOSI_L SD_PORT &= (1#define SD_MISO_IN (SD_PIN&(1/-/ 錯(cuò)誤號(hào)/-#define INIT_CMD0_ERROR 0xFF#define INIT_CMD1_ERROR 0xFE#define WRITE_BLOCK_ERROR 0xFD#define READ_BLOCK_ERROR 0xFC#define TRUE 0x01/- / MMC/SD 命令(命令號(hào)從40開(kāi)始,只列出基本命令,并沒(méi)有都使用)/-#define SD_RESET 0x40

9、+ 0 #define SD_INIT 0x40 + 1#define SD_READ_CSD 0x40 + 9#define SD_READ_CID 0x40 + 10#define SD_STOP_TRANSMISSION 0x40 + 12#define SD_SEND_STATUS 0x40 + 13#define SD_SET_BLOCKLEN 0x40 + 16#define SD_READ_BLOCK 0x40 + 17#define SD_READ_MULTI_BLOCK 0x40 + 18#define SD_WRITE_BLOCK 0x40 + 24#define SD_W

10、RITE_MULTI_BLOCK 0x40 + 25/片選關(guān)(MMC/SD-Card Invalid)#define SD_Disable() SD_SS_H/片選開(kāi) (MMC/SD-Card Active)#define SD_Enable() SD_SS_LSD_TEST.C/*/ICC-AVR application builder : 03-5-20 8:39:11/ Target : M128/ Crystal: 3.6864Mhz#include#include#include sd.hvoid uart0_init(void);void putchar(unsigned char

11、 content);void putstr(unsigned char *s);void SD_Port_Init(void);unsigned char SD_Init(void);unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer);unsigned char SD_read_sector(unsigned long addr,unsigned char *Buffer);unsigned char SPI_TransferByte(unsigned char byte);unsigned char

12、Write_Command_SD(unsigned char cmd,unsigned long address);unsigned long SD_find(void);/*/ 串口調(diào)試程序/*void uart0_init(void)UCSR0B = 0x00; /disable while setting baud rateUCSR0A = 0x00;UCSR0C = 0x06; / 00000110 UART0設(shè)置為異步模式、無(wú)奇偶校驗(yàn)、1位停止位、8位數(shù)據(jù)位UBRR0L = 0x17; /set baud rate loUBRR0H = 0x00; /set baud rate hi

13、 設(shè)置UART0口通信速率9600UCSR0B = 0x18;void putchar(unsigned char content)while(!(UCSR0A & (1 UDRE0); /* 判斷上次發(fā)送有沒(méi)有完成 */UDR0 = content; /* 發(fā)送數(shù)據(jù) */void putstr(unsigned char *s)while(*s)putchar(*s);s+;/*/ 端口初始化void SD_Port_Init(void)/*SD_PORT |= (1SD_DDR |= (1SD_DDR &= (1/*/ 初始化 MMC/SD 卡為SPI模式unsigned char SD_

14、Init(void)/*unsigned char retry,temp;unsigned char i;SPCR=0x53; /設(shè)定SPI為128分頻,慢速進(jìn)行初始化SPSR=0x00;for (i=0;i24);SPI_TransferByte(address16);SPI_TransferByte(address8);SPI_TransferByte(address);SPI_TransferByte(0xFF);SPI_TransferByte(0xFF);dotmp = SPI_TransferByte(0xFF); /發(fā)送8個(gè)時(shí)鐘接受最后一個(gè)字節(jié) retry+;while(tmp=

15、0xff)&(retry8);return(tmp);/*/ 寫(xiě)一個(gè)扇區(qū)(512Byte) to MMC/SD-Card/如果寫(xiě)完成返回TRUEunsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)/*unsigned char temp;unsigned int i;SPI_TransferByte(0xFF); /延遲8個(gè)時(shí)鐘 SD_Enable(); /開(kāi)片選temp = Write_Command_MMC(MMC_WRITE_BLOCK,addr9); /發(fā)送寫(xiě)扇區(qū)命令if(temp != 0x00

16、)SD_Disable();return(temp);SPI_TransferByte(0xFF);SPI_TransferByte(0xFF);SPI_TransferByte(0xFE);for (i=0;i512;i+)SPI_TransferByte(*Buffer+); /發(fā)送512字節(jié)數(shù)據(jù)/CRC-ByteSPI_TransferByte(0xFF); /Dummy CRCSPI_TransferByte(0xFF); /CRC Codetemp = SPI_TransferByte(0xFF); /讀SD卡運(yùn)行響應(yīng)if(temp & 0x1F)!=0x05) /如果最后4位為01

17、01,為操作成功。否則為操作失敗。SD_Disable();return(WRITE_BLOCK_ERROR); /返回錯(cuò)誤while (SPI_TransferByte(0xFF) != 0xFF);SD_Disable();return(TRUE); /返回成功 /*/ 讀512字節(jié) from MMC/SD-Card/如果成功返回TRUEunsigned char SD_read_sector(unsigned long addr,unsigned char *Buffer)/*unsigned char temp;unsigned int i;unsigned char data;SPI

18、_TransferByte(0xff); MMC_Enable();temp = Write_Command_SD(SD_READ_BLOCK,addr9);/發(fā)送讀扇區(qū)命令if(temp != 0x00)SD_Disable();return(READ_BLOCK_ERROR); /返回錯(cuò)誤號(hào) while(SPI_TransferByte(0xff) != 0xfe);for(i=0;i512;i+)data = SPI_TransferByte(0xff); /存數(shù)據(jù) *Buffer+=data;SPI_TransferByte(0xff); /讀CRC碼SPI_TransferByte(

19、0xff); /讀CRC碼SD_Disable();return(TRUE); /返回成功/*/ 查找數(shù)據(jù)開(kāi)始標(biāo)志(預(yù)設(shè)DATASTART)根據(jù)實(shí)際需要?jiǎng)h改/*unsigned long SD_find(void) unsigned long tmp=400;unsigned char data512;doSD_read_sector(tmp,data); /從0扇區(qū)開(kāi)始查找tmp+; /查找DATASTART while(!(data0=D)&(data1=A)&(data2=T)&(data3=A)&(data4=S)&(data5=T)&(data6=A)&(data7=R)&(data

20、8=T);return tmp; /返回開(kāi)始標(biāo)志的下一個(gè)扇區(qū) /*/ 發(fā)送一個(gè)字節(jié)/*unsigned char SPI_TransferByte(unsigned char byte)SPDR = byte;while (!(SPSR & 0x80); /檢測(cè)線路是否空閑 return SPDR;/*/ 主程序例子/*void main(void) unsigned long temp;unsigned char data512;unsigned char data2512=sssssssssssssssssssssssss;unsigned char comm1=rnhello world

21、rn;unsigned char comm2=rnSD_INIT OKrn;uart0_init();SD_Port_Init(); /端口初始化if(SD_Init()= 0x01) /SD卡初始化,并讀取返回值putstr(comm2);temp=SD_find(); /查找DATASTART數(shù)據(jù)開(kāi)始標(biāo)志,返回下一扇區(qū)地址SD_read_sector(1001,data); /讀取temp地址的512字節(jié)數(shù)據(jù),512字節(jié)數(shù)據(jù)存入data數(shù)組putstr(data); SD_write_sector(temp,data2); /將data2數(shù)組512字節(jié)數(shù)據(jù)寫(xiě)入temp扇區(qū)測(cè)試程序很簡(jiǎn)單,僅

22、僅是做了一下讀寫(xiě)SD卡的測(cè)試。關(guān)于SD卡的幾點(diǎn)注意事項(xiàng)。1、無(wú)論我們?cè)敢獠辉敢?,SD卡每次讀寫(xiě)數(shù)據(jù)的最小單位是1個(gè)扇區(qū),即512個(gè)字節(jié)。2、SD卡與單片機(jī)連接的 SPI總線不能太長(zhǎng),要盡量短。這樣的好處是速度可以更快,也不容易出錯(cuò)。3、雖然我們并不關(guān)心FAT文件表,但是我們?nèi)匀灰P(guān)心SD卡的存儲(chǔ)結(jié)構(gòu),如果我們不想使用PC機(jī)來(lái)讀取保存在SD卡上的數(shù)據(jù)那我們就不用關(guān)心SD存儲(chǔ)結(jié)構(gòu)了。但,作為一個(gè)大容量的可移動(dòng)存儲(chǔ)設(shè)備,不能用PC機(jī)來(lái)讀取是個(gè)很大的遺憾,我解決這個(gè)遺憾的方法如下:3-1、因?yàn)槲也涣私釬AT復(fù)雜的結(jié)構(gòu),所以我做的程序沒(méi)法去按照FAT表的各項(xiàng)功能來(lái)進(jìn)行創(chuàng)建文件、刪除文件、創(chuàng)建目錄等等操作。3-2、雖然我們的單片機(jī)不能創(chuàng)建文件,但是PC機(jī)是可以創(chuàng)建文件的

溫馨提示

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

評(píng)論

0/150

提交評(píng)論