[信息與通信]SD卡_第1頁
[信息與通信]SD卡_第2頁
[信息與通信]SD卡_第3頁
[信息與通信]SD卡_第4頁
[信息與通信]SD卡_第5頁
已閱讀5頁,還剩46頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、.SD卡資料協議規范 2009-09-25 21:30:55 閱讀344 評論0 字號:大中小 這些天沒有出門,一直在家研究SD卡的SPI模式的初始化順序,這里為大家總結了一下編寫該程序所需要的知識: 1.SD卡的官方資料(我承認這個資料很垃圾,比起民間的技術總結它的內容可謂又臭又長,但是作為基礎也要了解一下,SD協議不用看) 2.清晰明了的MMC卡時序圖(雖然這個是MMC卡的,但是在初始化的時候CMD0的時序是一樣的)電路:我用的SD卡的電路其實很簡單,參考SD卡的官方資料中的電路鏈接就可以的。供電問題:由于SD卡的電壓是3.3V,所以你的CPU必須支持3.3V的IO端口輸出。再來說一說雞毛

2、蒜皮的細節:1.為了使SD卡初始化進入SPI模式,我們需要使用的命令有3個:CMD0,ACMD41,CMD55(使用ACMD類的指令前應先發CMD55,CMD55起到一個切換到ACMD類命令的作用)。2. 為什么在使用CMD0以后不使用CMD1?CMD1是MMC卡使用的指令,雖然本文并不想討論MMC卡的問題,但是我還是要說:為了實現兼容性,上電或者 發送CMD0后,應該首先發送CMD55+ACMD41確認是否有回應,如果有回應則為SD卡,如果等回應超時,則可能是MMC卡,再發CMD1確認。3.正確的回應內容應該是: CMD00x01(SD卡處于in-idle-state) CMD550x01(

3、SD卡處于in-idle-state) ACMD410x00(SD卡跳出in-idle-state,完成初始化準備接受下一條指令) 這里要說的是如果最后的回應內容還是0x01的話,可以循環發送CMD55+ACMD41,直到回應的內容0x00。4. 在所有的指令中,唯獨CMD0特殊,在向SD卡發送以前需要向SD卡發送74+個時鐘。那么為什么要74個CLK呢?因為在上電初期,電壓的上升過程據 SD卡組織的計算約合64個CLK周期才能到達SD卡的正常工作電壓他們管這個叫做Supply ramp up time,其后的10個CLK是為了與SD卡同步,之后開始CMD0的操作,嚴格按照此項操作,一定沒有問

4、題。5.關于SD卡的SPI總線,在讀入數據時SD卡的SPI是CLK的上升沿輸入鎖存,輸出數據也是在上升沿。6.向SD卡寫入一個CMD或者ACMD指令的過程是這樣的:首先使CS為低電平,SD卡使能;其次在SD卡的Din寫入指令;寫入指令后還要附加8個填充時鐘,是SD卡完成內部操作;之后在SD卡的Dout上接受回應;回應接受完畢使CS為低電平,再附加8個填充時鐘。7.在SD卡的Din沒有數據寫入時,應使Din保持高電平SD卡命令SD卡命令共分為12類,分別為class0到class11,不同的SDd卡,主控根據其功能,支持不同的命令集 如下Class0 :(卡的識別、初始化等基本命令集)CMD0:

5、復位SD 卡.CMD1:讀OCR寄存器.CMD9:讀CSD寄存器.CMD10:讀CID寄存器.CMD12:停止讀多塊時的數據傳輸CMD13:讀 Card_Status 寄存器Class2 (讀卡命令集):CMD16:設置塊的長度CMD17:讀單塊.CMD18:讀多塊,直至主機發送CMD12為止 .Class4(寫卡命令集) :CMD24:寫單塊.CMD25:寫多塊.CMD27:寫CSD寄存器 .Class5 (擦除卡命令集):CMD32:設置擦除塊的起始地址.CMD33:設置擦除塊的終止地址.CMD38: 擦除所選擇的塊.Class6(寫保護命令集):CMD28:設置寫保護塊的地址.CMD29

