這一篇介紹I2C存儲器的使用。主要是介紹AT24CXX系列器件,它分為兩類,主要是通過被存儲容量地址來分的,一類是AT24C02-AT24C16,它的存儲容量從256字節(jié)到2048字節(jié)。另一類是AT24C32-AT24C1024,容量從4K-128K。(理論上好像可以達到最高512K字節(jié)容量,但現(xiàn)在網(wǎng)上最高也就能看到AT24C1024也就是128K字節(jié)容量)
原理:
I2C總線是一種用于IC器件之間連接的二線制總線。它通過SDA(串行數(shù)據(jù)線)及SCL(串行時鐘線)兩根線在連到總線上的器件之間傳送信息,并根據(jù)地址識別每個器件:不管是單片機、存儲器、LCD驅(qū)動器還是鍵盤接口。
I2C總線接口電路結(jié)構(gòu)如圖所示。
SDA和SCL均為雙向I/O線,通過上拉電阻接正電源。當總線空閑時,兩根線都是高電平。連接總線的器件的輸出級必須是集電極或漏極開路,以具有線“與”功能。I2C總線的數(shù)據(jù)傳送速率在標準工作方式下為100kbit/s,在快速方式下,最高傳送速率可達400kbit/s。
在I2C總線技術(shù)規(guī)范中,開始和結(jié)束信號(也稱啟動和停止信號)的定義如圖所示。當時鐘線SCL為高電平時,數(shù)據(jù)線SDA由高電平跳變?yōu)榈碗娖蕉x為“開始”信號;當SCL線為高電平時,SDA線發(fā)生低電平到高電平的跳變?yōu)椤敖Y(jié)束”信號。開始和結(jié)束信號都是由主器件產(chǎn)生。在開始信號以后,總線即被認為處于忙狀態(tài);在結(jié)束信號以后的一段時間內(nèi),總線被認為是空閑的。
I2C總線的數(shù)據(jù)傳送格式是:在I2C總線開始信號后,送出的第一個字節(jié)數(shù)據(jù)是用來選擇從器件地址的,其中4-7位為器件碼,如1010就是代表串行E2PROM器件。1-3位為存儲器的片選地址或存儲器內(nèi)的塊地址碼,如何區(qū)分?后面再做詳細說明,第8位為方向位(R/W)。方向位為“0”表示發(fā)送,即主器件把信息寫到所選擇的從器件;方向位為“1”表示主器件將從從器件讀信息。開始信號后,系統(tǒng)中的各個器件將自己的地址和主器件送到總線上的地址進行比較,如果與主器件發(fā)送到總線上的地址一致,則該器件即為被主器件尋址的器件,其接收信息還是發(fā)送信息則由第8位(R/W)確定。
一個字節(jié)的寫操作的過程:首先器件發(fā)出起始信號后,發(fā)送器件識別控制字節(jié),即1010A2A1A00(最低位置0,即R/W讀寫控制位為低電平0),然后等待應答信號指示從器件被尋址。再發(fā)送一個AT24CXX存儲器將要寫入的位置地址。再次等待AT24CXX應答信號以后,將發(fā)送數(shù)據(jù)字節(jié),AT24CXX接收到后寫入到剛剛指定的存儲器地址。然后主器件再次等待AT24CXX的應答信號。主器件最后發(fā)出停止信號。
在I2C總線上每次傳送的數(shù)據(jù)字節(jié)數(shù)不限,但每一個字節(jié)必須為8位,而且每個傳送的字節(jié)后面必須跟一個認可位(第9位),也叫應答位(ACK)。數(shù)據(jù)的傳送過程如圖所示。每次都是先傳最高位,通常從器件在接收到每個字節(jié)后都會作出響應,即釋放SCL線返回高電平,準備接收下一個數(shù)據(jù)字節(jié),主器件可繼續(xù)傳送。如果從器件正在處理一個實時事件而不能接收數(shù)據(jù)時,(例如正在處理一個內(nèi)部中斷,在這個中斷處理完之前就不能接收I2C總線上的數(shù)據(jù)字節(jié))可以使時鐘SCL線保持低電平,從器件必須使SDA保持高電平,此時主器件產(chǎn)生1個結(jié)束信號,使傳送異常結(jié)束,迫使主器件處于等待狀態(tài)。當從器件處理完畢時將釋放SCL線,主器件繼續(xù)傳送。
當主器件發(fā)送完一個字節(jié)的數(shù)據(jù)后,接著發(fā)出對應于SCL線上的一個時鐘(ACK)認可位,在此時鐘內(nèi)主器件釋放SDA線,一個字節(jié)傳送結(jié)束,而從器件的響應信號將SDA線拉成低電平,使SDA在該時鐘的高電平期間為穩(wěn)定的低電平。從器件的響應信號結(jié)束后,SDA線返回高電平,進入下一個傳送周期。
I2C總線還具有廣播呼叫地址用于尋址總線上所有器件的功能。若一個器件不需要廣播呼叫尋址中所提供的任何數(shù)據(jù),則可以忽略該地址不作響應。如果該器件需要廣播呼叫尋址中提供的數(shù)據(jù),則應對地址作出響應,其表現(xiàn)為一個接收器。
5.總線競爭的仲裁 總線上可能掛接有多個器件,有時會發(fā)生兩個或多個主器件同時想占用總線的情況。例如,多單片機系統(tǒng)中,可能在某一時刻有兩個單片機要同時向總線發(fā)送數(shù)據(jù),這種情況叫做總線競爭。I2C總線具有多主控能力,可以對發(fā)生在SDA線上的總線競爭進行仲裁,其仲裁原則是這樣的:當多個主器件同時想占用總線時,如果某個主器件發(fā)送高電平,而另一個主器件發(fā)送低電平,則發(fā)送電平與此時SDA總線電平不符的那個器件將自動關閉其輸出級。總線競爭的仲裁是在兩個層次上進行的。首先是地址位的比較,如果主器件尋址同一個從器件,則進入數(shù)據(jù)位的比較,從而確保了競爭仲裁的可靠性。由于是利用I2C總線上的信息進行仲裁,因此不會造成信息的丟失。
器件說明:
AT24CXXX系列引腳圖如下
現(xiàn)在我先來說說AT24CXX的具體使用
假設用AT89S51的P0.0做SDA總線,P0.1做SCL總線。有若干個I2C器件掛接在SDA和SCL總線上。
現(xiàn)在要對E2PROM_01存儲器進行寫字節(jié)操作看看它是如何找到的。
上面說過在發(fā)送完一個開始信號后接著發(fā)送一個字節(jié)的器件識別信號。這一個字節(jié)的4-7位就是器件識別碼。1010就是對應E2PROM器件,其它器件就不再理會了。1-3位是器件的物理地址,也就是說如果是E2PROM,它可以在I2C總線上掛接(000-111)8個E2PROM。在這里就得詳細說說AT24CXX上的A0,A1,A2和這個器件識別字節(jié)之間的關系了。上面說過存儲器的尋址范圍是一個字節(jié),也就256個,AT24C02的存儲容量為256字字,剛剛好將一個字節(jié)的地址用完。器件電路上A0,A1,A2三個管腳通過接高電平或低電平來和AT89S51發(fā)送過來的器件識別控制字節(jié)相匹配,從而得以識別出AT89S51將要操作的那個存儲器。現(xiàn)在AT24C04的容量是512個字節(jié),那不是一個字節(jié)的地址不夠用了嗎?其實它是將512個字節(jié)為成兩個頁,每頁256字節(jié),而頁地址就是器件識別控制字節(jié)的1位。前面說了這個1-3位不是和器件上的A0,A1,A2匹配來識別器件的嗎?是的,但存儲器容量超過256字節(jié)情況就有變了。AT24C04上的A0這時就廢棄不用了,只用A1和A2,這樣就只能接(00-11)四個AT24C04了,同樣AT24C08容量為1K字節(jié)分為4頁了,于是頁地址就是器件識別控制字節(jié)的1-2位,器件上的A0,A1廢棄不用,只用A2,就只能接兩個AT24C08了。AT24C16容量為2K字節(jié),分為8頁。頁地址是器件識別控制字節(jié)的1-3位,全用了。器件上的A0,A1,A2,就無效了,只能接一只AT24C16。
我這么說能明白嗎?
對于大容量AT24C32-1024的存儲器。器件的存儲尋址地址為兩個字節(jié),所以它的一頁為65536(64K)。AT24C32-64的容量為4K字節(jié)-8K字節(jié),在一頁范圍,可以接8只器件。從AT24C128-1024的器件代號也由1010改為10100,多了一位,識別控制字節(jié)的器件物理地址就少了一位,變?yōu)?-2位,相應的在器件管腳上A2也廢棄空著了,因此最多只能接四只器件。AT24C128-512只有兩位器件地址所以最多只能接四只器件。而AT24C1024的容量為128K,分為兩頁,識別控制字節(jié)的的1位為頁地址,器件的A0腳廢棄不用,只用了A1。因此只能接2只器件。
下面我們進行具體的制做先準備好器件如下圖 ,我用的是AT24C16
原先的板子如下圖
焊好后。
好!下面我們進行調(diào)試:插上主電源。但AT24C16的電源短路帽不接,在短路帽兩個針之間接上萬用表的電流檔檢查是否有短路和靜態(tài)電流的大小。實測靜態(tài)電流幾乎為零,改變兩個數(shù)據(jù)線的電平時,電流會有所上升,說明電路基本正常。
現(xiàn)在我們接上電源短路帽把AT24C16電源接好。將兩個數(shù)據(jù)線用跳線接到P1.6和P1.7口上(接到哪個口上可以自己選的)。注意分清哪個是SDA哪個是SCL。別弄錯了。
把LCD12864裝上,后面我們就要進行軟件的調(diào)試了。
責任編輯;zl
評論
查看更多