SD原理及內(nèi)部結(jié)構(gòu)_第1頁
SD原理及內(nèi)部結(jié)構(gòu)_第2頁
SD原理及內(nèi)部結(jié)構(gòu)_第3頁
SD原理及內(nèi)部結(jié)構(gòu)_第4頁
SD原理及內(nèi)部結(jié)構(gòu)_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、SD原理及內(nèi)部結(jié)構(gòu)1、間介:SDxx (Secure Digital Memory Card )是一種為滿足XX、容量、性能和使用環(huán)境等各方面的需求而設(shè)計的 一種新型存儲器件,SDxx允許在兩種模式下工作,即 SD模式和SPI模式,本 系統(tǒng)采用SPI模式。本小節(jié) 僅間要介紹在SPI模式下,STM32處理器如何讀寫 SDxx如果讀者如希望詳細了解 SDxx,可以參考相關(guān) 資料。SD xx內(nèi)部結(jié)構(gòu)及引腳如下圖所示:VDDDAT2CMDCLKDATOCD/DAT3InTeTface driverDAT1OCR31:2 |O01X127:0jnterfaoe conolJerSCRffiSzOl K*

2、RjCA(15:0DSR1?O窯p sMemor,1' core interfacereset2、SDxx官腳圖:5-1 4MINl "川0 25M1No nruxyEqSDxx內(nèi)部圖JPGo hm rj1.1MINI切P05 I I 1095 S 7 6 CLL VSIDATDDA'zlxln 爐磊t Mglz°lm!'日kflfl-4FUrpn-ibl?General Ta <ern<e +0 15SDxx .JPG3、SPI模式下SD各管腳名稱為:sd卡:liiblcJ 2. SPI Bus Mode Pud DefinitionP

3、in#NameType1SPI Description1CSChip Select (Active low)2Oataln1Host to Care Ccrnmards and Dala3VSS1sSupply Voftage Ground4VDDgSupply Voltage5CLK1ClockVSS2sS叩血 Voltage Ground7DataOut0Card to Host Data and Status8RSV1Reserved9RSV(2)1ReservedSPI模式下SD各管腳名稱 為JPG注:般SD有兩種模式:SD模式和SPI模式,管腳定義如下:(A) 、SDMODE、CD/

4、DATA3 2、CMCB、VSS14、VDD5、CLK6、VSS2 7、DATA0 8 DATA1 9 DATA2(B) 、SPI MODE 1 CS2 DI 3、VSS 4 VDD 5 SCLK 6 VSS2 7、 DO8 RSV 9 RSVSD xx主要引腳和功能為:CLK時鐘信號,每個時鐘周期傳輸一個命令或數(shù)據(jù)位, 頻率可在025MHz之間變化,SDxx的總線管理器可以不受任何限制的自由產(chǎn)生025MHz的頻率;CMD雙向命令和回復(fù)線,命令是一次主機到從 xx操作的開始,命令 可以是從主機到單xx尋址,也可以是到所有xx;回復(fù)是對之前命令 的回答,回復(fù)可以來自單xx或所有xx;DAT3:數(shù)

5、據(jù)線,數(shù)據(jù)可以xx向主機也可以從主機傳向xx。SDxx以命令形式來控制SDxx的讀寫等操作??筛鶕?jù)命令對多塊或單 塊進行讀寫操作。在SPI模式下其命令由6個字節(jié)構(gòu)成,其中高位在 前。SDxx命令 的格式如表1所示,其中相關(guān)參數(shù)可以查閱 SDxx規(guī) 范。4、MicroSDxx 管腳圖:MicroSDxx 管腳圖.JPG5、MicroSDxx管腳名稱:Pifl#SD ModeSPI ModeNameTyp«1DescriptianNameTypeDescription工DAT2l;O.'PPData Line 呂 it 21RSVReserved2CD/DAT3'Card

6、 Detect : Data Line EH 3CSrSnip Select (neg true)CMDPPGGirmyrid/ReiipQribt01iDate In4艱SSupply tfollyqt?7益sSupj.ly VDltqnCLKIClockSCLKiClock6sSupp y voltage groundV翌sSupply voltagE .ground工DATOLOPPDate Line BA 0DO0 PPData OutrFDAT1|.C;PPCdh irh.1RSVReservedMicroSDxx管腳名 稱PGSD xx與MicroSDxx僅僅是圭寸裝上的不同,Mi