6、:擦除寫保護塊的地址.CMD30: Ask the card for the status of the write protection bitsclass7:卡的鎖定,解鎖功能命令集 class8:申請特定命令集 。class10 11 :保留其中class1,class3,class9:SPI模式不支持 SD卡接口的完整規范中小 特性: 容量:32MB/64MB/128MB/256MB/512MB/1GByte 兼容規范版本1.01 卡上錯誤校正 支持CPRM 兩個可選的通信協議:SD模式和SPI模式 可變時鐘頻率025MHz 通信電壓范圍:2.0-3.6V 工作電壓范圍:2.0-3.6

7、V 低電壓消耗:自動斷電及自動睡醒,智能電源管理 無需額外編程電壓 卡片帶電插拔保護 正向兼容MMC卡 高速串行接口帶隨即存取 支持雙通道閃存交叉存取 快寫技術:一個低成本的方案,能夠超高速閃存訪問和高可靠數據存儲 最大讀寫速率:10Mbyte/s 最大10個堆疊的卡(20MHz,Vcc=2.7-3.6V) 數據壽命:10萬次編程/擦除 CE和FCC認證 PIP封裝技術 尺寸:24mm寬×32mm長×1.44mm厚說明: 本SD卡高度集成閃存,具備串行和隨機存取能力。可以通過專用優化速度的串行接口訪問,數據傳輸可靠。接口允許幾個卡垛疊,通過他們的外部連接。接口完全符合最新的

8、消費者標準,叫做SD卡系統標準,由SD卡系統規范定義。 SD卡系統是一個新的大容量存儲系統,基于半導體技術的變革。 它的出現,提供了一個便宜的、結實的卡片式的存儲媒介,為了消費多媒體應用。 SD卡可以設計出便宜的播放器和驅動器而沒有可移動的部分。 一個低耗電和廣供電電壓的可以滿足移動電話、電池應用比如音樂播放器、個人管理器、掌上電腦、電子書、電子百科全書、電子詞典等等。 使用非常有效的數據壓縮比如MPEG,SD卡可以提供足夠的容量來應付多媒體數據。   框圖: SD卡上所有單元由內部時鐘發生器提供時鐘。接口驅動單元同步外部時鐘的DAT和CMD信號到內部所用時鐘。

9、本卡由6線SD卡接口控制,包括:CMD,CLK,DAT0-DAT3。 在多SD卡垛疊中為了標識SD卡,一個卡標識寄存器(CID)和一個相應地址寄存器(RCA)預先準備好。 一個附加的寄存器包括不同類型操作參數。 這個寄存器叫做CSD。 使用SD卡線訪問存儲器還是寄存器的通信由SD卡標準定義。 卡有自己的電源開通檢測單元。 無需附加的主復位信號來在電源開啟后安裝卡。 它防短路,在帶電插入或移出卡時。 無需外部編程電壓。 編程電壓卡內生成。 SD卡支持第二接口工作模式SPI。 如果接到復位命令(CMD0)時,CS信號有效(低電平),SPI模式啟用。  接口 該SD卡的接口可以支

10、持兩種操作模式:。SD卡模式。SPI模式主機系統可以選擇以上其中任一模式,SD卡模式允許4線的高速數據傳輸。 SPI模式允許簡單通用的SPI通道接口, 這種模式相對于SD模式的不足之處是喪失了速度。SD卡模式針腳定義 針腳名稱類型描述1CD DAT3I/O/PP卡監測數據位32CMDPP命令/回復3VssS地4VccS供電電壓5CLKI時鐘6Css2S地7DAT0I/O/PP數據位08DAT1I/O/PP數據位19DAT2I/O/PP數據位21:S:電源供電,I:輸入O:輸出 I/O:雙向 PP:I/O使用推挽驅動SD卡的總線概念SD總線允許強大的1線到4線數據信號設置。當默認的上電

