I2C總線讀寫E2PROM
原理:
I2C總線是一種用于IC器件之間連接的二線制總線。它通過SDA(串行數據線)及SCL(串行時鐘線)兩根線在連到總線上的器件之間傳送信息,并根據地址識別每個器件:不管是單片機、存儲器、LCD驅動器還是鍵盤接口。
I2C總線接口電路結構如圖所示。

SDA和SCL均為雙向I/O線,通過上拉電阻接正電源。當總線空閑時,兩根線都是高電平。連接總線的器件的輸出級必須是集電極或漏極開路,以具有線“與”功能。I2C總線的數據傳送速率在標準工作方式下為100kbit/s,在快速方式下,最高傳送速率可達400kbit/s。
在I2C總線技術規范中,開始和結束信號(也稱啟動和停止信號)的定義如圖所示。當時鐘線SCL為高電平時,數據線SDA由高電平跳變為低電平定義為“開始”信號;當SCL線為高電平時,SDA線發生低電平到高電平的跳變為“結束”信號。開始和結束信號都是由主器件產生。在開始信號以后,總線即被認為處于忙狀態;在結束信號以后的一段時間內,總線被認為是空閑的。

I2C總線的數據傳送格式是:在I2C總線開始信號后,送出的第一個字節數據是用來選擇從器件地址的,其中4-7位為器件碼,如1010就是代表串行E2PROM器件。1-3位為存儲器的片選地址或存儲器內的塊地址碼,如何區分?后面再做詳細說明,第8位為方向位(R/W)。方向位為“0”表示發送,即主器件把信息寫到所選擇的從器件;方向位為“1”表示主器件將從從器件讀信息。開始信號后,系統中的各個器件將自己的地址和主器件送到總線上的地址進行比較,如果與主器件發送到總線上的地址一致,則該器件即為被主器件尋址的器件,其接收信息還是發送信息則由第8位(R/W)確定。
一個字節的寫操作的過程:首先器件發出起始信號后,發送器件識別控制字節,即1010A2A1A00(最低位置0,即R/W讀寫控制位為低電平0),然后等待應答信號指示從器件被尋址。再發送一個AT24CXX存儲器將要寫入的位置地址。再次等待AT24CXX應答信號以后,將發送數據字節,AT24CXX接收到后寫入到剛剛指定的存儲器地址。然后主器件再次等待AT24CXX的應答信號。主器件最后發出停止信號。
在I2C總線上每次傳送的數據字節數不限,但每一個字節必須為8位,而且每個傳送的字節后面必須跟一個認可位(第9位),也叫應答位(ACK)。數據的傳送過程如圖所示。每次都是先傳最高位,通常從器件在接收到每個字節后都會作出響應,即釋放SCL線返回高電平,準備接收下一個數據字節,主器件可繼續傳送。如果從器件正在處理一個實時事件而不能接收數據時,(例如正在處理一個內部中斷,在這個中斷處理完之前就不能接收I2C總線上的數據字節)可以使時鐘SCL線保持低電平,從器件必須使SDA保持高電平,此時主器件產生1個結束信號,使傳送異常結束,迫使主器件處于等待狀態。當從器件處理完畢時將釋放SCL線,主器件繼續傳送。

