引言:本文基于上一篇博文I2C理論知識,通過FPGA實現(xiàn)讀寫EEPROM(AT24C02)芯片實戰(zhàn)操作,進一步了解如何利用HDL實現(xiàn)I2C接口驅動設計。
1. 硬件設計
1.1 概述
Atmel?AT24C01C/02C提供1024/2048位的串行電可擦除可編程只讀存儲器(EEPROM),其組織為128/256個字,每個字8位。這兩種設備都包含級聯(lián)功能,最多允許八個設備共享一條通用的2線總線。這些設備被優(yōu)化用于許多工業(yè)和商業(yè)應用,其中低功率和低電壓操作是必不可少的。
圖1:AT24C01C/02C管腳及常見封裝
AT24C01C/02C有節(jié)省空間的8引腳PDIP、8引腳SOIC、8引腳TSSOP、8引腳UDFN、5引腳SOT23和8球VFBGA封裝。此外,整個系列的工作電壓為1.7V至5.5V VCC。
1.2 管腳描述
串行時鐘(SCL):SCL輸入用于將上升沿沿時鐘數(shù)據(jù)輸入每個EEPROM設備,并將下降沿沿時鐘數(shù)據(jù)輸出每個設備。該引腳是開漏極驅動的。
串行數(shù)據(jù)(SDA):SDA引腳是雙向的,用于串行數(shù)據(jù)傳輸。該引腳是開漏極驅動的。
設備/頁面地址(A2、A1、A0):A2、A1和A0引腳是AT24C01C/02C的硬接線設備地址輸入。在單個總線系統(tǒng)上可以尋址多達八個1-Kbit或2-Kbit設備。
寫保護(WP):AT24C01C/02C有一個寫保護引腳,可提供硬件數(shù)據(jù)保護。當連接到地(GND)時,寫保護引腳允許正常的讀/寫操作。當寫入保護引腳連接到VCC時,寫入保護功能被啟用,并如表1所示進行操作。
表1:寫保護管腳
1.3 原理圖設計
圖2:AT2C02原理圖設計
2. 軟件設計
2.1 器件地址寄存器
設備地址字由前四個最高有效位的強制性“1010”(0xA)序列組成,如圖4所示,這對所有串行EEPROM設備都是通用的。
圖3:AT2C02器件地址寄存器
接下來的三個位是1K和2K EEPROM的A2、A1和A0設備地址位。這三個位必須與其相應的硬接線輸入引腳A2、A1、和A0進行比較,以便部件進行確認。設備地址的第八位是讀/寫操作選擇位。如果該位為高,則啟動讀操作,如果該位低,則啟動寫操作。
2.2 寫操作
(1)單字節(jié)寫操作
EEPROM單字節(jié)寫操作如圖4所示。
圖4:字節(jié)寫操作時序圖
①主機產生起始信號(START)給從機;
②主機將控制命令(含器件地址DEveice address、WRITE)給從機;
③從機接收到控制命令后,回傳應答信號(ACK)給主機;
④主機收到從機回傳的應答信號(ACK)后,發(fā)送Word Address給從機;
⑤從機接收到寫地址后,回傳應答信號(ACK)給主機;
⑥主機收到從機回傳的應答信號(ACK)后,發(fā)送寫Data給從機;
⑦從機接收到寫數(shù)據(jù)后,回傳應答信號(ACK)給主機;⑧主機收到從機回傳的應答信號(ACK)后,產生STOP信號從機,單字節(jié)寫操作結束。
(2)頁寫操作
Atmel AT24C02,2K串行EEPROM:內部組織32頁,每頁8字節(jié),2K需要一個8位數(shù)據(jù)字地址用于隨機字尋址。
頁面寫入與字節(jié)寫入相同,但主機在第一個數(shù)據(jù)字被計時后不會發(fā)送停止條件。相反,在EEPROM確認接收到第一個數(shù)據(jù)后,主機最多可以發(fā)送七個字節(jié)。在接收到每個數(shù)據(jù)字之后,EEPROM將以ACK作為響應。主機必須在“停止”條件下終止頁面寫入序列。
在接收到每個數(shù)據(jù)字之后,數(shù)據(jù)字地址的低三位在內部遞增。較高的數(shù)據(jù)字地址位不遞增,保留存儲器頁行位置。當內部生成的字地址到達頁面邊界時,下面的字節(jié)被放置在同一頁面的開頭。如果超過八個數(shù)據(jù)字被傳輸?shù)紼EPROM,數(shù)據(jù)字地址將“翻轉”,并且先前的數(shù)據(jù)將被覆蓋。
EEPROM頁寫操作如圖5所示,頁寫操作與單字節(jié)寫操作類似,不在描述。
圖5:頁寫操作時序圖
2.3 讀操作
(1)隨機讀操作
EEPROM隨機讀操作如圖6所示。
圖6:隨機讀操作時序圖
①主機產生起始信號(START)給從機;
②主機將控制命令(含器件地址DEveice address、WRITE)給從機;
③從機接收到控制命令后,回傳應答信號(ACK)給主機;
④主機收到從機回傳的應答信號(ACK)后,發(fā)送Word Address給從機;
⑤從機接收到讀地址后,回傳應答信號(ACK)給主機;
⑥主機再次產生起始信號(START)給從機;
⑦主機將控制命令(含器件地址DEveice address、READ)給從機;
⑧從機接收到讀命令后,回傳應答信號(ACK)給主機;
⑧~⑨主機收到從機回傳的應答信號(ACK)后,開始接收從機發(fā)送過來的讀數(shù)據(jù);
⑩數(shù)據(jù)接收完成后,主機產生一個時鐘的高電平無應答信號;
?主機產生STOP信號從機,隨機讀操作結束。
注意,隨機讀操作先進行了一次寫操作然后進行讀操作。因為我們需要使從機內的存儲單元地址指針指向我們想要讀取的存儲單元地址處,所以首先發(fā)送了一次Dummy Write也就是虛寫操作,只所以稱為虛寫,是因為我們并不是真的要寫數(shù)據(jù),而是通過這種虛寫操作使地址指針指向虛寫操作中字地址的位置,等從機應答后,就可以以當前地址讀的方式讀數(shù)據(jù)了。
(2)順序讀操作
I2C 順序讀操作就是對寄存器或存儲單元數(shù)據(jù)的順序讀取。假如要讀取 n字節(jié)連續(xù)數(shù)據(jù),只需寫入要讀取第一個字節(jié)數(shù)據(jù)的存儲地址,就可以實現(xiàn)連續(xù)n字節(jié)數(shù)據(jù)的順序讀取。EEPROM隨機讀操作如圖7所示。
圖7:順序讀操作時序圖
2.4 FPGA實現(xiàn)
(1)軟件實現(xiàn)
本文要利用FPGA通過I2C接口實現(xiàn)AT24C02 EEPROM讀寫操作。具體功能如下:
(1)I2C總線接口讀寫功能;
(2)將讀出的數(shù)據(jù)顯示在數(shù)碼管上;
(3)按鍵消抖功能。軟件功能模塊劃分如圖8所示。
圖8:軟件功能模塊框圖
各個模塊功能:
(1)eeprom_byte_rd_wr.v模塊為頂層模塊,實現(xiàn)模塊間互聯(lián);(2)i2c_ctrl.v實現(xiàn)I2C總線接口對外通信功能;
(3)i2c_rw_data.v實現(xiàn)I2C讀寫控制功能;
(4)Segma.v實現(xiàn)EEPROM讀出數(shù)據(jù)顯示功能;
(5)KeyJitters.v實現(xiàn)按鍵操作消抖功能。
?(2)測試結果
軟件下載至電路板,EEPROM讀出數(shù)據(jù)正常顯示在數(shù)碼管上,如圖9所示。
圖9:EEPROM讀出數(shù)據(jù)顯示