基于AT89C52單片機(jī)的SD卡的讀寫設(shè)計(jì)
長(zhǎng)期以來,以flash memory為存儲(chǔ)體的sd卡因具備體積小、功耗低、可擦寫以及非易失性等特點(diǎn)而被廣泛應(yīng)用于消費(fèi)類電子產(chǎn)品中。特別是近年來,隨著價(jià)格不斷下降且存儲(chǔ)容量不斷提高,它的應(yīng)用范圍日益增廣。當(dāng)數(shù)據(jù)采集系統(tǒng)需要長(zhǎng)時(shí)間地采集、記錄海量數(shù)據(jù)時(shí),選擇sd卡作為存儲(chǔ)媒質(zhì)是開發(fā)者們一個(gè)很好的選擇。在電能監(jiān)測(cè)以及無功補(bǔ)償系統(tǒng)中,要連續(xù)記錄大量的電壓、電流、有功功率、無功功率以及時(shí)間等參數(shù),當(dāng)單片機(jī)采集到這些數(shù)據(jù)時(shí)可以利用sd作為存儲(chǔ)媒質(zhì)。本文主要介紹了sd卡在電能監(jiān)測(cè)及無功補(bǔ)償數(shù)據(jù)采集系統(tǒng)中的應(yīng)用方案。 設(shè)計(jì)方案 應(yīng)用at89c52讀寫sd卡有兩點(diǎn)需要注意。首先,需要尋找一個(gè)實(shí)現(xiàn)at89c52單片機(jī)與sd卡通訊的解決方案;其次,sd卡所能接受的邏輯電平與at89c52提供的邏輯電平不匹配,需要解決電平匹配問題。通訊模式 sd卡有兩個(gè)可選的通訊協(xié)議:sd模式和spi模式。sd模式是sd卡標(biāo)準(zhǔn)的讀寫方式,但是在選用sd模式時(shí),往往需要選擇帶有sd卡控制器接口的mcu,或者必須加入額外的sd卡控制單元以支持sd卡的讀寫。然而,at89c52單片機(jī)沒有集成sd卡控制器接口,若選用sd模式通訊就無形中增加了產(chǎn)品的硬件成本。在sd卡數(shù)據(jù)讀寫時(shí)間要求不是很嚴(yán)格的情況下,選用spi模式可以說是一種最佳的解決方案。因?yàn)樵趕pi模式下,通過四條線就可以完成所有的數(shù)據(jù)交換,并且目前市場(chǎng)上很多mcu都集成有現(xiàn)成的spi接口電路,采用spi模式對(duì)sd卡進(jìn)行讀寫操作可大大簡(jiǎn)化硬件電路的設(shè)計(jì)?! ‰m然at89c52不帶sd卡硬件控制器,也沒有現(xiàn)成的spi接口模塊,但是可以用軟件模擬出spi總線時(shí)序。本文用spi總線模式讀寫sd卡。電平匹配 sd卡的邏輯電平相當(dāng)于3.3v ttl電平標(biāo)準(zhǔn),而控制芯片at89c52的邏輯電平為5v cmos電平標(biāo)準(zhǔn)。因此,它們之間不能直接相連,否則會(huì)有燒毀sd卡的可能。出于對(duì)安全工作的考慮,有必要解決電平匹配問題?! ∫鉀Q這一問題,最根本的就是解決邏輯器件接口的電平兼容問題,原則主要有兩條:一為輸出電平器件輸出高電平的最小電壓值,應(yīng)該大于接收電平器件識(shí)別為高電平的最低電壓值;另一條為輸出電平器件輸出低電平的最大電壓值,應(yīng)該小于接收電平器件識(shí)別為低電平的最高電壓值?! ∫话銇碚f,通用的電平轉(zhuǎn)換方案是采用類似sn74alvc4245的專用電平轉(zhuǎn)換芯片,這類芯片不僅可以用作升壓和降壓,而且允許兩邊電源不同步。但是,這個(gè)方案代價(jià)相對(duì)昂貴,而且一般的專用電平轉(zhuǎn)換芯片都是同時(shí)轉(zhuǎn)換8路、16路或者更多路數(shù)的電平,相對(duì)本系統(tǒng)僅僅需要轉(zhuǎn)換3路來說是一種資源的浪費(fèi)。 考慮到sd卡在spi協(xié)議的工作模式下,通訊都是單向的,于是在單片機(jī)向sd卡傳輸數(shù)據(jù)時(shí)采用晶體管加上拉電阻法的方案,基本電路如圖1所示。而在sd卡向單片機(jī)傳輸數(shù)據(jù)時(shí)可以直接連接,因?yàn)樗鼈冎g的電平剛好滿足上述的電平兼容原則,既經(jīng)濟(jì)又實(shí)用?! ∵@個(gè)方案需要雙電源供電(一個(gè)5v電源、一個(gè)3.3v電源供電),3.3v電源可以用ams1117穩(wěn)壓管從5v電源穩(wěn)壓獲取。硬件接口設(shè)計(jì) sd卡提供9pin的引腳接口便于外圍電路對(duì)其進(jìn)行操作,9pin的引腳隨工作模式的不同有所差異。在spi模式下,引腳1(dat3)作為spi片選線cs用,引腳2(cmd)用作spi總線的數(shù)據(jù)輸出線mosi,而引腳7(dat0)為數(shù)據(jù)輸入線miso,引腳5用作時(shí)鐘線(clk)。除電源和地,保留引腳可懸空?! ”疚闹锌刂苨d卡的mcu是atmel公司生產(chǎn)的低電壓、高性能cmos 8位單片機(jī)at89c52,內(nèi)含8k字節(jié)的可反復(fù)擦寫的只讀程序存儲(chǔ)器和256字節(jié)的隨機(jī)存儲(chǔ)數(shù)據(jù)存儲(chǔ)器。由于at89c52只有256字節(jié)的數(shù)據(jù)存儲(chǔ)器,而sd卡的數(shù)據(jù)寫入是以塊為單位,每塊為512字節(jié),所以需要在單片機(jī)最小系統(tǒng)上增加一片ram。本系統(tǒng)中ram選用存儲(chǔ)器芯片hm62256,容量為32k。對(duì)ram進(jìn)行讀寫時(shí),鎖存器把低8位地址鎖存,與p2口的8位地址數(shù)據(jù)構(gòu)成16位地址空間,從而可使sd卡一次讀寫512字節(jié)的塊操作。系統(tǒng)硬件圖如圖2所示。 軟件設(shè)計(jì)spi工作模式 sd卡在上電初期自動(dòng)進(jìn)入sd總線模式,在此模式下向sd卡發(fā)送復(fù)位命令cmd0。如果sd卡在接收復(fù)位命令過程中cs低電平有效,則進(jìn)入spi模式,否則工作在sd總線模式?! ?duì)于不帶spi串行總線接口的at89c52單片機(jī)來說,用軟件來模擬spi總線操作的具體做法是:將p1.5口(模擬clk線)的初始狀態(tài)設(shè)置為1,而在允許接收后再置p1.5為0。這樣,mcu在輸出1位sck時(shí)鐘的同時(shí),將使接口芯片串行左移,從而輸出1位數(shù)據(jù)至at89c52單片機(jī)的p1.7(模擬miso線),此后再置p1.5為1,使單片機(jī)從p1.6(模擬mosi線)輸出1位數(shù)據(jù)(先為高位)至串行接口芯片。至此,模擬1位數(shù)據(jù)輸入輸出便完