當主器件發送完一個字節的數據后,接著發出對應于SCL線上的一個時鐘(ACK)認可位,在此時鐘內主器件釋放SDA線,一個字節傳送結束,而從器件的響應信號將SDA線拉成低電平,使SDA在該時鐘的高電平期間為穩定的低電平。從器件的響應信號結束后,SDA線返回高電平,進入下一個傳送周期。
I2C總線還具有廣播呼叫地址用于尋址總線上所有器件的功能。若一個器件不需要廣播呼叫尋址中所提供的任何數據,則可以忽略該地址不作響應。如果該器件需要廣播呼叫尋址中提供的數據,則應對地址作出響應,其表現為一個接收器。
5.總線競爭的仲裁 總線上可能掛接有多個器件,有時會發生兩個或多個主器件同時想占用總線的情況。例如,多單片機系統中,可能在某一時刻有兩個單片機要同時向總線發送數據,這種情況叫做總線競爭。I2C總線具有多主控能力,可以對發生在SDA線上的總線競爭進行仲裁,其仲裁原則是這樣的:當多個主器件同時想占用總線時,如果某個主器件發送高電平,而另一個主器件發送低電平,則發送電平與此時SDA總線電平不符的那個器件將自動關閉其輸出級。總線競爭的仲裁是在兩個層次上進行的。首先是地址位的比較,如果主器件尋址同一個從器件,則進入數據位的比較,從而確保了競爭仲裁的可靠性。由于是利用I2C總線上的信息進行仲裁,因此不會造成信息的丟失。
器件說明:
AT24CXXX系列引腳圖如下
現在我先來說說AT24CXX的具體使用
現在要對E2PROM_01存儲器進行寫字節操作看看它是如何找到的。
上面說過在發送完一個開始信號后接著發送一個字節的器件識別信號。這一個字節的4-7位就是器件識別碼。1010就是對應E2PROM器件,其它器件就不再理會了。1-3位是器件的物理地址,也就是說如果是E2PROM,它可以在I2C總線上掛接(000-111)8個E2PROM。在這里就得詳細說說AT24CXX上的A0,A1,A2和這個器件識別字節之間的關系了。上面說過存儲器的尋址范圍是一個字節,也就256個,AT24C02的存儲容量為256字字,剛剛好將一個字節的地址用完。器件電路上A0,A1,A2三個管腳通過接高電平或低電平來和AT89S51發送過來的器件識別控制字節相匹配,從而得以識別出AT89S51將要操作的那個存儲器。現在AT24C04的容量是512個字節,那不是一個字節的地址不夠用了嗎?其實它是將512個字節為成兩個頁,每頁256字節,而頁地址就是器件識別控制字節的1位。前面說了這個1-3位不是和器件上的A0,A1,A2匹配來識別器件的嗎?是的,但存儲器容量超過256字節情況就有變了。AT24C04上的A0這時就廢棄不用了,只用A1和A2,這樣就只能接(00-11)四個AT24C04了,同樣AT24C08容量為1K字節分為4頁了,于是頁地址就是器件識別控制字節的1-2位,器件上的A0,A1廢棄不用,只用A2,就只能接兩個AT24C08了。AT24C16容量為2K字節,分為8頁。頁地址是器件識別控制字節的1-3位,全用了。器件上的A0,A1,A2,就無效了,只能接一只AT24C16。

我這么說能明白嗎?
對于大容量AT24C32-1024的存儲器。器件的存儲尋址地址為兩個字節,所以它的一頁為65536(64K)。AT24C32-64的容量為4K字節-8K字節,在一頁范圍,可以接8只器件。從AT24C128-1024的器件代號也由1010改為10100,多了一位,識別控制字節的器件物理地址就少了一位,變為1-2位,相應的在器件管腳上A2也廢棄空著了,因此最多只能接四只器件。AT24C128-512只有兩位器件地址所以最多只能接四只器件。而AT24C1024的容量為128K,分為兩頁,識別控制字節的的1位為頁地址,器件的A0腳廢棄不用,只用了A1。因此只能接2只器件。
原先的板子如下圖

焊好后。
好!下面我們進行調試:插上主電源。但AT24C16的電源短路帽不接,在短路帽兩個針之間接上萬用表的電流檔檢查是否有短路和靜態電流的大小。實測靜態電流幾乎為零,改變兩個數據線的電平時,電流會有所上升,說明電路基本正常。
現在我們接上電源短路帽把AT24C16電源接好。將兩個數據線用跳線接到P1.6和P1.7口上(接到哪個口上可以自己選的)。注意分清哪個是SDA哪個是SCL。別弄錯了。

把LCD12864裝上,后面我們就要進行軟件的調試了。
評論