基于-Atmega128單片機(jī)SD卡讀寫程序_第1頁(yè)
基于-Atmega128單片機(jī)SD卡讀寫程序_第2頁(yè)
基于-Atmega128單片機(jī)SD卡讀寫程序_第3頁(yè)
基于-Atmega128單片機(jī)SD卡讀寫程序_第4頁(yè)
基于-Atmega128單片機(jī)SD卡讀寫程序_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、-. z基于Atmega128單片機(jī)SD卡讀寫程序?qū)嵨飯D對(duì)照接線圖以下是一個(gè)簡(jiǎn)單的測(cè)試SD卡讀寫的程序,程序是基于Atmega128單片機(jī)編寫的,對(duì)于Atmega的其他單片機(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

2、 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&(1/-/ 錯(cuò)誤號(hào)/-*define INIT_CMD0_ERROR 0*FF*define INIT_CMD1_ERROR 0*FE*define WRITE_BLOCK_ERROR 0*FD*define READ_BLOCK_ERROR 0*FC*def

3、ine TRUE 0*01/- / MMC/SD 命令(命令號(hào)從40開場(chǎng),只列出根本命令,并沒有都使用)/-*define SD_RESET 0*40 + 0 *define SD_INIT 0*40 + 1*define SD_READ_CSD 0*40 + 9*define SD_READ_CID 0*40 + 10*define SD_STOP_TRANSMISSION 0*40 + 12*define SD_SEND_STATUS 0*40 + 13*define SD_SET_BLOCKLEN 0*40 + 16*define SD_READ_BLOCK 0*40 + 17*defi

4、ne SD_READ_MULTI_BLOCK 0*40 + 18*define SD_WRITE_BLOCK 0*40 + 24*define SD_WRITE_MULTI_BLOCK 0*40 + 25/片選關(guān)(MMC/SD-Card Invalid)*define SD_Disable() SD_SS_H/片選開 (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*

5、include *include *include sd.hvoid uart0_init(void);void putchar(unsigned char 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 c

6、har *Buffer);unsigned char SPI_TransferByte(unsigned char byte);unsigned char Write_mand_SD(unsigned char cmd,unsigned long address);unsigned long SD_find(void);/*/串口調(diào)試程序/*void uart0_init(void)UCSR0B = 0*00; /disable while setting baud rateUCSR0A = 0*00;UCSR0C = 0*06; / 00000110 UART0設(shè)置為異步模式、無奇偶校驗(yàn)、1

7、位停頓位、8位數(shù)據(jù)位UBRR0L = 0*17; /set baud rate loUBRR0H = 0*00; /set baud rate hi 設(shè)置UART0口通信速率9600UCSR0B = 0*18; void putchar(unsigned char content) while(!(UCSR0A & (1 UDRE0); /* 判斷上次發(fā)送有沒有完成 */ UDR0 = content; /* 發(fā)送數(shù)據(jù) */void putstr(unsigned char *s) while(*s) putchar(*s); s+; /*/端口初始化void SD_Port_Init(voi

8、d)/* SD_PORT |= (1 SD_DDR |= (1 SD_DDR &= (1/*/初始化 MMC/SD 卡為SPI模式unsigned char SD_Init(void)/* unsigned char retry,temp; unsigned char i; SPCR=0*53; /設(shè)定SPI為128分頻,慢速進(jìn)展初始化 SPSR=0*00; for (i=0;i24); SPI_TransferByte(address16); SPI_TransferByte(address8); SPI_TransferByte(address); SPI_TransferByte(0*F

9、F); SPI_TransferByte(0*FF); do tmp = SPI_TransferByte(0*FF); /發(fā)送8個(gè)時(shí)鐘承受最后一個(gè)字節(jié) retry+; while(tmp=0*ff)&(retry8); return(tmp);/*/寫一個(gè)扇區(qū)(512Byte) to MMC/SD-Card/如果寫完成返回TRUEunsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)/* unsigned char temp; unsigned int i; SPI_TransferByte(0*FF);

10、 /延遲8個(gè)時(shí)鐘 SD_Enable(); /開片選 temp = Write_mand_MMC(MMC_WRITE_BLOCK,addr9); /發(fā)送寫扇區(qū)命令 if(temp != 0*00) SD_Disable(); return(temp); SPI_TransferByte(0*FF); SPI_TransferByte(0*FF); SPI_TransferByte(0*FE); for (i=0;i512;i+) SPI_TransferByte(*Buffer+); /發(fā)送512字節(jié)數(shù)據(jù) /CRC-Byte SPI_TransferByte(0*FF); /Dummy CRC

11、 SPI_TransferByte(0*FF); /CRC Code temp = SPI_TransferByte(0*FF); /讀SD卡運(yùn)行響應(yīng) if(temp & 0*1F)!=0*05) /如果最后4位為0101,為操作成功。否則為操作失敗。 SD_Disable(); return(WRITE_BLOCK_ERROR); /返回錯(cuò)誤 while (SPI_TransferByte(0*FF) != 0*FF); SD_Disable(); return(TRUE); /返回成功 /*/讀512字節(jié) from MMC/SD-Card/如果成功返回TRUEunsigned char S

12、D_read_sector(unsigned long addr,unsigned char *Buffer)/* unsigned char temp; unsigned int i; unsigned char data; SPI_TransferByte(0*ff); MMC_Enable(); temp = Write_mand_SD(SD_READ_BLOCK,addr9);/發(fā)送讀扇區(qū)命令 if(temp != 0*00) SD_Disable(); return(READ_BLOCK_ERROR); /返回錯(cuò)誤號(hào) while(SPI_TransferByte(0*ff) != 0

13、*fe); for(i=0;i512;i+) data = SPI_TransferByte(0*ff); /存數(shù)據(jù) *Buffer+=data; SPI_TransferByte(0*ff); /讀CRC碼 SPI_TransferByte(0*ff); /讀CRC碼 SD_Disable(); return(TRUE); /返回成功/*/查找數(shù)據(jù)開場(chǎng)標(biāo)志預(yù)設(shè)DATASTART根據(jù)實(shí)際需要?jiǎng)h改/*unsigned long SD_find(void) unsigned long tmp=400; unsigned char data512; do SD_read_sector(tmp,dat

14、a); /從0扇區(qū)開場(chǎng)查找 tmp+; /查找DATASTART while(!(data0=D)&(data1=A)&(data2=T)&(data3=A)&(data4=S)&(data5=T)&(data6=A)&(data7=R)&(data8=T); return tmp; /返回開場(chǎng)標(biāo)志的下一個(gè)扇區(qū) /*/發(fā)送一個(gè)字節(jié)/*unsigned char SPI_TransferByte(unsigned char byte)SPDR = byte;while (!(SPSR & 0*80); /檢測(cè)線路是否空閑 return SPDR;/*/主程序例子/*void main(void)

15、 unsigned long temp;unsigned char data512;unsigned char data2512=sssssssssssssssssssssssss;unsigned char m1=rnhello worldrn;unsigned char m2=rnSD_INIT OKrn;uart0_init(); SD_Port_Init(); /端口初始化if(SD_Init()= 0*01) /SD卡初始化,并讀取返回值putstr(m2);temp=SD_find(); /查找DATASTART數(shù)據(jù)開場(chǎng)標(biāo)志,返回下一扇區(qū)地址SD_read_sector(1001,

16、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ū)測(cè)試程序很簡(jiǎn)單,僅僅是做了一下讀寫SD卡的測(cè)試。關(guān)于SD卡的幾點(diǎn)考前須知:1、無論我們?cè)敢獠辉敢猓琒D卡每次讀寫數(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ǔ)構(gòu)造,如果我們不想使用PC機(jī)來讀取保存在SD卡上的數(shù)據(jù)那我們就不用關(guān)心SD

17、存儲(chǔ)構(gòu)造了。但,作為一個(gè)大容量的可移動(dòng)存儲(chǔ)設(shè)備,不能用PC機(jī)來讀取是個(gè)很大的遺憾,我解決這個(gè)遺憾的方法如下:3-1、因?yàn)槲也涣私釬AT復(fù)雜的構(gòu)造,所以我做的程序沒法去按照FAT表的各項(xiàng)功能來進(jìn)展創(chuàng)立文件、刪除文件、創(chuàng)立目錄等等操作。3-2、雖然我們的單片機(jī)不能創(chuàng)立文件,但是PC機(jī)是可以創(chuàng)立文件的??!所以我使用PC機(jī)將SD卡格式化,之后在SD卡上創(chuàng)立一個(gè)大文件,比方我的128M的SD卡上我建立了一個(gè)100M的文件。這里需要注意一下,一般使用windows創(chuàng)立文件的功能時(shí)是沒有方法指定創(chuàng)立文件的大小的,空文件就是0個(gè)字節(jié)的長(zhǎng)度,而我們是需要一個(gè)固定長(zhǎng)度的文件的,所以我用VC編寫了一個(gè)小軟件,這個(gè)軟件可以為我創(chuàng)立一個(gè)100M長(zhǎng)度的空文件,記住,這點(diǎn)很重要:一個(gè)固定長(zhǎng)度的空文件3-3、雖然我們建立了個(gè)文件在SD卡上,可是我們因?yàn)椴蝗チ私釬AT表,所以我們一樣不知道這個(gè)文件到底位于SD卡的什么地方,不要以為它會(huì)在0字節(jié)的地方開場(chǎng),為了找到這個(gè)文件的開場(chǎng)位置,我們可以在建立的那個(gè)空文件的開頭寫上幾個(gè)字符,比方我程序里面寫的DATASTART,接下來我們要做的就是一個(gè)扇區(qū)一個(gè)扇區(qū)的去找這個(gè)幾個(gè)特殊的字符,這是個(gè)笨方法,但卻是最簡(jiǎn)單直觀的方法。這個(gè)方法有兩個(gè)缺點(diǎn):a、如果文件建立在整個(gè)SD卡的后面,那找到這個(gè)文

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論