sd卡學習筆記_第1頁
sd卡學習筆記_第2頁
sd卡學習筆記_第3頁
sd卡學習筆記_第4頁
sd卡學習筆記_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、1、 簡介:sd卡(secure digital memory card)是一種為滿足安全性、容量、性能和使用環境等各方面的需求而設計的一種新型存儲器件,sd卡允許在兩種模式下工作,即sd模式和spi模式,本 系統采用spi模式。本小節僅簡要介紹在spi模式下,stm32處理器如何讀寫sd卡,如果讀者如希望詳細了解sd卡,可以參考相關資料。sd 卡內部結構及引腳如下圖所示:sd卡內部圖.jpg2、sd卡管腳圖:sd卡圖.jpg3、spi模式下sd各管腳名稱為:sd 卡:spi模式下sd各管腳名稱 為.jpg注: 一般sd有兩種模式:sd模式和spi模式,管腳定義如下:(a)、sd mode 1

2、、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:時鐘信號,每個時鐘周期傳輸一個命令或數據位,頻率可在025mhz之間變化,sd卡的總線管理器可以不受任何限制的自由產生025mhz 的頻率;cmd:雙向命令和回復線,命令是一次主機到從卡操作的開始,命令可以是從主機到單卡尋址,也可以是到所有卡;回復是對之前命令的回答,回復可以來自單 卡或所有卡;dat03

3、:數據線,數據可以從卡傳向主機也可以從主機傳向卡。sd卡以命令形式來控制sd卡的讀寫等操作。可根據命令對多塊或單塊進行讀寫操作。在spi模式下其命令由6個字節構成,其中高位在前。sd卡命令 的格式如表1所示,其中相關參數可以查閱sd卡規范。4、microsd卡管腳圖:microsd卡管腳圖.jpg5、microsd卡管腳名稱:microsd卡管腳名 稱.jpgsd 卡與microsd卡僅僅是封裝上的不同,microsd卡更小,大小上和一個sim卡差不多,但是協議與sd卡相同。一般我們用單片機操作sd 卡時,都不需要對fat分區表信息做處理,原因如下:1)、操作fat分區表要增加程序代碼量、增加

4、sram的消耗,對于便攜應用來說代碼大小和 占用sram的多少至關重要。2)、即使我們對fat分區表不做任何了解,實際上我們一樣可以向sd卡上寫入數據,這就表明使用fat對我們做數 據存儲應用來說如同雞肋。3)、耗費大量經歷和時間去了解fat分區表對于我們做嵌入式軟件開發的人來說有些得不償失。4)、sd卡支持 兩種操作模式,sd模式和spi模式,spi模式做sd數據操作時根本不需要知道fat,這時候sd卡對于我們來說實際上就是個大的、快速的、方便的、容 量可變的外部存儲器。基于以上原因,一般情況下對sd卡的操作只需要了解spi通訊就可以了,而現在大部分單片機都有spi接口,那么操作sd卡 易如

5、反掌。以下是做sd卡試驗時使用的電路圖:sd卡試驗時使用的電路 圖.jpgsd_cs/ 連接到單片機的片選sd管腳,只有單片機設置sd_cs/為低電平時才可以操作sd卡。mosi連接單片機spi總線的mosi管腳(spi數據 輸入),單片機從這個管腳讀取sd卡內的數據。miso連接單片機spi總線的miso管腳(spi數據輸出)、單片機通過這個管腳向sd卡內寫 入數據。sck連接單片機spi總線的sck(spi時鐘)sd管腳實際上在sd卡內部連接到了gnd,當sd插座上沒插入sd卡時,單 片機從這個管腳能讀到高電平(前提是使用單片機內部上拉輸入,或者外部增加一個上拉電阻),一旦插入sd卡,這個

6、管腳就變成低電平,這個功能用來檢測是否 插入sd卡。rsv1和rsv2是保留功能管腳,不需要操作。microsd卡的連接和sd卡大同小異,只是microsd卡比sd卡少 一個gnd管腳,所以不能使用上面做的這種插入卡的檢測,實際上現在很多sd卡/microsd卡插座都有插入檢測管腳,當然,一分錢一分貨,價格上當然 也要貴一些順便提一下,普通sd卡插座最多5塊錢。spi命令格式byte 1byte2-5byte 6765 031 07001commandcommand argumentcrc1以下是一個簡單的測試sd卡讀 寫的程序,程序是基于atmega128單片機編寫的,對于atmega的其他

