閃速存儲器AT29C040與單片機的接口設計
1 引言 自1984年第一塊閃速存儲器問世以來,閃速存儲器就以其EPROM的可編程能力和EEPROM的電可擦除性能,以及在線電可改寫特性而得到了廣泛的應用和發(fā)展。隨著制造工藝和材料的改進,閃速存儲器比EPROM和EEPROM、SRAM及DRAM等存儲器的優(yōu)勢越來越明顯。 Atmel公司于1998年推出了新一代大容量快閃存儲器AT29C040,由于它采用了Fowler-Nordheim隧道效應技術,使編程電流比第一代閃存降低了一個數(shù)量級。該芯片只需要+5V電源并支持分頁編程,此外,還具有硬件數(shù)據(jù)保護、軟件數(shù)據(jù)保護、數(shù)據(jù)查詢和自舉模塊等其他功能。根據(jù)筆者的使用情況,本文對AT29C040閃速存儲器的結(jié)構(gòu)特點、使用方法等作了簡要介紹,并以筆者開發(fā)的某測試儀器為例說明AT29C040與單片機的接口及使用方法。 2 芯片簡介 2.1 芯片的結(jié)構(gòu)與特點 AT29C040的結(jié)構(gòu)類似于SRAM,它有8條數(shù)據(jù)線(D0~D7)、19條地址線(A0~A18)、3條控制線(/OE、/CE、/WE)以及電源、地線共32個引腳,具體引腳分布如圖所示。AT29C040閃速存儲器有如下幾個特點: (1)用5V單一電源供電,讀、寫操作使用同一電源,省去了一個12V的編程電源VPP ; (2)編程前不需要附加的擦除操作,在編程期間,擦除操作會在芯片內(nèi)部自動進行; (4)扇區(qū)容量小,減少了寫數(shù)據(jù)時對系統(tǒng)內(nèi)存資源的要求; (5)軟件數(shù)據(jù)保護SDP(Software Data Protect)功能。為了避免人為疏忽或者系統(tǒng)上電、掉電等因素引起對閃速存儲器的誤寫操作, AT29C040設置了軟件數(shù)據(jù)保護功能。其原理是對閃速存儲器寫操作前,必須按一定順序送入三個字節(jié)的命令碼,然后才能寫入數(shù)據(jù),否則數(shù)據(jù)不能被寫入。 2.2 芯片操作 對AT29C040的讀操作非常簡單,類似于SRAM,不再贅述。這里主要討論一下對它進行寫操作的方法。首先在系統(tǒng)RAM區(qū)為AT29C040產(chǎn)生一個扇區(qū)的數(shù)據(jù)映像,即先將待寫入的數(shù)據(jù)放入 RAM中,接著送三字節(jié)的命令碼到AT29C040中;然后將事先放在RAM中的數(shù)據(jù)傳送到AT29C040指定的扇區(qū)中;最后還要等待閃速存儲器的寫周期時間(10ms),以便將數(shù)據(jù)寫入存儲器中。其“寫” 操作時序如圖所示。 在編程周期期間,如果讀取最后裝入的字節(jié)將使I/O7上出現(xiàn)所裝入數(shù)據(jù)的補碼,一旦編程周期結(jié)束,所有輸出線上的真數(shù)據(jù)有效,可以開始下一個編程周期。數(shù)據(jù)輪詢可以在編程周期的任何時刻開始,數(shù)據(jù)輪詢時序如圖3所示。圖中,各時間參數(shù)的含義分別是:tDH是數(shù)據(jù)保持時間; tOEH是OE信號保持時間;tWR 是寫信號恢復時間。 軟件數(shù)據(jù)保護是通過一連串地向2個特殊地址寫入3個特殊數(shù)據(jù)來完成的。關閉軟件數(shù)據(jù)保護也是通過一連串地向2個特殊地址寫入6個特殊數(shù)據(jù)來完成。如果不執(zhí)行這樣的操作,對29C040的訪問將不能正常進行。該軟件保護算法可由用戶開啟或關閉。圖4和圖5分別是是軟件保護和關閉軟件保護的流程圖。 有關29C040芯片其他特性以及一些相關參數(shù)在其芯片手冊里有很詳細的說明,這里不再描述,下面就其應用作一介紹。 3 與單片機的接口 3.1 硬件設計 3.2 軟件設計 #include #include 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 為內(nèi)存地址,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的整數(shù)倍*/ XBYTE[addrbb]=cdat; P14=0;P13=1; addraa++; addrbb++;
s_sector++; delay(1000); }
EA=flaga; } /* 選擇 29C040 段地址(高位地址), seg 為段地址*/ void select_segment(unsigned char 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)/*寫完一個扇區(qū)后延時*/ { unsigned int data lp;/* 4ms */ for(lp=0;lp } 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 結(jié)束語 AT29C040在單片機中的應用不僅能使用戶快速地實現(xiàn)所需功能,而且電擦除的方式為程序和數(shù)據(jù)的存儲和更新提供了方便,隨著閃速存儲器器件朝著容量越來越大、工作電壓越來越低、支持共同的接口標準的方向發(fā)展,閃速存儲器硬件接口和軟件設計將越來越容易。
[1] 孫涵芳,徐愛卿.MCS51/96系列單片機原理及應用[M].北京:北京航空航天大學出版社,1988. [2] 余永權.ATMEL FLASH 單片機原理及應用[M].北京:電子工業(yè)出版社,1997. [3] 竇振中. 單片機外圍器件實用手冊——存儲器分冊[M]. 北京:北京航空航天大學出版社,1998. [4] AT29C040數(shù)據(jù)手冊.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.
存儲器相關文章:存儲器原理
評論