7、croSDxx更小,大 小上和一個SIMxx差不多,但是協(xié)議與SDxx相同。一般我們用單片機操作SDxx時,都不需要對FAT分區(qū)表信息做處理, 原因如下:1)、操作FAT分區(qū)表要增加程序代碼量、增加 SRAM勺消耗,對于便 攜應(yīng)用來說代碼大小和占用SRAM勺多少至關(guān)重要。2)、即使我們對FAT分區(qū)表不做任何了解,實際上我們一樣可以向 SDxx上寫入數(shù)據(jù),這就表明使用FAT對我們做數(shù)據(jù)存儲應(yīng)用來說如 同雞肋。3)、耗費大量經(jīng)歷和時間去了解 FAT分區(qū)表對于我們做嵌入式軟件 開發(fā)的人來說有些得不償失。4)、SDxx支持 兩種操作模式,SD模式和SPI模式,SPI模式做SD 數(shù)據(jù)操作時根本不需要知道

8、 FAT這時候SDxx對于我們來說實際上 就是個大的、快速的、方便的、容 量可變的外部存儲器?;谝陨显颍话闱闆r下對 SDxx的操作只需要了解SPI通訊就可 以了,而現(xiàn)在大部分單片機都有 SPI接口,那么操作SDxx易如反掌。以下是做SDxx試驗時使用的電路圖:47K<i47K1JSD_( SRS 47KiiRSV2SDRSVlSD_CARD亠 SD舊妥I ISD 原理及內(nèi)部結(jié)構(gòu)SDxx試驗時使用的電路 圖JPGSD_CS/連接到單片機的片選SD管腳,只有單片機設(shè)置SD_CS/ 為低電平時才可以操作 SDxx。MOS連接單片機SPI總線的MOSI管腳(SPI數(shù)據(jù)輸入),單片機從 這個

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

10、入 xx的檢測,實際上現(xiàn) 在很多SDxx/MicroSDxx插座都有插入檢測管腳,當(dāng)然,一分錢一分 貨,價格上當(dāng)然 也要貴一些順便提一下,普通SDxx插座最多5塊錢。SPI 命令格式Byte 1Byte2-5Byte 6765 031 07001CommandCommand ArgumentCRC1以下是一個簡單的測試SDxx讀 寫的程序,程序是基于Atmega128單片機編寫的,對于 Atmega的其他單片機僅需要做管腳改動就可以使用,其他單片機更改要更大。sd.h/*/SPI 各線所占用的端口#define SD_SSPB6#define SD_SCKPB1#define SD_MOSIP

11、B2#define SD_MISOPB3/*#define SD_DDRDDRB#define SD_PORTPORTB#define SD_PINPINB#define SD_SS_HSD_PORT |= (1<#define SDSS_LSD_PORT &= (1<#define SD_SCK_HSD_PORT |= (1<#define SD_SCK_LSD_PORT &= (1<#define SD_MOSI_HSD_PORT |= (1<#define SD_MOSI_LSD_PORT &= (1<#define SD_MI

12、SO_IN(SD_PIN&(1</ 錯誤號/ #define INIT_CMD0_ERROR0xFF#define INIT_CMD1_ERROR0xFE#define WRITE_BLOCK_ERROR0xFD#define READ_BLOCK_ERROR0xFC#define TRUE0x01/ MMC/SD命令(命令號從40開始,只列出基本命令,并沒有都使用)/#define SD_RESET0x40 + 0#define SD_INIT0x40 + 1#define SD_READ_CSD0x40 + 9#define SD_READ_CID0x40 + 10#defi

13、ne SD_STOP_TRANSMISSION0x40 + 12#define SD_SEND_STATUS0x40 + 13#define SD_SET_BLOCKLEN0x40 + 16#define SD_READ_BLOCK0x40 + 17#define SD_READ_MULTI_BLOCK0x40 + 18#define SD_WRITE_BLOCK0x40 + 24#define SD_WRITE_MULTI_BLOCK0x40 + 25/ 片選關(guān)(MMC/SD-Card In valid)#define SD_Disable()SD_SS_H/ 片選開 (MMC/SD-Car

14、d 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 char SD_Init(

15、void);unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer);charunsigned char SD_read_sector(unsigned long addr,unsigned *Buffer);unsigned char SPI_TransferByte(unsigned char byte);unsigned char Write_Command_SD(unsigned char cmd,unsigned long address);unsigned long SD_find(void);

16、/*/ 串口調(diào)試程序 /*void uart0_init(void)UCSR0B = 0x00; /disable while setting baud rateUCSR = 0x00;UCSR = 0x06; / 00000110 UART0 設(shè)置為異步模式、無奇偶校驗、 1 位停止位、 8 位數(shù)據(jù)位UBRR = 0x17; /set baud rate loUBRROH = OxOO; /set baud rate hi 設(shè)置 UART(口通信速率 9600UCSR0B = 0x18;void putchar(unsigned char content)while(!(UCSR &

17、 (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 xx為SPI模式unsigned char SD_Init(void)*unsigned char retry,temp;unsigned char

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

19、ferByte(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 次失敗返回錯誤號while(temp!=0);MSD_Disable();/ 關(guān)片選SPCR=0x50;設(shè)置SPI為2分頻。進行高速讀寫SPSR=0x01;return(TRUE);/ 返回成功*/ 發(fā)送命令給 MMC/SDxx/Return:返回MMC/SDx對命令響應(yīng)的第

20、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位地址進行移位作為地址字節(jié) SPI_TransferByte(address>>24);SPI_TransferByte(address>>16);SP

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

22、g addr,unsigned char *Buffer)/*unsigned char temp;unsigned int i;SPI_TransferByte(0xFF);/ 延遲 8 個時鐘 SD_Enable();/ 開片選temp = Write_Comma nd_MMC(MMC_WRITE_BLOCK,addr<<發(fā)送寫扇區(qū)命令if(temp != 0x00)SD_Disable();return(temp);SPI_TransferByte(0xFF);SPI_TransferByte(0xFF);SPI_TransferByte(0xFE);for (i=0;i&l

23、t;512;i+)SPI_TransferByte(*Buffer+); / 發(fā)送 512字節(jié)數(shù)據(jù)/CRC-ByteSPI_TransferByte(0xFF); /Dummy CRC SPI_TransferByte(0xFF); /CRC Codetemp = SPI_TransferByte(OxFF);/ 讀 SDxx運行響應(yīng)if(temp & 0x)!=0x05)/ 如果最后 4位為 0101,為操作成功。否則 為操作失敗。SD_Disable();return(WRITE_BLOCK_ERROR); /返回錯誤while (SPI_TransferByte(0xFF) !=

24、 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_Comma nd_SD(SD_READ_BL0CK,addr<<9)發(fā)送讀扇區(qū) 命令

25、if(temp != 0x00)SD_Disable();return(READ_BLOCK_ERROR);返回錯誤號while(SPI_TransferByte(0xff) != 0xfe);for(i=0;i<512;i+)data = SPI_TransferByte(0xff);/ 存數(shù)據(jù)*Buffer+=data;SPI_TransferByte(Oxff);讀 CRC碼SPI_TransferByte(Oxff);/讀 CRC碼SD_Disable();return(TRUE);/ 返回成功/*/查找數(shù)據(jù)開始標(biāo)志(預(yù)設(shè) DATASTART根據(jù)實際需要刪改/*unsigned

26、long SD_find(void)unsigned long tmp="400"unsigned char data512;doSD_read_sector(tmp,data);/ 從 0 扇區(qū)開始查找tmp+;/ 查找DATASTARTwhile(!(data0='D')&&(data1='A')&&(data2='T')&&(data3='A')&&(data4='S')&&(data5='T'

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

28、512;unsigned char data2512='sssssssssssssssssssssssss'unsigned char comm1='rnhello worldrn'unsigned char comm2='rnSD_INIT OKrn'uart0_init();SD_Port_Init();/ 端口初始化 if(SD_Init()= 0x01)/SDxx 初始化,并讀取返回值 putstr(comm2);temp二"SD"_find();查找DATASTAR數(shù)據(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ū)測試程序很簡單,僅僅是做了一下讀寫 SDxx的測試。關(guān)于SDxx的幾點注意事項。1、無論我們愿意不愿意,SDxx每次讀寫數(shù)據(jù)的最小單位是1個扇區(qū), 即 512 個字節(jié)。2、SDxx與單片機連接的SPI總線不能太長,要盡量短。這樣的好處 是速度可以更快,也不容易出錯。3、雖然我們并不關(guān)心FAT文件表,但是我們?nèi)匀灰P(guān)心SDx

溫馨提示

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

評論

0/150

提交評論