11、后,SD卡使用DAT0。 初始化之后,主機可以改變線寬(譯者按:即改為2根線,3根線。)。混和的SD卡連接方式也適合于主機。在混和連接中Vcc,Vss和CLK的信號連接可以通用。但是,命令,回復,和數據(DAT03)這幾根線,各個SD卡必須從主機分開。這個特性使得硬件和系統上交替使用。SD總線上通信的命令和數據比特流從一個起始位開始,以停止位中止。CLK:每個時鐘周期傳輸一個命令或數據位。頻率可在025MHz之間變化。SD卡的總線管理器可以不受任何限制的自由產生025MHz的頻率。CMD:命令從該CMD線上串行傳輸。一個命令是一次主機到從卡操作的開始。命令可以以單機尋址(尋址命令)或呼叫所有卡

12、(廣播命令)方式發送。 回復從該CMD線上串行傳輸。一個命令是對之前命令的回答。回復可以來自單機或所有卡。DAT03:數據可以從卡傳向主機或副versa。數據通過數據線傳輸。  SD卡總線拓撲  SPI模式針腳定義針腳名稱類型描述1CSI片選(負有效)2DII數據輸入3VssS地4VccS供電電壓5CLKI時鐘6Vss2S地7DOO數據輸出8RSV- 9RSV- 1:S:電源供電,I:輸入O:輸出 I/O:雙向 PP:I/O使用推挽驅動注意:SPI模式時,這些信號需要在主機端用10100K歐的電阻上拉。SPI 總線概念SPI總線允許通過2通道(

13、數據入和出)傳輸比特數據。SPI兼容模式使得MMC主機系統通過很小的改動就可以使用卡。SPI模式使用字節傳輸。所有的數據被融合到一些字節中并aligned to the CS signal(可能是:同過CS信號來校正)。SPI模式的優點就是簡化主機的設計。特別的,MMC主機需要小的改動。SPI模式相對于SD模式的不足之處是喪失了速度性能。   SD卡的電特性SD卡的連接電路圖直流特性完全最大值評估最大值評估指即使在瞬間也不能超出限制電壓。當你在歸定的最大值評估范圍內使用該產品,不會出現永久性損壞。但是這并不能保證正常的邏輯操作。轉SD卡在單片機上的應用(一)經典轉

14、載 2010-01-09 09:18:18 閱讀50 評論0 字號:大中小 SD卡在單片機上的應用(一) 文章來源:振南單片機講壇 SD卡在現在的日常生活與工作中使用非常廣泛,時下已經成為最為通用的數據存儲卡。在諸如MP3、數碼相機等設備上也都采用SD卡作為其存儲設備。SD卡之所以得到如此廣泛的使用,是因為它價格低廉、存儲容量大、使用方便、通用性與安全性強等優點。既然它有著這么多優點,那么如果將它加入到單片機應用開發系統中來,將使系統變得更加出色。這就要求對SD卡的硬件與讀寫時序進行研究。對于SD卡的硬件結構,在官方的文檔上有很詳細的介紹,如SD卡內的存儲器結構、存儲單元組織方式等內

15、容。要實現對它的讀寫,最核心的是它的時序,筆者在經過了實際的測試后,使用51單片機成功實現了對SD卡的扇區讀寫,并對其讀寫速度進行了評估。下面先來講解SD卡的讀寫時序。(1)       SD卡的引腳定義:          SD卡引腳功能詳述:引腳編號SD模式        SPI模式名稱類型描述名稱類型描述1CD/DAT3IO或PP卡檢測數據線3#CSI片選2CMDPP命令

16、回應DII數據輸入3VSS1S電源地VSSS電源地4VDDS電源VDDS電源5CLKI時鐘SCLKI時鐘6VSS2S電源地VSS2S電源地7DAT0IO或PP數據線0DOO或PP數據輸出8DAT1IO或PP數據線1RSV  9DAT2IO或PP數據線2RSV         注:S:電源供給  I:輸入 O:采用推拉驅動的輸出 PP:采用推拉驅動的輸入輸出          SD卡SPI模式下與單

