




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、前言 長期以來,以Flash Memory為存儲體的SD卡因具備體積小、功耗低、可擦寫以及非易失性等特點而被廣泛應(yīng)用于消費類電子產(chǎn)品中。特別是近年來,隨著價格不斷下降且存儲容量不斷提高,它的應(yīng)用范圍日益增廣。當數(shù)據(jù)采集系統(tǒng)需要長時間地采集、記錄海量數(shù)據(jù)時,選擇SD卡作為存儲媒質(zhì)是開發(fā)者們一個很好的選擇。在電能監(jiān)測以及無功補償系統(tǒng)中,要連續(xù)記錄大量的電壓、電流、有功功率、無功功率以及時間等參數(shù),當單片機采集到這些數(shù)據(jù)時可以利用SD作為存儲媒質(zhì)。本文主要介紹了SD卡在電能監(jiān)測及無功補償數(shù)據(jù)采集系統(tǒng)中的應(yīng)用方案。設(shè)計方案應(yīng)用AT89C52讀寫SD卡有兩點需要注意。首先,需要尋找一個實現(xiàn)AT89C52
2、單片機與SD卡通訊的解決方案;其次,SD卡所能接受的邏輯電平與AT89C52提供的邏輯電平不匹配,需要解決電平匹配問題。通訊模式SD卡有兩個可選的通訊協(xié)議:SD模式和SPI模式。SD模式是SD卡標準的讀寫方式,但是在選用SD模式時,往往需要選擇帶有SD卡控制器接口的MCU,或者必須加入額外的SD卡控制單元以支持SD卡的讀寫。然而,AT89C52單片機沒有集成SD卡控制器接口,若選用SD模式通訊就無形中增加了產(chǎn)品的硬件成本。在SD卡數(shù)據(jù)讀寫時間要求不是很嚴格的情況下,選用SPI模式可以說是一種最佳的解決方案。因為在SPI模式下,通過四條線就可以完成所有的數(shù)據(jù)交換,并且目前市場上很多MCU都集成有
3、現(xiàn)成的SPI接口電路,采用SPI模式對SD卡進行讀寫操作可大大簡化硬件電路的設(shè)計。雖然AT89C52不帶SD卡硬件控制器,也沒有現(xiàn)成的SPI接口模塊,但是可以用軟件模擬出SPI總線時序。本文用SPI總線模式讀寫SD卡。電平匹配SD卡的邏輯電平相當于3.3V TTL電平標準,而控制芯片AT89C52的邏輯電平為5V CMOS電平標準。因此,它們之間不能直接相連,否則會有燒毀SD卡的可能。出于對安全工作的考慮,有必要解決電平匹配問題。要解決這一問題,最根本的就是解決邏輯器件接口的電平兼容問題,原則主要有兩條:一為輸出電平器件輸出高電平的最小電壓值,應(yīng)該大于接收電平器件識別為高電平的最低電壓值;另一
4、條為輸出電平器件輸出低電平的最大電壓值,應(yīng)該小于接收電平器件識別為低電平的最高電壓值。一般來說,通用的電平轉(zhuǎn)換方案是采用類似SN74ALVC4245的專用電平轉(zhuǎn)換芯片,這類芯片不僅可以用作升壓和降壓,而且允許兩邊電源不同步。但是,這個方案代價相對昂貴,而且一般的專用電平轉(zhuǎn)換芯片都是同時轉(zhuǎn)換8路、16路或者更多路數(shù)的電平,相對本系統(tǒng)僅僅需要轉(zhuǎn)換3路來說是一種資源的浪費。考慮到SD卡在SPI協(xié)議的工作模式下,通訊都是單向的,于是在單片機向SD卡傳輸數(shù)據(jù)時采用晶體管加上拉電阻法的方案,基本電路如圖1所示。而在SD卡向單片機傳輸數(shù)據(jù)時可以直接連接,因為它們之間的電平剛好滿足上述的電平兼容原則,既經(jīng)濟又
5、實用。這個方案需要雙電源供電(一個5V電源、一個3.3V電源供電),3.3V電源可以用AMS1117穩(wěn)壓管從5V電源穩(wěn)壓獲取。硬件接口設(shè)計SD卡提供9Pin的引腳接口便于外圍電路對其進行操作,9Pin的引腳隨工作模式的不同有所差異。在SPI模式下,引腳1(DAT3)作為SPI片選線CS用,引腳2(CMD)用作SPI總線的數(shù)據(jù)輸出線MOSI,而引腳7(DAT0)為數(shù)據(jù)輸入線MISO,引腳5用作時鐘線(CLK)。除電源和地,保留引腳可懸空。本文中控制SD卡的MCU是ATMEL公司生產(chǎn)的低電壓、高性能CMOS 8位單片機AT89C52,內(nèi)含8K字節(jié)的可反復(fù)擦寫的只讀程序存儲器和256字節(jié)的隨機存儲數(shù)
6、據(jù)存儲器。由于AT89C52只有256字節(jié)的數(shù)據(jù)存儲器,而SD卡的數(shù)據(jù)寫入是以塊為單位,每塊為512字節(jié),所以需要在單片機最小系統(tǒng)上增加一片RAM。本系統(tǒng)中RAM選用存儲器芯片HM62256,容量為32K。對RAM進行讀寫時,鎖存器把低8位地址鎖存,與P2口的8位地址數(shù)據(jù)構(gòu)成16位地址空間,從而可使SD卡一次讀寫512字節(jié)的塊操作。系統(tǒng)硬件圖如圖2所示。軟件設(shè)計SPI工作模式SD卡在上電初期自動進入SD總線模式,在此模式下向SD卡發(fā)送復(fù)位命令CMD0。如果SD卡在接收復(fù)位命令過程中CS低電平有效,則進入SPI模式,否則工作在SD總線模式。對于不帶SPI串行總線接口的AT89C52單片機來說,用
7、軟件來模擬SPI總線操作的具體做法是:將P1.5口(模擬CLK線)的初始狀態(tài)設(shè)置為1,而在允許接收后再置P1.5為0。這樣,MCU在輸出1位SCK時鐘的同時,將使接口芯片串行左移,從而輸出1位數(shù)據(jù)至AT89C52單片機的P1.7(模擬MISO線),此后再置P1.5為1,使單片機從P1.6(模擬MOSI線)輸出1位數(shù)據(jù)(先為高位)至串行接口芯片。至此,模擬1位數(shù)據(jù)輸入輸出便完成。此后再置P1.5為0,模擬下1位數(shù)據(jù)的輸入輸出,依此循環(huán)8次,即可完成1次通過SPI總線傳輸8位數(shù)據(jù)的操作。 本文的實現(xiàn)程序把SPI總線讀寫功能集成在一起,傳遞的val變量既是向SPI寫的數(shù)據(jù),也是從SPI讀取的數(shù)據(jù)。具
8、體程序如下:(程序是在Keil uVision2的編譯環(huán)境下編寫)sbit CS=P35; sbit CLK= P15;sbit DataI=P17; sbit DataO=P16;#define SD_Disable( CS=1 /片選關(guān) #define SD_Enable( CS=0 /片選開 unsigned char SPI_TransferByte(unsigned char val unsigned char BitCounter;for(BitCounter=8; BiCounter!=0; BitCounter- CLK=0;DataI=0; / writeif(val&
9、;0x80 DataI=1;val<<=1; CLK=1;if(DataOval|=1; / read CLK=0; return val;SD卡的初始化對SD卡進行操作首先要對SD卡進行初始化,初始化的過程中設(shè)置SD卡工作在SPI模式,其流程圖如圖3所示。在復(fù)位成功之后可以通過CMD55和ACMD41判斷當前電壓是否在工作范圍內(nèi)。主機還可以繼續(xù)通過CMD10讀取SD卡的CID寄存器,通過CMD16設(shè)置數(shù)據(jù)Block長度,通過CMD9讀取卡的CSD寄存器。從CSD寄存器中,主機可獲知卡容量,支持的命令集等重要參數(shù)。SD卡初始化的C語言程序如下:unsigned char SD_In
10、it(void unsigned char retry,temp;unsigned char i;for (i=0;i<0x0f;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_TransferB
11、yte(0xff;retry=0;do temp=Write_Command_SD(SD_INIT,0; /發(fā)送初始化命令retry+;if(retry=100 /重試100次SD_Disable(; /關(guān)片選return(INIT_CMD1_ERROR; /如果重試100次失敗返回錯誤號while(temp!=0;SD_Disable(; /關(guān)片選return(TRUE; /返回成功數(shù)據(jù)塊的讀寫完成SD卡的初始化之后即可進行它的讀寫操作。SD卡的讀寫操作都是通過發(fā)送SD卡命令完成的。SPI總線模式支持單塊(CMD24)和多塊(CMD25)寫操作,多塊操作是指從指定位置開始寫下去,直到SD卡收
12、到一個停止命令CMD12才停止。單塊寫操作的數(shù)據(jù)塊長度只能是512字節(jié)。單塊寫入時,命令為CMD24,當應(yīng)答為0時說明可以寫入數(shù)據(jù),大小為512字節(jié)。SD卡對每個發(fā)送給自己的數(shù)據(jù)塊都通過一個應(yīng)答命令確認,它為1個字節(jié)長,當?shù)?位為00101時,表明數(shù)據(jù)塊被正確寫入SD卡。在需要讀取SD卡中數(shù)據(jù)的時候,讀SD卡的命令字為CMD17,接收正確的第一個響應(yīng)命令字節(jié)為0xFE,隨后是512個字節(jié)的用戶數(shù)據(jù)塊,最后為2個字節(jié)的CRC驗證碼。可見,讀寫SD卡的操作都是在初始化后基于SD卡命令和響應(yīng)完成操作的,寫、讀SD卡的程序流程圖如圖4和圖5所示。結(jié)束語實驗結(jié)果表明單片機使用12MHz的晶體振蕩器時,讀
13、寫速度和功耗都基本令人滿意,可以應(yīng)用于對讀寫速度要求不高的情況下。本文詳細闡述了用AT89C52單片機對SD卡進行操作的過程,提出了一種不帶SD卡控制器,MCU讀寫SD卡的方法,實現(xiàn)了SD卡在電能監(jiān)測及無功補償數(shù)據(jù)采集系統(tǒng)中的用途。了解了指令的形式和具體的控制內(nèi)容,下面主要解決的就是MCU與SD卡的通信問題,通信主要需要注意下面的問題:(1)供電電壓:必須是3.3V (2 通信模式的切換:SD卡有兩種通信模式:SPI模式和SD模式,默認情況下的通信模式是SD模式,但是我們常用的模式是SPI模式,這就需要一個切換模式的方法,具體的實現(xiàn)方法在其他地方也都有介紹,其關(guān)鍵的地方
14、就是先上電延時大于74個時鐘周期后發(fā)送復(fù)位命令,復(fù)位成功(接收到0x01的響應(yīng)后,連續(xù)發(fā)送CMD55和ACMD41,直到響應(yīng)0X00為止,此時SD卡已經(jīng)進入SPI模式。(3)上面所說的發(fā)送復(fù)位命令(CMD0)以及CMD55和ACMD41要有具體的實現(xiàn)方法,需要解決的就是時序問題,下圖就為復(fù)位的時序圖,只要能夠按照下圖的時序進行操作,肯定能夠復(fù)位成功.本復(fù)位分為(1)上電,(2)延時74個周期以上,(3)發(fā)送命令CMD0,(4發(fā)送命令參數(shù)0X0000,(5發(fā)送CRC校驗0X95,(6等待響應(yīng)(7響應(yīng)0X01此時得到正確響應(yīng)復(fù)位成功,否則重復(fù)以上操作直到成功為止。介紹復(fù)位的同時其他的命令也和復(fù)位命
15、令類似,只是根據(jù)命令的作用不同有著不同的響應(yīng)類型和不同的后續(xù)操作,下面給出集中常用命令的時序圖。(1)讀CID寄存器時序圖說明:當發(fā)送命令并得到響應(yīng)0X00后就開始準備接收CID寄存器中的內(nèi)容,此時只要接收到起始標志0XFE后,之后的16個字節(jié)的內(nèi)容即為CID寄存器的內(nèi)容。(2)讀CSD寄存器內(nèi)容時序和讀CID的類似,只是此時發(fā)送的命令為CMD9SD卡數(shù)據(jù)的讀寫是以塊為單位:默認情況下一塊的大小為512字節(jié)(3 讀SD卡一個塊(512字節(jié)時序(4 寫一個塊(512字節(jié)時序圖1.SD卡的命令格式:SD卡的指令由6字節(jié)(Byte組成,如下:Byte1:0 1 x x x x x x(命令號,由指令
16、標志定義,如CMD39為100111即16進制0x27,那么完整的CMD39第一字節(jié)為01100111,即0x27+0x40Byte2-5:Command Arguments,命令參數(shù),有些命令沒有參數(shù)Byte6:前7位為CRC(Cyclic Redundacy Check,循環(huán)冗余校驗校驗位,最后一位為停止位02.SD卡的命令SD卡命令共分為12類,分別為class0到class11,不同的SDd卡,主控根據(jù)其功能,支持不同的命令集 如下:Class0 :(卡的識別、初始化等基本命令集CMD0:復(fù)位SD 卡.CMD1:讀OCR寄存器.CMD9:讀CSD寄存器.CMD10:讀CID寄存器.CM
17、D12:停止讀多塊時的數(shù)據(jù)傳輸CMD13:讀 Card_Status 寄存器Class2 (讀卡命令集:CMD16:設(shè)置塊的長度CMD17:讀單塊.CMD18:讀多塊,直至主機發(fā)送CMD12為止 .Class4(寫卡命令集 :CMD24:寫單塊.CMD25:寫多塊.CMD27:寫CSD寄存器 .Class5 (擦除卡命令集:CMD32:設(shè)置擦除塊的起始地址.CMD33:設(shè)置擦除塊的終止地址.CMD38: 擦除所選擇的塊.Class6(寫保護命令集:CMD28:設(shè)置寫保護塊的地址.CMD29:擦除寫保護塊的地址.CMD30: Ask the card for the status of the
18、write protection bitsclass7:卡的鎖定,解鎖功能命令集class8:申請?zhí)囟罴?。class10 11 :保留其中class1, class3,class9:SPI模式不支持 本程序參考自bozai的SD卡驅(qū)動程序, 增加了SD、MMC卡判斷的功能,SD、MMC初始化成功后能返回卡的類型參數(shù)供主程序使用。 /-SD_MMC.H- #ifndef _SD_MMC_H_ #define _SD_MMC_H_ / 數(shù)據(jù)宏定義 #define uint8 unsigned char #define int8 signed char #define uint16 unsig
19、ned int #define int16 signed int #define uint32 unsigned long #define int32 signed long / C8051F015與SD_MMC 的接口定義 sbit SDCS = P30; sbit SDDET = P31; sbit SDWP = P32; void SPI_SendWreit(uchar temp; / VS1003B DATA發(fā)送 uint8 SPI_SendByte(uint8 val; / SPI傳送一個字節(jié) uint8 MMC_SD_SendCmd(uint8 Cmd, uint32 arg; /
20、發(fā)送卡命令 uint8 MMC_SD_ReadSingleBlock(uint32 sector, uint8 *buffer; /讀一個扇區(qū) uint8 MMC_SD_WriteSingleBlock(uint32 sector, uint8 *buffer; /寫一個扇區(qū) uint8 MMC_SD_init(; /mmc_sd卡初始化 #endif /-SD_MMC.C- /- / SD_MMC 底層驅(qū)動函數(shù)庫 / 編譯環(huán)境:Keil C V2.40 / 編寫日期:2008-04-07 / 最后更新:2008-05-04 /- #include "main.h" #in
21、clude "sd_mmc.h" /- / 函數(shù)名:SPI_SendByte / 功 能:SPI 數(shù)據(jù)發(fā)送 / 參 數(shù):uchar / 返回值: /- void SPI_SendWreit(uchar temp SPI0DAT=temp; while(TXBSY; / 查詢發(fā)送標志位 /- / 函數(shù)名:SPI_SendByte / 功 能:SPI傳送一個字節(jié) / 參 數(shù):uchar / 返回值:uchar /- uint8 SPI_SendByte(uint8 val / uint8= uchar SPI0DAT = val; while(TXBSY; return SPI
22、0DAT; /- / 函數(shù)名:MMC_SD_SendCmd / 功 能:發(fā)送卡命令 / 參 數(shù):uint8,uint32 / 返回值:uint8 /- uint8 MMC_SD_SendCmd(uint8 Cmd, uint32 arg uint8 r1; uint8 retry=0; SPI_SendWreit(0xFF; /發(fā)命令前先發(fā)送8個時鐘 SPI_SendWreit(Cmd | 0x40; /分別寫入命令 SPI_SendWreit(arg>>24; SPI_SendWreit(arg>>16; SPI_SendWreit(arg>>8; SPI
23、_SendWreit(arg; SPI_SendWreit(0x95; /僅本次有效的 CRC值 while(r1 = SPI_SendByte(0xFF = 0xFF /等待響應(yīng) if(retry+ > 8 break; /超時退出 return r1; /返回狀態(tài)值 /- / 函數(shù)名:MMC_SD_ReadSingleBlock / 功 能:讀一個扇區(qū) / 參 數(shù):扇區(qū),數(shù)據(jù)緩沖區(qū) / 返回值: /- uint8 MMC_SD_ReadSingleBlock(uint32 sector,uint8 *buffer uint8 r1; uint16 i; SDCS=0; / 使能Car
24、d r1 = MMC_SD_SendCmd(17, sector<<9; / 發(fā)讀扇區(qū)命令 if(r1 != 0x00 return r1; while(SPI_SendByte(0xFF != 0xFE; /-等待數(shù)據(jù)的起始令牌號- for(i=0; i<512; i+ /讀512個數(shù)據(jù) *buffer+ = SPI_SendByte(0xFF; SPI_SendWreit(0xFF; / 發(fā)送偽CRC SPI_SendWreit(0xFF; SDCS=1; / 關(guān)閉Card return 0; /- / 函數(shù)名:MMC_SD_WriteSingleBlock / 功 能:
25、寫一個扇區(qū) / 參 數(shù):扇區(qū),數(shù)據(jù)緩沖區(qū) / 返回值: /- uint8 MMC_SD_WriteSingleBlock(uint32 sector, uint8 *buffer uint8 r1; uint16 i; SDCS=0; / 使能Card r1 = MMC_SD_SendCmd(24, sector<<9; /寫命令 if(r1 != 0x00 return r1; SPI_SendWreit(0xFF; SPI_SendWreit(0xFF; SPI_SendWreit(0xFF; SPI_SendWreit(0xFE; /發(fā)送數(shù)據(jù)起始令牌號 for(i=0; i&
26、lt;512; i+ /以扇區(qū)為單位寫入數(shù)據(jù) SPI_SendWreit(*buffer+; SPI_SendWreit(0xFF; / 發(fā)送偽CRC SPI_SendWreit(0xFF; r1 = SPI_SendByte(0xFF; / 讀數(shù)據(jù)應(yīng)答令牌號 if( (r1&0x1F != 0x05 /等待是否成功 SDCS=1; return r1; while(!SPI_SendByte(0xFF; /-等待操作完成- SDCS=1; / 關(guān)閉Card return 0; /- / 函數(shù)名:MMC_SD_Init / 功 能:sd卡初始化 / 參 數(shù):無 / 返回值:uint8 type / 卡類型返回值: 0x10 SD, 0x20 MMC /- uint8 MMC_SD_init( uint8 i; uint8 retry; uint8 r1=0; uint8 type=0; / 卡類型返回值:0xA0 SD 0xB0 MMC SDCS = 0; / 使能Card SPI_speed=0x13; /低速 SPI=300k Fsystem=12Mhz retry = 0; do for(i=0;i<10;i+ SPI_SendByte(0xFF; /發(fā)送80個時鐘,使卡同步 r1 = MMC_SD_Se
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度研學(xué)旅行教育咨詢與服務(wù)合作協(xié)議
- 2025年度私人珠寶抵押典當貸款協(xié)議
- 2025年度新能源材料研究院校企合作協(xié)議書
- 二零二五年度商鋪租賃合同終止及商業(yè)設(shè)施維護協(xié)議
- 2025年度電力系統(tǒng)調(diào)試電力工程勞務(wù)承建合同
- 2025年度火鍋加盟店加盟費及利潤分配合同
- 二零二五年度變壓器運輸保險與安全協(xié)議
- 二零二五年度租賃房屋提前解除合同
- 二零二五年度科研機構(gòu)員工勞務(wù)派遣合作協(xié)議
- 2025年度生物制品簡易供貨合同
- 《鈉離子電池產(chǎn)業(yè)發(fā)展白皮書》
- 2025中考作文預(yù)測
- 油氣田開發(fā)專業(yè)危害因素辨識與風(fēng)險防控
- 假肢安裝合同范本
- DB37-T4824-2025 鄉(xiāng)鎮(zhèn)(街道)應(yīng)急物資配備指南
- 教育部人文社科 申請書
- 無菌手術(shù)臺鋪置的細節(jié)管理
- 《重大基礎(chǔ)設(shè)施項目涉及風(fēng)景名勝區(qū)選址論證報告編制技術(shù)規(guī)范》編制說明
- 議論文8(試題+審題+范文+點評+素材)-2025年高考語文寫作復(fù)習(xí)
- 2025年中國中煤能源股份有限公司招聘筆試參考題庫含答案解析
- 2025-2030年(全新版)中國軟冰淇淋市場發(fā)展趨勢與投資戰(zhàn)略研究報告
評論
0/150
提交評論