新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > I2C總線(xiàn)讀寫(xiě)E2PROM

I2C總線(xiàn)讀寫(xiě)E2PROM

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏
這一篇介紹I2C存儲(chǔ)器的使用。主要是介紹AT24CXX系列器件,它分為兩類(lèi),主要是通過(guò)被存儲(chǔ)容量地址來(lái)分的,一類(lèi)是AT24C02-AT24C16,它的存儲(chǔ)容量從256字節(jié)到2048字節(jié)。另一類(lèi)是AT24C32-AT24C1024,容量從4K-128K。(理論上好像可以達(dá)到最高512K字節(jié)容量,但現(xiàn)在網(wǎng)上最高也就能看到AT24C1024也就是128K字節(jié)容量)

原理:
  I2C總線(xiàn)是一種用于IC器件之間連接的二線(xiàn)制總線(xiàn)。它通過(guò)SDA(串行數(shù)據(jù)線(xiàn))及SCL(串行時(shí)鐘線(xiàn))兩根線(xiàn)在連到總線(xiàn)上的器件之間傳送信息,并根據(jù)地址識(shí)別每個(gè)器件:不管是單片機(jī)、存儲(chǔ)器、LCD驅(qū)動(dòng)器還是鍵盤(pán)接口。
I2C總線(xiàn)接口電路結(jié)構(gòu)如圖所示。

本文引用地址:http://butianyuan.cn/article/201611/321387.htm


SDA和SCL均為雙向I/O線(xiàn),通過(guò)上拉電阻接正電源。當(dāng)總線(xiàn)空閑時(shí),兩根線(xiàn)都是高電平。連接總線(xiàn)的器件的輸出級(jí)必須是集電極或漏極開(kāi)路,以具有線(xiàn)“與”功能。I2C總線(xiàn)的數(shù)據(jù)傳送速率在標(biāo)準(zhǔn)工作方式下為100kbit/s,在快速方式下,最高傳送速率可達(dá)400kbit/s。
  在I2C總線(xiàn)技術(shù)規(guī)范中,開(kāi)始和結(jié)束信號(hào)(也稱(chēng)啟動(dòng)和停止信號(hào))的定義如圖所示。當(dāng)時(shí)鐘線(xiàn)SCL為高電平時(shí),數(shù)據(jù)線(xiàn)SDA由高電平跳變?yōu)榈碗娖蕉x為“開(kāi)始”信號(hào);當(dāng)SCL線(xiàn)為高電平時(shí),SDA線(xiàn)發(fā)生低電平到高電平的跳變?yōu)?ldquo;結(jié)束”信號(hào)。開(kāi)始和結(jié)束信號(hào)都是由主器件產(chǎn)生。在開(kāi)始信號(hào)以后,總線(xiàn)即被認(rèn)為處于忙狀態(tài);在結(jié)束信號(hào)以后的一段時(shí)間內(nèi),總線(xiàn)被認(rèn)為是空閑的。

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

  當(dāng)主器件發(fā)送完一個(gè)字節(jié)的數(shù)據(jù)后,接著發(fā)出對(duì)應(yīng)于SCL線(xiàn)上的一個(gè)時(shí)鐘(ACK)認(rèn)可位,在此時(shí)鐘內(nèi)主器件釋放SDA線(xiàn),一個(gè)字節(jié)傳送結(jié)束,而從器件的響應(yīng)信號(hào)將SDA線(xiàn)拉成低電平,使SDA在該時(shí)鐘的高電平期間為穩(wěn)定的低電平。從器件的響應(yīng)信號(hào)結(jié)束后,SDA線(xiàn)返回高電平,進(jìn)入下一個(gè)傳送周期。
  I2C總線(xiàn)還具有廣播呼叫地址用于尋址總線(xiàn)上所有器件的功能。若一個(gè)器件不需要廣播呼叫尋址中所提供的任何數(shù)據(jù),則可以忽略該地址不作響應(yīng)。如果該器件需要廣播呼叫尋址中提供的數(shù)據(jù),則應(yīng)對(duì)地址作出響應(yīng),其表現(xiàn)為一個(gè)接收器。
  5.總線(xiàn)競(jìng)爭(zhēng)的仲裁 總線(xiàn)上可能掛接有多個(gè)器件,有時(shí)會(huì)發(fā)生兩個(gè)或多個(gè)主器件同時(shí)想占用總線(xiàn)的情況。例如,多單片機(jī)系統(tǒng)中,可能在某一時(shí)刻有兩個(gè)單片機(jī)要同時(shí)向總線(xiàn)發(fā)送數(shù)據(jù),這種情況叫做總線(xiàn)競(jìng)爭(zhēng)。I2C總線(xiàn)具有多主控能力,可以對(duì)發(fā)生在SDA線(xiàn)上的總線(xiàn)競(jìng)爭(zhēng)進(jìn)行仲裁,其仲裁原則是這樣的:當(dāng)多個(gè)主器件同時(shí)想占用總線(xiàn)時(shí),如果某個(gè)主器件發(fā)送高電平,而另一個(gè)主器件發(fā)送低電平,則發(fā)送電平與此時(shí)SDA總線(xiàn)電平不符的那個(gè)器件將自動(dòng)關(guān)閉其輸出級(jí)??偩€(xiàn)競(jìng)爭(zhēng)的仲裁是在兩個(gè)層次上進(jìn)行的。首先是地址位的比較,如果主器件尋址同一個(gè)從器件,則進(jìn)入數(shù)據(jù)位的比較,從而確保了競(jìng)爭(zhēng)仲裁的可靠性。由于是利用I2C總線(xiàn)上的信息進(jìn)行仲裁,因此不會(huì)造成信息的丟失。