17、片機的連接圖:    SD卡支持兩種總線方式:SD方式與SPI方式。其中SD方式采用6線制,使用CLK、CMD、DAT0DAT3進行數據通信。而SPI方式采用4線制,使用CS、CLK、DataIn、DataOut進行數據通信。SD方式時的數據傳輸速度與SPI方式要快,采用單片機對SD卡進行讀寫時一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。這里只對其SPI方式進行介紹。(2)       SPI方式驅動SD卡的方法     SD卡

18、的SPI通信接口使其可以通過SPI通道進行數據讀寫。從應用的角度來看,采用SPI接口的好處在于,很多單片機內部自帶SPI控制器,不光給開發上帶來方便,同時也見降低了開發成本。然而,它也有不好的地方,如失去了SD卡的性能優勢,要解決這一問題,就要用SD方式,因為它提供更大的總線數據帶寬。SPI接口的選用是在上電初始時向其寫入第一個命令時進行的。以下介紹SD卡的驅動方法,只實現簡單的扇區讀寫。1)  命令與數據傳輸1.       命令傳輸SD卡自身有完備的命令系統,以實現各項操作。命令格式如下:  

19、0;   命令的傳輸過程采用發送應答機制,過程如下:          每一個命令都有自己命令應答格式。在SPI模式中定義了三種應答格式,如下表所示:字節位含義   17開始位,始終為06參數錯誤5地址錯誤4擦除序列錯誤3CRC錯誤2非法命令1擦除復位0閑置狀態 字節位含義   17開始位,始終為06參數錯誤5地址錯誤4擦除序列錯誤3CRC錯誤2非法命令1擦除復位0閑置狀態   27溢出

20、,CSD覆蓋6擦除參數5寫保護非法4卡ECC失敗3卡控制器錯誤2未知錯誤1寫保護擦除跳過,鎖解鎖失敗0鎖卡字節位含義   17開始位,始終為06參數錯誤5地址錯誤4擦除序列錯誤3CRC錯誤2非法命令1擦除復位0閑置狀態25全部操作條件寄存器,高位在前          寫命令的例程:/-  向SD卡中寫入命令,并返回回應的第二個字節/-unsigned char Write_Command_SD(unsigned char *CMD)   uns

21、igned char tmp;   unsigned char retry=0;   unsigned char i;   /禁止SD卡片選   SPI_CS=1;   /發送8個時鐘信號   Write_Byte_SD(0xFF);   /使能SD卡片選   SPI_CS=0;   /向SD卡發送6字節命令   for (i=0;i<0x06;i+)     

22、     Write_Byte_SD(*CMD+);      /獲得16位的回應   Read_Byte_SD(); /read the first byte,ignore it.    do      /讀取后8位      tmp = Read_Byte_SD();      retry+;     

23、while(tmp=0xff)&&(retry<100);    return(tmp);2)  初始化SD卡的初始化是非常重要的,只有進行了正確的初始化,才能進行后面的各項操作。在初始化過程中,SPI的時鐘不能太快,否則會造初始化失敗。在初始化成功后,應盡量提高SPI的速率。在剛開始要先發送至少74個時鐘信號,這是必須的。在很多讀者的實驗中,很多是因為疏忽了這一點,而使初始化不成功。隨后就是寫入兩個命令CMD0與CMD1,使SD卡進入SPI模式        &

24、#160;  初始化時序圖:            初始化例程:/-    初始化SD卡到SPI模式/-unsigned char SD_Init()     unsigned char retry,temp;   unsigned char i;   unsigned char CMD = 0x40,0x00,0x00,0x00,0x00,0x95;   SD_Po

25、rt_Init(); /初始化驅動端口   Init_Flag=1; /將初始化標志置1   for (i=0;i<0x0f;i+)          Write_Byte_SD(0xff); /發送至少74個時鐘信號      /向SD卡發送CMD0   retry=0;   do   /為了能夠成功寫入CMD0,在這里寫200次    

26、temp=Write_Command_SD(CMD);     retry+;     if(retry=200)      /超過200次       return(INIT_CMD0_ERROR);/CMD0 Error!           while(temp!=1);  /回應01h,停止寫入  

