<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于AT89C52單片機的SD卡讀寫設計

          基于AT89C52單片機的SD卡讀寫設計

          作者:武漢理工大學自動化學院 蘇義鑫 程 敏 武漢大學 何力 時間:2008-08-04 來源:中電網(wǎng) 收藏

          前言

          本文引用地址:http://www.ex-cimer.com/article/86566.htm

            長期以來,以Flash Memory為體的卡因具備體積小、功耗低、可擦寫以及非易失性等特點而被廣泛應用于消費類電子產品中。特別是近年來,隨著價格不斷下降且容量不斷提高,它的應用范圍日益增廣。當數(shù)據(jù)采集系統(tǒng)需要長時間地采集、記錄海量數(shù)據(jù)時,選擇卡作為媒質是開發(fā)者們一個很好的選擇。在電能監(jiān)測以及無功補償系統(tǒng)中,要連續(xù)記錄大量的電壓、電流、有功功率、無功功率以及時間等參數(shù),當采集到這些數(shù)據(jù)時可以利用作為存儲媒質。本文主要介紹了SD卡在電能監(jiān)測及無功補償數(shù)據(jù)采集系統(tǒng)中的應用方案。

          設計方案

            應用讀寫SD卡有兩點需要注意。首先,需要尋找一個實現(xiàn)與SD卡通訊的解決方案;其次,SD卡所能接受的邏輯電平與提供的邏輯電平不匹配,需要解決電平匹配問題。

            通訊模式

            SD卡有兩個可選的通訊協(xié)議:SD模式和SPI模式。SD模式是SD卡標準的讀寫方式,但是在選用SD模式時,往往需要選擇帶有SD卡控制器接口的MCU,或者必須加入額外的SD卡控制單元以支持SD卡的讀寫。然而,AT89C52沒有集成SD卡控制器接口,若選用SD模式通訊就無形中增加了產品的硬件成本。在SD卡數(shù)據(jù)讀寫時間要求不是很嚴格的情況下,選用SPI模式可以說是一種最佳的解決方案。因為在SPI模式下,通過四條線就可以完成所有的數(shù)據(jù)交換,并且目前市場上很多MCU都集成有現(xiàn)成的SPI接口電路,采用SPI模式對SD卡進行讀寫操作可大大簡化硬件電路的設計。

            雖然AT89C52不帶SD卡硬件控制器,也沒有現(xiàn)成的SPI接口模塊,但是可以用軟件模擬出SPI總線時序。本文用SPI總線模式讀寫SD卡。

            電平匹配

            SD卡的邏輯電平相當于3.3V TTL電平標準,而控制芯片AT89C52的邏輯電平為5V CMOS電平標準。因此,它們之間不能直接相連,否則會有燒毀SD卡的可能。出于對安全工作的考慮,有必要解決電平匹配問題。

            要解決這一問題,最根本的就是解決邏輯器件接口的電平兼容問題,原則主要有兩條:一為輸出電平器件輸出高電平的最小電壓值,應該大于接收電平器件識別為高電平的最低電壓值;另一條為輸出電平器件輸出低電平的最大電壓值,應該小于接收電平器件識別為低電平的最高電壓值。

            一般來說,通用的電平轉換方案是采用類似SN74ALVC4245的專用電平轉換芯片,這類芯片不僅可以用作升壓和降壓,而且允許兩邊電源不同步。但是,這個方案代價相對昂貴,而且一般的專用電平轉換芯片都是同時轉換8路、16路或者更多路數(shù)的電平,相對本系統(tǒng)僅僅需要轉換3路來說是一種資源的浪費。

            考慮到SD卡在SPI協(xié)議的工作模式下,通訊都是單向的,于是在單片機向SD卡傳輸數(shù)據(jù)時采用晶體管加上拉電阻法的方案,基本電路如圖1所示。而在SD卡向單片機傳輸數(shù)據(jù)時可以直接連接,因為它們之間的電平剛好滿足上述的電平兼容原則,既經濟又實用。

             這個方案需要雙電源供電(一個5V電源、一個3.3V電源供電),3.3V電源可以用AMS1117穩(wěn)壓管從5V電源穩(wěn)壓獲取。

          硬件接口設計

            SD卡提供9Pin的引腳接口便于外圍電路對其進行操作,9Pin的引腳隨工作模式的不同有所差異。在SPI模式下,引腳1(DAT3)作為SPI片選線CS用,引腳2(CMD)用作SPI總線的數(shù)據(jù)輸出線MOSI,而引腳7(DAT0)為數(shù)據(jù)輸入線MISO,引腳5用作時鐘線(CLK)。除電源和地,保留引腳可懸空。

            本文中控制SD卡的MCU是ATMEL公司生產的低電壓、高性能CMOS 8位單片機AT89C52,內含8K字節(jié)的可反復擦寫的只讀程序存儲器和256字節(jié)的隨機存儲數(shù)據(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ù)構成16位地址空間,從而可使SD卡一次讀寫512字節(jié)的塊操作。系統(tǒng)硬件圖如圖2所示。

           

          軟件設計

            SPI工作模式

            SD卡在上電初期自動進入SD總線模式,在此模式下向SD卡發(fā)送復位命令CMD0。如果SD卡在接收復位命令過程中CS低電平有效,則進入SPI模式,否則工作在SD總線模式。

            對于不帶SPI串行總線接口的AT89C52單片機來說,用軟件來模擬SPI總線操作的具體做法是:將P1.5口(模擬CLK線)的初始狀態(tài)設置為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ù)。具體程序如下:(程序是在Keil uVision2的編譯環(huán)境下編寫)

            sbit CS=P3^5;

            sbit CLK= P1^5;

            sbit DataI=P1^7;

            sbit DataO=P1^6;

            #define SD_Disable() CS=1 //片選關

            #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; // write

            if(val&0x80) DataI=1;

            val<<=1;

            CLK=1;

            if(DataO)val|=1; // read

            }

            CLK=0;

            return val;

            }

           


          上一頁 1 2 下一頁

          關鍵詞: 單片機 AT89C52 存儲 SD

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();