器件說(shuō)明:
AT24CXXX系列引腳圖如下

現(xiàn)在我先來(lái)說(shuō)說(shuō)AT24CXX的具體使用
假設(shè)用AT89S51的P0.0做SDA總線(xiàn),P0.1做SCL總線(xiàn)。有若干個(gè)I2C器件掛接在SDA和SCL總線(xiàn)上。
現(xiàn)在要對(duì)E2PROM_01存儲(chǔ)器進(jìn)行寫(xiě)字節(jié)操作看看它是如何找到的。
上面說(shuō)過(guò)在發(fā)送完一個(gè)開(kāi)始信號(hào)后接著發(fā)送一個(gè)字節(jié)的器件識(shí)別信號(hào)。這一個(gè)字節(jié)的4-7位就是器件識(shí)別碼。1010就是對(duì)應(yīng)E2PROM器件,其它器件就不再理會(huì)了。1-3位是器件的物理地址,也就是說(shuō)如果是E2PROM,它可以在I2C總線(xiàn)上掛接(000-111)8個(gè)E2PROM。在這里就得詳細(xì)說(shuō)說(shuō)AT24CXX上的A0,A1,A2和這個(gè)器件識(shí)別字節(jié)之間的關(guān)系了。上面說(shuō)過(guò)存儲(chǔ)器的尋址范圍是一個(gè)字節(jié),也就256個(gè),AT24C02的存儲(chǔ)容量為256字字,剛剛好將一個(gè)字節(jié)的地址用完。器件電路上A0,A1,A2三個(gè)管腳通過(guò)接高電平或低電平來(lái)和AT89S51發(fā)送過(guò)來(lái)的器件識(shí)別控制字節(jié)相匹配,從而得以識(shí)別出AT89S51將要操作的那個(gè)存儲(chǔ)器?,F(xiàn)在AT24C04的容量是512個(gè)字節(jié),那不是一個(gè)字節(jié)的地址不夠用了嗎?其實(shí)它是將512個(gè)字節(jié)為成兩個(gè)頁(yè),每頁(yè)256字節(jié),而頁(yè)地址就是器件識(shí)別控制字節(jié)的1位。前面說(shuō)了這個(gè)1-3位不是和器件上的A0,A1,A2匹配來(lái)識(shí)別器件的嗎?是的,但存儲(chǔ)器容量超過(guò)256字節(jié)情況就有變了。AT24C04上的A0這時(shí)就廢棄不用了,只用A1和A2,這樣就只能接(00-11)四個(gè)AT24C04了,同樣AT24C08容量為1K字節(jié)分為4頁(yè)了,于是頁(yè)地址就是器件識(shí)別控制字節(jié)的1-2位,器件上的A0,A1廢棄不用,只用A2,就只能接兩個(gè)AT24C08了。AT24C16容量為2K字節(jié),分為8頁(yè)。頁(yè)地址是器件識(shí)別控制字節(jié)的1-3位,全用了。器件上的A0,A1,A2,就無(wú)效了,只能接一只AT24C16。


我這么說(shuō)能明白嗎?

  對(duì)于大容量AT24C32-1024的存儲(chǔ)器。器件的存儲(chǔ)尋址地址為兩個(gè)字節(jié),所以它的一頁(yè)為65536(64K)。AT24C32-64的容量為4K字節(jié)-8K字節(jié),在一頁(yè)范圍,可以接8只器件。從AT24C128-1024的器件代號(hào)也由1010改為10100,多了一位,識(shí)別控制字節(jié)的器件物理地址就少了一位,變?yōu)?-2位,相應(yīng)的在器件管腳上A2也廢棄空著了,因此最多只能接四只器件。AT24C128-512只有兩位器件地址所以最多只能接四只器件。而AT24C1024的容量為128K,分為兩頁(yè),識(shí)別控制字節(jié)的的1位為頁(yè)地址,器件的A0腳廢棄不用,只用了A1。因此只能接2只器件。


 下面我們進(jìn)行具體的制做先準(zhǔn)備好器件如下圖 ,我用的是AT24C16

原先的板子如下圖

焊好后。

好!下面我們進(jìn)行調(diào)試:插上主電源。但AT24C16的電源短路帽不接,在短路帽兩個(gè)針之間接上萬(wàn)用表的電流檔檢查是否有短路和靜態(tài)電流的大小。實(shí)測(cè)靜態(tài)電流幾乎為零,改變兩個(gè)數(shù)據(jù)線(xiàn)的電平時(shí),電流會(huì)有所上升,說(shuō)明電路基本正常。

現(xiàn)在我們接上電源短路帽把AT24C16電源接好。將兩個(gè)數(shù)據(jù)線(xiàn)用跳線(xiàn)接到P1.6和P1.7口上(接到哪個(gè)口上可以自己選的)。注意分清哪個(gè)是SDA哪個(gè)是SCL。別弄錯(cuò)了。


把LCD12864裝上,后面我們就要進(jìn)行軟件的調(diào)試了。




評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