7、單片機僅需要做管腳改動就可以使用,其他單片機更改要更大。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 &= (1#

8、define sd_mosi_h sd_port |= (1#define sd_mosi_l sd_port &= (1#define sd_miso_in (sd_pin&(1/-/ 錯誤號/-#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 命令(命令號從40開始,只列出基本命令,并沒有都使用)/-#define sd_reset 0x40 + 0 #d

9、efine 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_write_m

10、ulti_block 0x40 + 25/片選關(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#include#include#include sd.hvoid uart0_init(void);void putchar(unsigned char conte

11、nt);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 write_

12、command_sd(unsigned char cmd,unsigned long address);unsigned long sd_find(void);/*/ 串口調試程序/*void uart0_init(void)ucsr0b = 0x00; /disable while setting baud rateucsr0a = 0x00;ucsr0c = 0x06; / 00000110 uart0設置為異步模式、無奇偶校驗、1位停止位、8位數據位ubrr0l = 0x17; /set baud rate loubrr0h = 0x00; /set baud rate hi 設置uar

13、t0口通信速率9600ucsr0b = 0x18;void putchar(unsigned char content)while(!(ucsr0a & (1 udre0); /* 判斷上次發送有沒有完成 */udr0 = content; /* 發送數據 */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_init(v

14、oid)/*unsigned char retry,temp;unsigned char i;spcr=0x53; /設定spi為128分頻,慢速進行初始化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); /發送8個時鐘接受最后一個字節 retry+;while(tmp=0xff)&

15、(retry8);return(tmp);/*/ 寫一個扇區(512byte) to mmc/sd-card/如果寫完成返回trueunsigned char sd_write_sector(unsigned long addr,unsigned char *buffer)/*unsigned char temp;unsigned int i;spi_transferbyte(0xff); /延遲8個時鐘 sd_enable(); /開片選temp = write_command_mmc(mmc_write_block,addr9); /發送寫扇區命令if(temp != 0x00)sd_di

16、sable();return(temp);spi_transferbyte(0xff);spi_transferbyte(0xff);spi_transferbyte(0xfe);for (i=0;i512;i+)spi_transferbyte(*buffer+); /發送512字節數據/crc-bytespi_transferbyte(0xff); /dummy crcspi_transferbyte(0xff); /crc codetemp = spi_transferbyte(0xff); /讀sd卡運行響應if(temp & 0x1f)!=0x05) /如果最后4位為0101,為操作

17、成功。否則為操作失敗。sd_disable();return(write_block_error); /返回錯誤while (spi_transferbyte(0xff) != 0xff);sd_disable();return(true); /返回成功 /*/ 讀512字節 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_trans

18、ferbyte(0xff); mmc_enable();temp = write_command_sd(sd_read_block,addr9);/發送讀扇區命令if(temp != 0x00)sd_disable();return(read_block_error); /返回錯誤號 while(spi_transferbyte(0xff) != 0xfe);for(i=0;i512;i+)data = spi_transferbyte(0xff); /存數據 *buffer+=data;spi_transferbyte(0xff); /讀crc碼spi_transferbyte(0xff);

19、 /讀crc碼sd_disable();return(true); /返回成功/*/ 查找數據開始標志(預設datastart)根據實際需要刪改/*unsigned long sd_find(void) unsigned long tmp=400;unsigned char data512;dosd_read_sector(tmp,data); /從0扇區開始查找tmp+; /查找datastart while(!(data0=d)&(data1=a)&(data2=t)&(data3=a)&(data4=s)&(data5=t)&(data6=a)&(data7=r)&(data8=t);r

20、eturn tmp; /返回開始標志的下一個扇區 /*/ 發送一個字節/*unsigned char spi_transferbyte(unsigned char byte)spdr = byte;while (!(spsr & 0x80); /檢測線路是否空閑 return spdr;/*/ 主程序例子/*void main(void) unsigned long temp;unsigned char data512;unsigned char data2512=sssssssssssssssssssssssss;unsigned char comm1=rnhello worldrn;uns

21、igned char comm2=rnsd_init okrn;uart0_init();sd_port_init(); /端口初始化if(sd_init()= 0x01) /sd卡初始化,并讀取返回值putstr(comm2);temp=sd_find(); /查找datastart數據開始標志,返回下一扇區地址sd_read_sector(1001,data); /讀取temp地址的512字節數據,512字節數據存入data數組putstr(data); sd_write_sector(temp,data2); /將data2數組512字節數據寫入temp扇區測試程序很簡單,僅僅是做了一下

22、讀寫sd卡的測試。關于sd卡的幾點注意事項。1、無論我們愿意不愿意,sd卡每次讀寫數據的最小單位是1個扇區,即512個字節。2、sd卡與單片機連接的 spi總線不能太長,要盡量短。這樣的好處是速度可以更快,也不容易出錯。3、雖然我們并不關心fat文件表,但是我們仍然要關心sd卡的存儲結構,如果我們不想使用pc機來讀取保存在sd卡上的數據那我們就不用關心sd存儲結構了。但,作為一個大容量的可移動存儲設備,不能用pc機來讀取是個很大的遺憾,我解決這個遺憾的方法如下:3-1、因為我不了解fat復雜的結構,所以我做的程序沒法去按照fat表的各項功能來進行創建文件、刪除文件、創建目錄等等操作。3-2、雖然我們的單片機不能創建文件,但是pc機是可以創建文件的

溫馨提示

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

評論

0/150

提交評論