劉靜,王計元
(上海電力學院計算機與信息工程學院,上海 200090)
電可擦除可編程只讀存儲器(Electrically Erasable Programmable Read-Only Memory,EEPROM),其內容可由軟件進行隨機讀寫以實現數據的更新,并可在芯片斷電的情況下長期保存片內信息,兼?zhèn)淞薘AM和ROM的基本特點.
串行EEPROM使用內部集成電路(Inter Integrated Circuit,I2C)總線技術,只需占用微處理器的2個I/O引腳,且使用方便.目前,較為常用的串行EEPROM是24C系列,主要由ATMEL,MICROCHIP,XICOR,N-TIONAL等幾家公司提供.24C系列串行EEPROM具有體積小、功耗低、型號多,以及工作電壓允許范圍寬、容量擴展配置極其靈活方便、讀寫操作相對簡單等特點,廣泛使用于各種家電、工業(yè)及通信設備中,主要用于保存設備所需要的配置數據、采集數據及程序等.
本文介紹了串行EEPROM(24C64)與單片機AT89S51的接口技術,并以24C系列串行EEPROM在語音錄播系統(tǒng)中的應用為例,詳細說明了單片機對EEPROM的讀寫操作.
本文以24C64芯片為例來說明串行EEPROM與單片機的接口設計,該芯片的8腳PDIP封裝的引腳封裝如圖1所示.
圖1 24C64引腳封裝示意
引腳功能分別為:1~3腳(A0,A1,A2)為器件地址輸入端,A0~A2用于設置芯片的器件地址,在同一總線上有多個器件時,可以通過設置A0~A2引腳來確定器件地址;4腳GND為接地端;5腳SDA為串行數據/地址輸入輸出端,用于在芯片讀寫時輸入或輸出數據、地址等,在SCL引腳輸入時鐘信號的上升沿將數據送入EEPROM器件,并在時鐘的下降沿將數據讀出,該引腳是漏極開路的雙向引腳,使用時需加一個上拉電阻;6腳SCL為時鐘輸入端,如果是在單片機系統(tǒng)中使用,則由單片機控制,并根據單片機的程序要求產生串行同步時鐘信號,以控制總線的存取;7腳WP是寫保護腳,當其連接到VCC時,芯片均處于禁止寫入狀態(tài),當其連接到VSS或懸空時,芯片處于正常的讀寫狀態(tài);8腳VCC為正電源[1].
在基于ISD語音芯片的隨機語音錄播系統(tǒng)中,可以利用一片串行EEPROM來存儲每一段錄音的起始地址和錄音長度.24C64與AT89S51單片機的硬件接口電路如圖2所示.將單片機的P3.0腳與24C64的SCL腳相連,通過單片機控制產生一定頻率的時鐘信號.將單片機的P3.1腳與24C64的SDA腳相連[2].
圖2 24C64與單片機的硬件接口電路
圖2中只接有一片24C64芯片用來保存數據,因此將地址端A0,A1,A2接地.而且該電路未進行寫保護,所以將WP端接地.接在I2C總線上的器件分為主控器件和從器件兩種.主控器件用于啟動數據發(fā)送,產生SCL及結束數據傳送.從器件是被主控器件尋址的器件.
圖2中AT89S51單片機為主控器件,24C64為從器件.編寫程序時,可定義單片機的P3.0腳為串行時鐘線(SCL BIT P3.0),P3.1腳為數據線(SDA BIT P3.1).單片機最多可以連接8個64 k器件到同一總線上并列使用,器件地址由引腳A2,A1,A0設置.24C64芯片的器件地址為8位,其中高4位固定為1010,接下來的3位A2,A1,A0為器件的地址位,最低位R/W作為讀寫控制位,“1”表示對從器件進行讀操作,“0”表示對從器件進行寫操作[3].圖2中A2A1A0為000,因此寫操作為0A0H,讀操作為0A1H.
根據24C64芯片的時序操作和I2C總線協議對24C64與單片機的接口進行軟件設計,以實現單片機對串行EEPROM的讀寫操作[4].
24 C64 的起始/停止時序如圖3所示.
圖3 24C64的起始/停止時序
將時鐘線為高電平時數據線的任何電平變化看作總線的起始或停止信號.將電平從高到低的跳變作為I2C總線的起始信號,將電平從低到高的跳變作為I2C總線的停止信號,據此可以編寫出讀寫I2C總線的啟動和停止工作子程序[1].啟動工作子程序如下:
24 C64 的寫時序如圖4所示.傳輸數據時,若時鐘信號SCL為高電平,則SDA上的電平為有效數據;若時鐘信號SCL為低電平,則允許改變SDA線上的數據.
圖4 24C64的寫時序
編寫單片機向總線傳送數據的程序時,可以在SCL為低電平時,將數據電平送到SDA,從而使SCL為高電平,此時SDA不應有電平跳變,延時后使SCL為低電平,然后再進行下一位數據傳送直到完成.I2C總線協議規(guī)定,所有發(fā)送到SDA線上的數據信息必須為8位,首先傳輸數據的最高位.I2C總線每接收完一個字節(jié),到第9個時鐘信號后,會在SDA上回答一個低電平的應答信號,以此表示當前受控的器件已接收完一個字節(jié),可以開始下一個字節(jié)的傳送了.根據寫時序圖和以上分析可以編寫出寫數據到I2C總線的寫8bit子程序.
以上是根據24C64芯片的操作時序和I2C總線協議編寫的使用24C64芯片的基本操作,對24C64的讀/寫操作均要用到以上這幾個子程序.
以隨機讀與寫單個字節(jié)為例,給出AT89S51單片機對24C64的讀寫操作程序.隨機讀時序圖如圖5所示.
圖5 隨機讀時序
主器件首先通過發(fā)送起始信號,從器件地址和欲讀取字節(jié)數據的地址執(zhí)行一個偽寫操作.在24C64應答后,主器件重新發(fā)送起始信號和從器件地址(R/W位置1),在24C64響應并發(fā)送應答信號后,輸出所要求的一個8位字節(jié)數據,此時主器件不發(fā)送應答信號,但生成一個停止信號.
下面通過編寫單片機從EEPROM的0006H地址把55H數據讀出來的程序,來說明如何實現隨機讀子程序.單片機從24C64芯片中讀出8位字節(jié)數據后,要求產生一個停止信號.首先編寫產生停止信號的子程序.
24 C64 芯片的字節(jié)寫時序如圖6所示.在字節(jié)寫模式下主器件首先發(fā)送起始信號和從器件地址信息(R/W位置0)給從器件,從器件收到后發(fā)送應答信號.然后主器件發(fā)送24C64存儲單元的地址(兩個8位地址字)到從器件,從器件收到后發(fā)送應答信號.最后主器件發(fā)送數據到被尋址的存儲單元,24C64再次應答并在主器件產生停止信號后開始內部數據的擦寫.在內部擦寫過程中,24C64不再應答主器件的任何請求.
圖6 字節(jié)寫時序
下面通過編寫將55H數據存放到EEPROM的0006H地址中的程序,來說明如何實現單字節(jié)寫子程序.
本文詳細介紹了24CXX系列串行EEPROM的讀寫操作,并給出了AT89S51單片機對單字節(jié)數據讀寫操作的詳細程序,論證了串行EEPROM可以作為數據存儲器用于系統(tǒng)數據的存儲過程.文中所給出的源代碼,都已經在隨機語音錄播系統(tǒng)中通過調試.
[1]程可嘉,王振松,劉曉云.ISD2560在門禁系統(tǒng)語音播報中的應用[J].自動化技術與應用,2009(5):75-77.
[2]李朝青.單片機原理及接口技術[M].第3版.北京:北京航天航空大學出版社,2005:200-220.
[3]MARIAN Mitescu,IOAN Susnea.Microcontrollers in practice[M].Berlin:Springer Berlin Heidelberg,2005:19-113.
[4]高強,赫榮杰,李樹良.串行E2PROM的讀寫應用[J].微處理機,2004,4(8):16-17.
(編輯白林雪)