AVR SD卡基礎(chǔ)原理及讀寫c程序_第1頁
AVR SD卡基礎(chǔ)原理及讀寫c程序_第2頁
AVR SD卡基礎(chǔ)原理及讀寫c程序_第3頁
AVR SD卡基礎(chǔ)原理及讀寫c程序_第4頁
AVR SD卡基礎(chǔ)原理及讀寫c程序_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

2、 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、RSV SD 卡主要引腳和功能為: CLK:時(shí)鐘信號(hào),每個(gè)時(shí)鐘周期傳輸一個(gè)命令或數(shù)據(jù)位,頻率可在025MHz之間變化,SD卡的總線管理器可以不受任何限制的自由產(chǎn)生025MHz 的頻率; CMD:雙向命令和回復(fù)線,命令是一次主機(jī)到從卡操作的開始,命令可以是從主機(jī)到單卡尋址,也可以是到所有卡;回復(fù)是對之前命令的回答,回復(fù)可以來自單 卡或所有卡; DAT03:數(shù)據(jù)線,數(shù)據(jù)可以從卡傳向主機(jī)也可以從主機(jī)傳向卡。 SD卡以命令形式來控

3、制SD卡的讀寫等操作??筛鶕?jù)命令對多塊或單塊進(jìn)行讀寫操作。在SPI模式下其命令由6個(gè)字節(jié)構(gòu)成,其中高位在前。SD卡命令 的格式如表1所示,其中相關(guān)參數(shù)可以查閱SD卡規(guī)范。4、MicroSD卡管腳圖:5、MicroSD卡管腳名稱: SD 卡與MicroSD卡僅僅是封裝上的不同,MicroSD卡更小,大小上和一個(gè)SIM卡差不多,但是協(xié)議與SD卡相同。 一般我們用單片機(jī)操作SD 卡時(shí),都不需要對FAT分區(qū)表信息做處理,原因如下: 1)、操作FAT分區(qū)表要增加程序代碼量、增加SRAM的消耗,對于便攜應(yīng)用來說代碼大小和 占用SRAM的多少至關(guān)重要。 2)、即使我們對FAT分區(qū)表不做任何了解,實(shí)際上我們一

4、樣可以向SD卡上寫入數(shù)據(jù),這就表明使用FAT對我們做數(shù) 據(jù)存儲(chǔ)應(yīng)用來說如同雞肋。 3)、耗費(fèi)大量經(jīng)歷和時(shí)間去了解FAT分區(qū)表對于我們做嵌入式軟件開發(fā)的人來說有些得不償失。 4)、SD卡支持 兩種操作模式,SD模式和SPI模式,SPI模式做SD數(shù)據(jù)操作時(shí)根本不需要知道FAT,這時(shí)候SD卡對于我們來說實(shí)際上就是個(gè)大的、快速的、方便的、容 量可變的外部存儲(chǔ)器。 基于以上原因,一般情況下對SD卡的操作只需要了解SPI通訊就可以了,而現(xiàn)在大部分單片機(jī)都有SPI接口,那么操作SD卡 易如反掌。 以下是做SD卡試驗(yàn)時(shí)使用的電路圖: SD_CS/ 連接到單片機(jī)的片選SD管腳,只有單片機(jī)設(shè)置SD_CS/為低電平

5、時(shí)才可以操作SD卡。 MOSI連接單片機(jī)SPI總線的MOSI管腳(SPI數(shù)據(jù) 輸入),單片機(jī)從這個(gè)管腳讀取SD卡內(nèi)的數(shù)據(jù)。 MISO連接單片機(jī)SPI總線的MISO管腳(SPI數(shù)據(jù)輸出)、單片機(jī)通過這個(gè)管腳向SD卡內(nèi)寫 入數(shù)據(jù)。 SCK連接單片機(jī)SPI總線的SCK(SPI時(shí)鐘) SD管腳實(shí)際上在SD卡內(nèi)部連接到了GND,當(dāng)SD插座上沒插入SD卡時(shí),單 片機(jī)從這個(gè)管腳能讀到高電平(前提是使用單片機(jī)內(nèi)部上拉輸入,或者外部增加一個(gè)上拉電阻),一旦插入SD卡,這個(gè)管腳就變成低電平,這個(gè)功能用來檢測是否 插入SD卡。 RSV1和RSV2是保留功能管腳,不需要操作。 MicroSD卡的連接和SD卡大同小異,