27、   /發送CMD1到SD卡   CMD0 = 0x41; /CMD1   CMD5 = 0xFF;   retry=0;   do   /為了能成功寫入CMD1,寫100次     temp=Write_Command_SD(CMD);     retry+;     if(retry=100)      /超過10

28、0次       return(INIT_CMD1_ERROR);/CMD1 Error!           while(temp!=0);/回應00h停止寫入      Init_Flag=0; /初始化完畢,初始化標志清零      SPI_CS=1;  /片選無效   return(0); /初始化成功3)  讀取CIDCID寄存

29、器存儲了SD卡的標識碼。每一個卡都有唯一的標識碼。CID寄存器長度為128位。它的寄存器結構如下:名稱域數據寬度CID劃分生產標識號MID8127:120OEM/應用標識OID16119:104產品名稱PNM40103:64產品版本PRV863:56產品序列號PSN3255:24保留423:20生產日期MDT1219:8CRC7校驗合CRC77:1未使用,始終為110:0它的讀取時序如下:        與此時序相對應的程序如下:/-    讀取SD卡的CID寄存器   16

30、字節   成功返回0/-unsigned char Read_CID_SD(unsigned char *Buffer)   /讀取CID寄存器的命令   unsigned char CMD = 0x4A,0x00,0x00,0x00,0x00,0xFF;    unsigned char temp;   temp=SD_Read_Block(CMD,Buffer,16); /read 16 bytes   return(temp);   

31、60;   4)讀取CSD              CSD(Card-Specific Data)寄存器提供了讀寫SD卡的一些信息。其中的一些單元可以由用戶重新編程。具體的CSD結構如下:名稱域數據寬度單元類型CSD劃分CSD結構CSD_STRUCTURE2R127:126保留-6R125:120數據讀取時間1TAAC8R119:112數據在CLK周期內讀取時間2(NSAC*100)NSAC8R111:104最大數據傳輸率TRAN_SPEED8

32、R103:96卡命令集合CCC12R95:84最大讀取數據塊長READ_BL_LEN4R83:80允許讀的部分塊READ_BL_PARTIAL1R79:79非線寫塊WRITE_BLK_MISALIGN1R78:78非線讀塊READ_BLK_MISALIGN1R77:77DSR條件DSR_IMP1R76:76保留-2R75:74設備容量C_SIZE12R73:62最大讀取電流VDD minVDD_R_CURR_MIN3R61:59最大讀取電流VDD maxVDD_R_CURR_MAX3R58:56最大寫電流VDD minVDD_W_CURR_MIN3R55:53最大寫電流VDD maxVDD_W

33、_CURR_MAX3R52:50設備容量乘子C_SIZE_MULT3R49:47擦除單塊使能ERASE_BLK_EN1R46:46擦除扇區大小SECTOR_SIZE7R45:39寫保護群大小WP_GRP_SIZE7R38:32寫保護群使能WP_GRP_ENABLE1R31:31保留-2R30:29寫速度因子R2W_FACTOR3R28:26最大寫數據塊長度WRITE_BL_LEN4R25:22允許寫的部分部WRITE_BL_PARTIAL1R21:21保留-5R20:16文件系統群FILE_OFRMAT_GRP1R/W15:15拷貝標志COPY1R/W14:14永久寫保護PERM_WRITE_

34、PROTECT1R/W13:13暫時寫保護TMP_WRITE_PROTECT1R/W12:12文件系統FIL_FORMAT2R/W11:10保留-2R/W9:8CRCCRC7R/W7:1未用,始終為1-1 0:0           讀取CSD 的時序:相應的程序例程如下: /-    讀SD卡的CSD寄存器   共16字節    返回0說明讀取成功/-unsigned char Read_CSD_SD(u

35、nsigned char *Buffer)      /讀取CSD寄存器的命令   unsigned char CMD = 0x49,0x00,0x00,0x00,0x00,0xFF;   unsigned char temp;   temp=SD_Read_Block(CMD,Buffer,16); /read 16 bytes   return(temp);4)  讀取SD卡信息綜合上面對CID與CSD寄存器的讀取,可以知道很多關于SD卡的信息,以下程序可以獲取

