E2PROM晶元24C02的讀寫程式

2022-03-28 12:06:08 字數 2784 閱讀 2257

一、實驗目的:

給24c02的內部ram寫入一組資料0xb0,資料從24c02內部ram的0x01開始存放。然後再把這組資料讀出來,來點亮led燈,檢驗寫入和讀出是否正確。

二、理論知識準備:

下面我們先介紹一下i2c匯流排的相關理論知識。 

(一)、i2c匯流排概念

i2c匯流排是一種雙向二線制匯流排,它的結構簡單,可靠性和抗干擾性能好。目前很多公司都推出了基於i2c匯流排的外圍器件,例如我們學習板上的24c02晶元,就是乙個帶有i2c匯流排介面的e2prom儲存器,具有掉電記憶的功能,方便進行資料的長期儲存。 

(二)、i2c匯流排結構

i2c匯流排結構很簡單,只有兩條線,包括一條資料線(sda)和一條序列時鐘線(scl)。具有i2c介面的器件可以通過這兩根線接到匯流排上,進行相互之間的資訊傳遞。連線到匯流排的器件具有不同的位址,cpu根據不同的位址進行識別,從而實現對硬體系統簡單靈活的控制。

乙個典型的i2c匯流排應用系統的組成結構如下圖所示:

我們知道微控制器序列通訊的傳送和接收一般都各用一條線txd和rxd,而i2c匯流排的資料線既可以傳送也可以接收,工作方式可以通過軟體設定。所以,i2c匯流排結構的硬體結構非常簡潔。

當某器件向匯流排上傳送資訊時,它就是傳送器,而當其從匯流排上接收資訊時,又成為接收器。

(三)、i2c匯流排上的資料傳送

下面我們看看i2c匯流排是如何進行資料傳送的。我們知道,在一根資料線上傳送資料時必須一位一位的進行,所以我們首先研究位傳送。

1、位傳輸

i2c匯流排每傳送一位資料必須有乙個時鐘脈衝。被傳送的資料在時鐘scl的高電平期間保持穩定,只有在scl低電平期間才能夠改變,示意圖如下圖所示,在標準模式下,高低電平寬度必須不小於4.7us。 

那麼是不是所有i2c匯流排中的訊號都必須符合上述的有效性呢?只有兩個例外,就是開始和停止訊號。

開始訊號當scl為高電平時,sda發生從高到低的跳變,就定義為開始訊號

停止訊號當scl為高電平時,sda發生從低到高的跳變,就定義為結束訊號。

開始和結束訊號的時序圖如下圖所示:

2.應答訊號和非應答訊號:

2、資料傳輸的位元組格式

sda傳送資料是以位元組為單位進行的。每個位元組必須是8位,但是傳輸的位元組數量不受限制,首先傳送的是資料的最高位。每次傳送乙個位元組完畢,必須接收到從機發出的乙個應答位,才能開始下乙個位元組的傳輸。如果沒有接受到應答位,主機則產生乙個停止條件結束本次的傳送。那麼從機應該發出什麼訊號算是產生了應答呢?這個過程是這樣的。當主器件傳送乙個位元組後,在第9個scl時鐘內建高sda線,而從器件的響應訊號將sda拉低,從而給出乙個應答位。

好啦,了解了i2c傳輸資料的格式,現在來研究雙方傳送的協議問題。

3、 i2c資料傳輸協議

i2c匯流排的資料傳輸協議如下:

(1)、主器件發出開始訊號

(2)、主器件發出第乙個位元組,用來選通相應的從器件。其中前7位為位址碼,第8位為方向位(r/w)。方向位為「0」表示傳送,方向位為「1」表示接受。

(3)、從機產生應答訊號,進入下乙個傳送週期,如果從器件沒有給出應答訊號,此時主器件產生乙個結束訊號使得傳送結束,傳送資料無效。

(4)、接下來主、從器件正式進行資料的傳送,這時在i2c匯流排上每次傳送的資料位元組數不限,但每乙個位元組必須為8位(傳送的時候先送高位,再送低位)。當乙個位元組傳送完畢時,從機再傳送乙個應答位(第9位),如上一條所述,這樣每次傳送乙個位元組都需要9個時鐘脈衝。資料的傳送過程如下圖所示:

(四)、24c02晶元相關介紹

at24c02是帶有i2c匯流排介面的e2prom儲存器,具有掉電記憶的功能,並且可以象普通ram一樣用程式改寫。它的容量是256個位元組(00h~0ffh),有a2、a1、a0三位位址,可見i2c匯流排上可以連線8片at24c02,它的定址位元組是1010 a2a1a0 r/w。板上面24c02的電路連線如圖所示:

我們對引腳的功能作乙個簡單的解釋:vcc,gnd:電源、地引腳

a2a1a0:位址引腳

sclk、sda:通訊引腳

wp:寫保護引腳(高電平保護)

從上面的電路連線知:a2a1a0=111,可見如果要對24c02進行寫操作,定址位元組是1010 111 0;如果對24c02進行讀操作,定址位元組是1010 111 1。用微控制器的p1.0腳作為序列時鐘線,用p1.1腳作序列資料線。

(五)、程式分析

寫過程:

(1)、主機首先發出開始訊號

(2)、發出寫24c02的定址位元組1010 111 0,即0xae

(3)、發資料寫入24c02的位址,本例中為0x01

(4)、往24c02中寫入資料,這裡是1個位元組,為0xfe

(5)、寫完畢發出停止訊號

讀過程:

(1)、主機發出開始訊號

(2)、發寫24c02的定址位元組1010 111 0

(3)、髮要讀取的資料在24c02中的位址,即0x01

(4)、主機發開始訊號

(5)、發讀24c02的定址位元組1010 1111

(5)、從24c02中讀取資料,位址為0x01

(6)、讀取完畢發出停止訊號

在這個程式中,我們把開始訊號,結束訊號、寫乙個位元組資料、讀乙個位元組資料都編制成為通用的子程式,便於在程式中隨時呼叫。傳送和接受應答位的過程放到子程式中,這樣可以使得程式結構簡化。具體的程式如下所示,希望大家認真理解。

三、實驗程式

E2PROM的I2C通訊(基於24LC01B)

起始位 時鐘線和資料線為都為高電平時空閒狀態。當時鐘線為高電平,資料線狀態由高 低時,為起始位。停止位 與起始位相反,時鐘線保持電平高狀態,資料線電平由低 高,為停止位。有效資料 起始位和停止位之間傳送資料。時鐘線低電平時,資料線可以改變,時鐘線高電平時,資料線的資料保持穩定。在此期間每個時鐘週期傳...

51I2C匯流排往E2PROM讀寫資料

main.c include include include 24c02.h char code music unsigned char data buffer 100 用於快取從24c02中讀取的資料。void main p1 0x00 到此為止,向24c02中寫入資料的過程均已結束。下面的程式為...

基於序列E2PROM掉電保護計數器的設計

本實驗是利用數碼管來顯示乙個不斷累加的兩位數,其效果如圖4 5所示 圖4 5 數碼管的顯示實驗 在這個實驗中,數碼管的讀數是經過iic匯流排,從型號為24c02c的eprom中讀取出來的,該數字每累加一次,也會把累加後的數值儲存到24c02c中,當微控制器復位或斷電時,該數值就不會丟失,當復位後或再...