新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 閃速存儲器AT29C040與單片機的接口設計

        閃速存儲器AT29C040與單片機的接口設計

        作者: 時間:2013-10-16 來源:網絡 收藏
        1 引言

        自1984年第一塊問世以來,就以其EPROM的可編程能力和EEPROM的電可擦除性能,以及在線電可改寫特性而得到了廣泛的應用和發展。隨著制造工藝和材料的改進,比EPROM和EEPROM、SRAM及DRAM等存儲器的優勢越來越明顯。

        Atmel公司于1998年推出了新一代大容量快閃存儲器,由于它采用了Fowler-Nordheim隧道效應技術,使編程電流比第一代閃存降低了一個數量級。該芯片只需要+5V電源并支持分頁編程,此外,還具有硬件數據保護、軟件數據保護、數據查詢和自舉模塊等其他功能。根據筆者的使用情況,本文對閃速存儲器的結構特點、使用方法等作了簡要介紹,并以筆者開發的某測試儀器為例說明的接口及使用方法。

        2 芯片簡介

        2.1 芯片的結構與特點

        AT29C040的結構類似于SRAM,它有8條數據線(D0~D7)、19條地址線(A0~A18)、3條控制線(/OE、/CE、/WE)以及電源、地線共32個引腳,具體引腳分布如圖所示。

        AT29C040閃速存儲器有如下幾個特點:

        (1)用5V單一電源供電,讀、寫操作使用同一電源,省去了一個12V的編程電源VPP ;

        (2)編程前不需要附加的擦除操作,在編程期間,擦除操作會在芯片內部自動進行;

        (3)在單個編程周期內,每次寫一個扇區的數據,大大縮短了編程時間。AT29C040的扇區編程時間為10ms,而其他扇區的編程時間為數百 ms;

        (4)扇區容量小,減少了寫數據時對系統內存資源的要求;

        (5)軟件數據保護SDP(Software Data Protect)功能。為了避免人為疏忽或者系統上電、掉電等因素引起對閃速存儲器的誤寫操作, AT29C040設置了軟件數據保護功能。其原理是對閃速存儲器寫操作前,必須按一定順序送入三個字節的命令碼,然后才能寫入數據,否則數據不能被寫入。

        2.2 芯片操作

        2.2.1 讀寫操作

        對AT29C040的讀操作非常簡單,類似于SRAM,不再贅述。這里主要討論一下對它進行寫操作的方法。首先在系統RAM區為AT29C040產生一個扇區的數據映像,即先將待寫入的數據放入 RAM中,接著送三字節的命令碼到AT29C040中;然后將事先放在RAM中的數據傳送到AT29C040指定的扇區中;最后還要等待閃速存儲器的寫周期時間(10ms),以便將數據寫入存儲器中。其“寫” 操作時序如圖所示。

        2.2.2 數據輪詢

        在編程周期期間,如果讀取最后裝入的字節將使I/O7上出現所裝入數據的補碼,一旦編程周期結束,所有輸出線上的真數據有效,可以開始下一個編程周期。數據輪詢可以在編程周期的任何時刻開始,數據輪詢時序如圖3所示。圖中,各時間參數的含義分別是:tDH是數據保持時間; tOEH是OE信號保持時間;tWR 是寫信號恢復時間。

        2.3 軟件數據保護

        軟件數據保護是通過一連串地向2個特殊地址寫入3個特殊數據來完成的。關閉軟件數據保護也是通過一連串地向2個特殊地址寫入6個特殊數據來完成。如果不執行這樣的操作,對29C040的訪問將不能正常進行。該軟件保護算法可由用戶開啟或關閉。圖4和圖5分別是是軟件保護和關閉軟件保護的流程圖。

        有關29C040芯片其他特性以及一些相關參數在其芯片手冊里有很詳細的說明,這里不再描述,下面就其應用作一介紹。

        3 與的接口

        3.1 硬件設計

        AT29C040和微處理器接口很簡便,和我們經常擴展的數據存儲器基本相似。稍微有所不同的是,由于它相當于8個普通的64k字節空間的 RAM,所以地址最高3位分別由3根處理器地址線來控制,訪問的范圍是0 0000~7 FFFF。接口如圖。

        在硬件設計中,筆者使用的微處理器是80C51。由于擴展的芯片較多,在各器件的片選時,沒有使用138譯碼器,而是采用了一個可編程邏輯器件(PLD)。在圖6中,選中29C040時, P13,P14的狀態是00,選中ROM和RAM則分別是01和10(為簡單起見,假設擴展芯片僅是以上幾個)。

        3.2 軟件設計

        在掌握了該芯片的主要特性之后,對它的使用就比較簡單了。下面我們提供了16進制數0X45寫到29C040里的C語言程序。

        #include

        #include

        void delay(unsigned int l_time);

        void protect();

        void select_segment(unsigned char seg);

        unsigned char data cdat;

        void write_data(unsigned int m_addr,unsigned int s_sector,unsigned int acount);

        {

        unsigned int data addraa,addrbb; /* addraa 為內存地址,addrbb 為29C020地址 */

        unsigned int data i,j;

        bit data flaga;

        flaga=EA;

        EA=0;

        addraa=m_addr;

        addrbb=s_sector*256;

        for(j=acount;j>0;j--)

        {

        protect();

        for(i=0;i256;i++)

        {

        P14=0;P13=1;

        cdat=XBYTE[addraa];

        select_segment(s_sector/256);

        /*s_sector 是256的整數倍*/

        XBYTE[addrbb]=cdat;

        P14=0;P13=1;

        addraa++;

        addrbb++;


        }

        s_sector++;

        delay(1000);

        }


        P14=0;P13=1;

        EA=flaga;

        }

        /* 選擇 29C040 段地址(高位地址),

        seg 為段地址*/

        void select_segment(unsigned char seg)

        {

        switch(seg)

        {

        case 0: P1=0x00;_nop_(); break; /* 29c040 a18a17a16= 000 00000-0ffff */

        case 1: P1=0x01;_nop_(); break; /* 29c040 a18a17a16= 001 10000-1ffff */

        case 2: P1=0x02;_nop_(); break; /* 29c040 a18a17a16= 010 20000-2ffff */

        case 3: P1=0x03;_nop_(); break; /* 29c040 a18a17a16= 011 30000-3ffff */

        case 4: P1=0x04;_nop_(); break; /* 29c040 a18a17a16= 100 40000-4ffff */

        case 5: P1=0x05;_nop_(); break; /* 29c040 a18a17a16= 101 50000-5ffff */

        case 6: P1=0x06;_nop_(); break; /* 29c040 a18a17a16= 110 60000-6ffff */

        case 7: P1=0x07;_nop_(); break; /* 29c040 a18a17a16= 111 70000-7ffff */

        }

        }

        void protect()

        {

        select_segment(0);/*必須寫到第0段*/

        XBYTE[0x5555]=0xaa;

        XBYTE[0x2aaa]=0x55;

        XBYTE[0x5555]=0xa0;

        P14=0;P13=1;

        }

        void delay(unsigned int l_time)/*寫完一個扇區后延時*/

        {

        unsigned int data lp;/* 4ms */

        for(lp=0;lp

        _nop_();

        }

        main()

        {

        unsigned int data i;

        P14=0;P13=1;

        for(i=0;i256;i++)

        {XBYTE[0x0200+i]=0x45;}

        write_data(0x0200,0,1);

        delay(1000);

        while(1);

        }

        4 結束語

        AT29C040在中的應用不僅能使用戶快速地實現所需功能,而且電擦除的方式為程序和數據的存儲和更新提供了方便,隨著閃速存儲器器件朝著容量越來越大、工作電壓越來越低、支持共同的接口標準的方向發展,閃速存儲器硬件接口和軟件設計將越來越容易。


        參考文獻:

        [1] 孫涵芳,徐愛卿.MCS51/96系列單片機原理及應用[M].北京:北京航空航天大學出版社,1988.

        [2] 余永權.ATMEL FLASH 單片機原理及應用[M].北京:電子工業出版社,1997.

        [3] 竇振中. 單片機外圍器件實用手冊——存儲器分冊[M]. 北京:北京航空航天大學出版社,1998.

        [4] AT29C040數據手冊.www.atmel.com.

        [5].AT29C040datasheethttp://www.dzsc.com/datasheet/AT29C040_809355.html.

        [6].EPROMdatasheethttp://www.dzsc.com/datasheet/EPROM_1128137.html.

        [7].80C51datasheethttp://www.dzsc.com/datasheet/80C51_103447.html.

        [8].P13datasheethttp://www.dzsc.com/datasheet/P13_2043489.html.

        [9].29C020datasheethttp://www.dzsc.com/datasheet/29C020_952547.html.

        存儲器相關文章:存儲器原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 松滋市| 台南县| 广元市| 赤城县| 东乡族自治县| 栖霞市| 大石桥市| 乌拉特后旗| 丹江口市| 瑞金市| 华坪县| 福安市| 亚东县| 桦川县| 镇雄县| 布尔津县| 宁明县| 洛隆县| 景宁| 大丰市| 宝应县| 涿鹿县| 武川县| 屯留县| 敖汉旗| 阿尔山市| 娄烦县| 四子王旗| 鄱阳县| 徐汇区| 松江区| 车险| 仲巴县| 茶陵县| 拜泉县| 和田市| 灵川县| 太仆寺旗| 壤塘县| 运城市| 桃源县|