36、這些信息。如下:/-/返回/       SD卡的容量,單位為M/       sector count and multiplier MB are in u08 = C_SIZE / (2(9-C_SIZE_MULT)/       SD卡的名稱/-void SD_get_volume_info()       unsigned char i;    unsigne

37、d char c_temp5;    VOLUME_INFO_TYPE SD_volume_Info,*vinf;    vinf=&SD_volume_Info; /Init the pointoer;/讀取CSD寄存器    Read_CSD_SD(sectorBuffer.dat);/獲取總扇區數   vinf->sector_count = sectorBuffer.dat6 & 0x03;   vinf->sector_coun

38、t <<= 8;   vinf->sector_count += sectorBuffer.dat7;   vinf->sector_count <<= 2;   vinf->sector_count += (sectorBuffer.dat8 & 0xc0) >> 6;   / 獲取multiplier   vinf->sector_multiply = sectorBuffer.dat9 & 0x03; &

39、#160; vinf->sector_multiply <<= 1;   vinf->sector_multiply += (sectorBuffer.dat10 & 0x80) >> 7;/獲取SD卡的容量   vinf->size_MB = vinf->sector_count >> (9-vinf->sector_multiply);   / get the name of the card   Read_CID_SD(sectorBu

40、ffer.dat);   vinf->name0 = sectorBuffer.dat3;   vinf->name1 = sectorBuffer.dat4;   vinf->name2 = sectorBuffer.dat5;   vinf->name3 = sectorBuffer.dat6;   vinf->name4 = sectorBuffer.dat7;   vinf->name5 = 0x00; /end flag 

41、;               以上程序將信息裝載到一個結構體中,這個結構體的定義如下:typedef struct SD_VOLUME_INFO /SD/SD Card info  unsigned int  size_MB;  unsigned char sector_multiply;  unsigned int  sector_count;  unsigned char name6; VOLUME_

42、INFO_TYPE;5)  扇區讀扇區讀是對SD卡驅動的目的之一。SD卡的每一個扇區中有512個字節,一次扇區讀操作將把某一個扇區內的512個字節全部讀出。過程很簡單,先寫入命令,在得到相應的回應后,開始數據讀取。扇區讀的時序:             扇區讀的程序例程:unsigned char SD_Read_Sector(unsigned long sector,unsigned char *buffer)     unsigne

43、d char retry;   /命令16   unsigned char CMD = 0x51,0x00,0x00,0x00,0x00,0xFF;    unsigned char temp;      /地址變換   由邏輯塊地址轉為字節地址   sector = sector << 9; /sector = sector * 512    CMD1 = (sector & 0xFF000000) &g

44、t;>24 );   CMD2 = (sector & 0x00FF0000) >>16 );   CMD3 = (sector & 0x0000FF00) >>8 );    /將命令16寫入SD卡   retry=0;   do     /為了保證寫入命令  一共寫100次      temp=Write_Command_MMC(CMD);

45、0;     retry+;      if(retry=100)               return(READ_BLOCK_ERROR); /block write Error!            while(temp!=0);      

46、0;                    /Read Start Byte form MMC/SD-Card (FEh/Start Byte)   /Now data is ready,you can read it out.   while (Read_Byte_MMC() != 0xfe);   readPos=0;  SD_get_data

47、(512,buffer) ;  /512字節被讀出到buffer中 return 0;其中SD_get_data函數如下:/-    獲取數據到buffer中/-void SD_get_data(unsigned int Bytes,unsigned char *buffer)    unsigned int j;   for (j=0;j<Bytes;j+)      *buffer+ = Read_Byte_SD();6)  扇區寫扇區