6、只是MicroSD卡比SD卡少 一個(gè)GND管腳,所以不能使用上面做的這種插入卡的檢測,實(shí)際上現(xiàn)在很多SD卡/MicroSD卡插座都有插入檢測管腳,當(dāng)然,一分錢一分貨,價(jià)格上當(dāng)然 也要貴一些順便提一下,普通SD卡插座最多5塊錢。 SPI命令格式 以下是一個(gè)簡單的測試SD卡讀 寫的程序,程序是基于Atmega128單片機(jī)編寫的,對于Atmega的其他單片機(jī)僅需要做管腳改動(dòng)就可以使用,其他單片機(jī)更改要更大。sd.h/*/SPI 各線所占用的端口#define SD_SS PB6 #define SD_SCK PB1#define SD_MOSI PB2#define SD_MISO PB3/*#de

7、fine 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 &= (1<#define SD_MOSI_H SD_PORT |= (1<#define SD_MOSI_L SD_PORT &= (1<#define SD_MISO_IN (SD_PIN&am

8、p;(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開始,只列出基本命令,并沒有都使用)/-#define SD_RESET 0x40 + 0 #define SD_INIT 0x40 + 1#define SD_READ_CSD 0x40 + 9#define SD_READ_CID 0x40 + 10#de

9、fine 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_WRITE_MULTI_BLOCK 0x40 + 25 /片選關(guān)(MMC/SD-Card Invalid)#define SD_Disable() SD_SS_H /片選開 (M

10、MC/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.h'void uart0_init(void);void putchar(unsigned char content);void putstr(unsigned char *s);void SD_Port_Init(void);unsigned cha

11、r 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 Write_Command_SD(unsigned char cmd,unsigned long address);unsigned long SD_f

12、ind(void);/*/ 串口調(diào)試程序/*void uart0_init(void)UCSR0B = 0x00; /disable while setting baud rateUCSR0A = 0x00;UCSR0C = 0x06; / 00000110 UART0設(shè)置為異步模式、無奇偶校驗(yàn)、1位停止位、8位數(shù)據(jù)位UBRR0L = 0x17; /set baud rate loUBRR0H = 0x00; /set baud rate hi 設(shè)置UART0口通信速率9600UCSR0B = 0x18;void putchar(unsigned char content)while(!(UC

13、SR0A & (1 << UDRE0); /* 判斷上次發(fā)送有沒有完成 */UDR0 = content; /* 發(fā)送數(shù)據(jù) */void putstr(unsigned char *s)while(*s)putchar(*s);s+;/*/ 端口初始化void SD_Port_Init(void)/*SD_PORT |= (1<<SD_DDR |= (1<<<SD_DDR &= (1</*/ 初始化 MMC/SD 卡為SPI模式unsigned char SD_Init(void)/*unsigned char retry,tem

14、p;unsigned char i;SPCR=0x53; /設(shè)定SPI為128分頻,慢速進(jìn)行初始化SPSR=0x00;for (i=0;i<0x0f;i+) SPI_TransferByte(0xff); /延遲74個(gè)以上的時(shí)鐘SD_Enable(); /開片選SPI_TransferByte(SD_RESET); /發(fā)送復(fù)位命令SPI_TransferByte(0x00);SPI_TransferByte(0x00);SPI_TransferByte(0x00);SPI_TransferByte(0x00);SPI_TransferByte(0x95); SPI_TransferByt

15、e(0xff);SPI_TransferByte(0xff);retry=0;dotemp="Write"_Command_SD(SD_INIT,0); /發(fā)送初始化命令retry+;if(retry=100) /重試100次SD_Disable(); /關(guān)片選return(INIT_CMD1_ERROR); /如果重試100次失敗返回錯(cuò)誤號(hào)while(temp!=0); MSD_Disable(); /關(guān)片選SPCR=0x50; /設(shè)置SPI為2分頻。進(jìn)行高速讀寫SPSR=0x01;return(TRUE); /返回成功/*/ 發(fā)送命令給 MMC/SD卡/Return:

16、返回MMC/SD卡對命令響應(yīng)的第2字節(jié),作為命令成功判斷unsigned char Write_Command_SD(unsigned char cmd,unsigned long address)/*unsigned char tmp;unsigned char retry="0"SD_Disable();SPI_TransferByte(0xFF);SD_Enable();SPI_TransferByte(cmd); /將32位地址進(jìn)行移位作為地址字節(jié) SPI_TransferByte(address>>24);SPI_TransferByte(addres

17、s>>16);SPI_TransferByte(address>>8);SPI_TransferByte(address);SPI_TransferByte(0xFF);SPI_TransferByte(0xFF);dotmp = SPI_TransferByte(0xFF); /發(fā)送8個(gè)時(shí)鐘接受最后一個(gè)字節(jié) retry+;while(tmp=0xff)&&(retry<8);return(tmp);/*/ 寫一個(gè)扇區(qū)(512Byte) to MMC/SD-Card/如果寫完成返回TRUEunsigned char SD_write_sector(

18、unsigned long addr,unsigned char *Buffer)/*unsigned char temp;unsigned int i;SPI_TransferByte(0xFF); /延遲8個(gè)時(shí)鐘 SD_Enable(); /開片選temp = Write_Command_MMC(MMC_WRITE_BLOCK,addr<<9); /發(fā)送寫扇區(qū)命令if(temp != 0x00)SD_Disable();return(temp);SPI_TransferByte(0xFF);SPI_TransferByte(0xFF);SPI_TransferByte(0xFE

19、);for (i=0;i<512;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位為0101,為操作成功。否則為操作失敗。SD_Disable();return(WRITE_BLOCK_ERROR); /返回錯(cuò)誤while (SPI_TransferByte(

20、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_TransferByte(0xff); MMC_Enable();temp = Write_Command_SD(SD_READ_BLOCK,addr<<9)

21、;/發(fā)送讀扇區(qū)命令if(temp != 0x00)SD_Disable();return(READ_BLOCK_ERROR); /返回錯(cuò)誤號(hào) while(SPI_TransferByte(0xff) != 0xfe);for(i=0;i<512;i+)data = SPI_TransferByte(0xff); /存數(shù)據(jù) *Buffer+=data;SPI_TransferByte(0xff); /讀CRC碼SPI_TransferByte(0xff); /讀CRC碼SD_Disable();return(TRUE); /返回成功/*/ 查找數(shù)據(jù)開始標(biāo)志(預(yù)設(shè)DATASTART)根據(jù)實(shí)際

22、需要?jiǎng)h改/*unsigned long SD_find(void) unsigned long tmp="400"unsigned char data512;doSD_read_sector(tmp,data); /從0扇區(qū)開始查找tmp+; /查找DATASTART while(!(data0='D')&&(data1='A')&&(data2='T')&&(data3='A')&&(data4='S')&&(da

23、ta5='T')&&(data6='A')&&(data7='R')&&(data8='T');return tmp; /返回開始標(biāo)志的下一個(gè)扇區(qū) /*/ 發(fā)送一個(gè)字節(jié)/*unsigned char SPI_TransferByte(unsigned char byte)SPDR = byte;while (!(SPSR & 0x80); /檢測線路是否空閑 return SPDR;/*/ 主程序例子/*void main(void) unsigned long temp;u

24、nsigned char data512;unsigned char data2512='sssssssssssssssssssssssss'unsigned char comm1='/r/nhello world/r/n'unsigned char comm2='/r/nSD_INIT OK/r/n'uart0_init();SD_Port_Init(); /端口初始化if(SD_Init()= 0x01) /SD卡初始化,并讀取返回值putstr(comm2);temp="SD"_find(); /查找DATASTART數(shù)

25、據(jù)開始標(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ù)寫入temp扇區(qū)測試程序很簡單,僅僅是做了一下讀寫SD卡的測試。 關(guān)于SD卡的幾點(diǎn)注意事項(xiàng)。 1、無論我們愿意不愿意,SD卡每次讀寫數(shù)據(jù)的最小單位是1個(gè)扇區(qū),即512個(gè)字節(jié)。 2、SD卡與單片機(jī)連接的 SPI總線不能太長,要盡量短。這樣的好處是速度可以更快,也不容易出錯(cuò)。 3、雖然我們并不關(guān)心FAT文件表,但是我們?nèi)匀灰P(guān)心SD卡的存儲(chǔ)結(jié)構(gòu),如果我們不想使用PC機(jī)來讀取保存在SD卡上的數(shù)據(jù)那我們就不用關(guān)心SD存儲(chǔ)結(jié)構(gòu)了。但,作為一個(gè)大容量的可移動(dòng)存儲(chǔ)設(shè)備,不能用PC機(jī)來讀取是個(gè)很大的遺憾,我解決這個(gè)遺憾

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論