48、寫是SD卡驅動的另一目的。每次扇區寫操作將向SD卡的某個扇區中寫入512個字節。過程與扇區讀相似,只是數據的方向相反與寫入命令不同而已。扇區寫的時序:扇區寫的程序例程:/-    寫512個字節到SD卡的某一個扇區中去   返回0說明寫入成功/-unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)     unsigned char tmp,retry;   unsigned int i; 

49、60; /, 命令24   unsigned char CMD = 0x58,0x00,0x00,0x00,0x00,0xFF;    addr = addr << 9; /addr = addr * 512       CMD1 = (addr & 0xFF000000) >>24 );   CMD2 = (addr & 0x00FF0000) >>16 );   CMD3 = (addr & 0x000

50、0FF00) >>8 );    /寫命令24到SD卡中去   retry=0;   do     /為了可靠寫入,寫100次      tmp=Write_Command_SD(CMD);      retry+;      if(retry=100)        

51、0;      return(tmp); /send commamd Error!            while(tmp!=0);        /在寫之前先產生100個時鐘信號   for (i=0;i<100;i+)         Read_Byte_SD();    &#

52、160;     /寫入開始字節   Write_Byte_MMC(0xFE);           /現在可以寫入512個字節   for (i=0;i<512;i+)         Write_Byte_MMC(*Buffer+);        /CRC-Byte    Write_Byte_M

53、MC(0xFF); /Dummy CRC   Write_Byte_MMC(0xFF); /CRC Code          tmp=Read_Byte_MMC();   / read response   if(tmp & 0x1F)!=0x05) / 寫入的512個字節是未被接受        SPI_CS=1;     return(WRITE_BLO

54、CK_ERROR); /Error!      /等到SD卡不忙為止/因為數據被接受后,SD卡在向儲存陣列中編程數據   while (Read_Byte_MMC()!=0xff);       /禁止SD卡   SPI_CS=1;   return(0);/寫入成功    此上內容在筆者的實驗中都已調試通過。單片機采用STC89LE單片機(SD卡的初始化電壓為2.0V3.6V,操作電壓為3.1V3.5V,因此不能用

55、5V單片機,或進行分壓處理),工作于22.1184M的時鐘下,由于所采用的單片機中沒硬件SPI,采用軟件模擬SPI,因此讀寫速率都較慢。如果要半SD卡應用于音頻、視頻等要求高速場合,則需要選用有硬件SPI的控制器,或使用SD模式,當然這就需要各位讀者對SD模式加以研究,有了SPI模式的基礎,SD模式應該不是什么難事。前言長期以來,以Flash Memory為存儲體的SD卡因具備體積小、功耗低、可擦寫以及非易失性等特點而被廣泛應用于消費類電子產品中。特別是近年來,隨著價格不斷下降且存儲容量不斷提高,它的應用范圍日益增廣。當數據采集系統需要長時間地采集、記錄海量數據時,選擇SD卡作為存儲媒質是開發

56、者們一個很好的選擇。在電能監測以及無功補償系統中,要連續記錄大量的電壓、電流、有功功率、無功功率以及時間等參數,當單片機采集到這些數據時可以利用SD作為存儲媒質。本文主要介紹了SD卡在電能監測及無功補償數據采集系統中的應用方案。設計方案應用AT89C52讀寫SD卡有兩點需要注意。首先,需要尋找一個實現AT89C52單片機與SD卡通訊的解決方案;其次,SD卡所能接受的邏輯電平與AT89C52提供的邏輯電平不匹配,需要解決電平匹配問題。通訊模式SD卡有兩個可選的通訊協議:SD模式和SPI模式。SD模式是SD卡標準的讀寫方式,但是在選用SD模式時,往往需要選擇帶有SD卡控制器接口的MCU,或者必須加

57、入額外的SD卡控制單元以支持SD卡的讀寫。然而,AT89C52單片機沒有集成SD卡控制器接口,若選用SD模式通訊就無形中增加了產品的硬件成本。在SD卡數據讀寫時間要求不是很嚴格的情況下,選用SPI模式可以說是一種最佳的解決方案。因為在SPI模式下,通過四條線就可以完成所有的數據交換,并且目前市場上很多MCU都集成有現成的SPI接口電路,采用SPI模式對SD卡進行讀寫操作可大大簡化硬件電路的設計。雖然AT89C52不帶SD卡硬件控制器,也沒有現成的SPI接口模塊,但是可以用軟件模擬出SPI總線時序。本文用SPI總線模式讀寫SD卡。電平匹配SD卡的邏輯電平相當于3.3V TTL電平標準,而控制芯片

58、AT89C52的邏輯電平為5V CMOS電平標準。因此,它們之間不能直接相連,否則會有燒毀SD卡的可能。出于對安全工作的考慮,有必要解決電平匹配問題。要解決這一問題,最根本的就是解決邏輯器件接口的電平兼容問題,原則主要有兩條:一為輸出電平器件輸出高電平的最小電壓值,應該大于接收電平器件識別為高電平的最低電壓值;另一條為輸出電平器件輸出低電平的最大電壓值,應該小于接收電平器件識別為低電平的最高電壓值。一般來說,通用的電平轉換方案是采用類似SN74ALVC4245的專用電平轉換芯片,這類芯片不僅可以用作升壓和降壓,而且允許兩邊電源不同步。但是,這個方案代價相對昂貴,而且一般的專用電平轉換芯片都是同

59、時轉換8路、16路或者更多路數的電平,相對本系統僅僅需要轉換3路來說是一種資源的浪費。考慮到SD卡在SPI協議的工作模式下,通訊都是單向的,于是在單片機向SD卡傳輸數據時采用晶體管加上拉電阻法的方案,基本電路如圖1所示。而在SD卡向單片機傳輸數據時可以直接連接,因為它們之間的電平剛好滿足上述的電平兼容原則,既經濟又實用。 這個方案需要雙電源供電(一個5V電源、一個3.3V電源供電),3.3V電源可以用AMS1117穩壓管從5V電源穩壓獲取。硬件接口設計SD卡提供9Pin的引腳接口便于外圍電路對其進行操作,9Pin的引腳隨工作模式的不同有所差異。在SPI模式下,引腳1(DAT3)作為S

60、PI片選線CS用,引腳2(CMD)用作SPI總線的數據輸出線MOSI,而引腳7(DAT0)為數據輸入線MISO,引腳5用作時鐘線(CLK)。除電源和地,保留引腳可懸空。本文中控制SD卡的MCU是ATMEL公司生產的低電壓、高性能CMOS 8位單片機AT89C52,內含8K字節的可反復擦寫的只讀程序存儲器和256字節的隨機存儲數據存儲器。由于AT89C52只有256字節的數據存儲器,而SD卡的數據寫入是以塊為單位,每塊為512字節,所以需要在單片機最小系統上增加一片RAM。本系統中RAM選用存儲器芯片HM62256,容量為32K。對RAM進行讀寫時,鎖存器把低8位地址鎖存,與P2口的8位地址數據

61、構成16位地址空間,從而可使SD卡一次讀寫512字節的塊操作。系統硬件圖如圖2所示。 軟件設計SPI工作模式SD卡在上電初期自動進入SD總線模式,在此模式下向SD卡發送復位命令CMD0。如果SD卡在接收復位命令過程中CS低電平有效,則進入SPI模式,否則工作在SD總線模式。對于不帶SPI串行總線接口的AT89C52單片機來說,用軟件來模擬SPI總線操作的具體做法是:將P1.5口(模擬CLK線)的初始狀態設置為1,而在允許接收后再置P1.5為0。這樣,MCU在輸出1位SCK時鐘的同時,將使接口芯片串行左移,從而輸出1位數據至AT89C52單片機的P1.7(模擬MISO線),此后再置P1.5為1,使單片機從P1.6(模擬MOSI線)輸出1位數據(先為高位)至串行接口芯片。至此,模擬1位數據輸入輸出便完成。此后再置P1.5為0,模擬下1位數據的輸入輸出,依此循環8次,即可完成1次通過SPI總線傳輸8位數據

溫馨提示

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

評論

0/150

提交評論