1、I2C總線基本介紹編程
I2C總線是PHLIPS公司推出的一種串行總線,是具有多主機系統所需的包括總線裁決和高低速器件同步功能的高性能串行總線。在多主機系統中,可能同時有幾個主機企圖啓動總線傳送數據。爲了不混亂,I2C總線要經過總線仲裁,以決定由哪一臺主機控制總線。性能
I2C 標準速率爲 100kbit/s,快速模式 400kbit/s, 每一個電路和模塊都有惟一的地址。編碼
I2C總線只有兩根雙向信號線。一根是數據線SDA(不管是數據信息仍是地址信息都通過這根線傳輸),另外一根是時鐘線SCL。spa
I2C總線經過上拉電阻接正電源。所以,當總線空閒時,兩根線均爲高電平(這也就是後面在寫I2C協議時,當主機從EEPROM讀取完最後一個字節的數據,在給EEPROM發送非應答信號(高電平)時,沒有在程序中寫SDL高電平的緣由)。連到總線上的任一器件輸出的低電平,都將使總線的信號變低,即各器件的SDA及SCL都是線「與」關係。每一個接到I2C總線上的器件都有惟一的地址。數據的傳輸也能夠是雙向的。指針
2、I2C總線通訊協議同步
(一)時序it
只有在總線處於「非忙」狀態時,數據傳輸才能被初始化。在數據傳輸期間,只要時鐘線爲高電平,數據線都必須保持穩定,不然數據線上的任何變化都被看成「啓動」或「中止」信號。圖 1 是被定義的總線狀態。class
① 總線非忙狀態(A 段) 程序
數據線SDA 和 時鐘線 SCL 都保持高電平。 im
② 啓動數據傳輸(B 段)
當時鍾線(SCL)爲高電平狀態時,數據線(SDA)由高電平變爲低電平的降低沿被認爲是「啓動」信號。只有出現「啓動」信號後,其它的命令纔有效。
③ 中止數據傳輸(C 段)
當時鍾線(SCL)爲高電平狀態時,數據線(SDA)由低電平變爲高電平的上升沿被認爲是「中止」信號。隨着「停在」信號出現,全部的外部操做都結束。
④ 數據有效(D 段)
在出現「啓動」信號之後,在時鐘線(SCL)爲高電平狀態時數據線是穩定的,這時數據線的狀態就要傳送的數據。數據線(SDA)上的數據的改變必須在時鐘線爲低電平期間完成,每位數據佔用一個時鐘脈衝。
⑤ 應答信號 (ACK和NACK)
I2C總線上的全部數據都是以8位字節傳送,發送器每發送一個字節,就在時鐘脈衝9期間釋放數據線,由接收器反饋一個應答信號。應答信號爲低電平時,規定爲有效應答位(ACK),表示接收器已經成功接收了該字節;應答信號爲高電平時,規定爲非應答位(NACK),通常表示接收器接收該字節沒有成功。可是當接收器是主控器(好比單片機對EEPROM進行讀操做,則單片機即爲接收器),則它在收到最後一個字節後,也會發送一個NACK信號(並非說沒有成功),以通知被控發送器結束數據發送,並釋放SDA總線,以便主控器發送一箇中止信號。
以EEPROM爲例:每一個正在接收數據的EEPROM 在接到一個字節的數據後,一般須要發出一個應答信號(由主機接收)。而每一個正在發送數據的EEPROM 在發出一個字節的數據後,一般須要接收一個應答信號(由主機發出)。EEPROM 讀寫控制器必須產生一個與這個應答位相聯繫的額外的時鐘脈衝。在EEPROM 的讀操做中,EEPROM 讀寫控制器對EEPROM 完成的最後一個字節不產生應答位(高電平),可是應該給EEPROM 一個結束信號。
(二)數據幀格式
I2C總線上傳送的數據信號是廣義的,既包括地址信號,又包括正真的數據信號。
I2C總線上的全部數據都是以8位字節傳送。在起始信號後必須傳送一個從機的地址(7位),第8位是數據的傳送方向爲(R/W),用0表示主機寫(發送),用1表示主機讀(接收)。每次數據傳送老是由主機產生的終止信號結束。可是,若主機但願繼續佔用總線進行新的數據傳送,則能夠不產生終止信號,立刻再次發出起始信號對另外一從機進行尋址。
(三)總線的尋址
I2C總線協議有明確的規定:採用7位的尋址字節(尋址字節是起始信號後的第一個字節)。
尋址字節的定義:D7~D1位組成從機的地址。D0位是數據傳送的方向位。
當主機發送地址時,總線上的每一個從機都將這7位地址碼與本身的地址進行比較,若是相同,則認爲本身正被主機尋址,根據R/T位將本身肯定爲發送器或接收器。
從機的地址由固定部分和可編程部分組成。在一個系統中可能但願接入多個相同的從機(固定部分相同),從機地址中可編程部分決定了可接入總線該類器件的最大數目。如一個從機的7位尋址位有4位是固定位,3位是可編程位,這時僅能尋址8個一樣的器件,便可以有8個一樣的器件接入到該I2C總線系統中。
3、I2C總線的應用舉例
(一)I2C 設備讀寫操做的種類
在這裏以 AT24C04 爲例說明 I2C 讀寫的基本操做和時序,I2C 設備的操做可分爲寫單個
存儲字節,寫多個存儲字節,讀單個存儲字節和讀多個存儲字節。各個操做以下圖所示。
其中:
Device Address:從機地址=4位固定位+3位可編程位
Word Address:將要讀或寫的存儲單元的首地址(如果讀/寫多個存儲字節,每讀/寫完一個字節的數據,這個地址會自動加1)
(二)單個存儲字節的讀寫操做具體過程舉例
① EEPROM 的寫操做(字節編程方式)
所謂EEPROM 的寫操做(字節編程方式)就是經過讀寫控制器把一個字節數據發送到EEPROM 中指定地址的存儲單元。其過程以下:EEPROM 讀寫控制器發出「啓動」信號後,緊跟着發送4 位I2C 總線器件特徵編碼1010 和3 位EEPROM 芯片地址/頁地址XXX 以及寫狀態的R/W 位(=0)到總線上,而後等待EEPROM 發出應答信號;若接收到應答,讀寫控制器將跟着發送1 個字節的EEPROM 存儲單元地址,而後等待EEPROM 再一次發出應答信號;若再次接收到應答則繼續寫入1 個字節數據到被尋址的存儲單元,以後EEPROM 再一次發出應答信號;讀寫控制器收到此應答信號後,便產生「中止」信號。字節寫入幀格式如圖2 所示:
② 二線制I2C CMOS 串行EEPROM 的讀操做
所謂EEPROM 的讀操做即經過讀寫控制器讀取 EEPROM 中指定地址的存儲單元中的一個字節數據。串行EEPROM 的讀操做分兩步進行:讀寫器首先發送一個「啓動」信號和控制字節(包括頁面地址和寫控制位R/W = 0)到EEPROM,再經過寫操做設置EEPROM 存儲單元地址(注意:雖然這是讀操做,但須要先寫入地址指針的值),在此期間EEPROM 會產生必要的應答位。接着讀寫器從新發送另外一個「啓動」信號和控制字節(包括頁面地址和讀控制位R/W = 1),EEPROM 收到後發出應答信號,而後,要尋址存儲單元的數據就從SDA 線上輸出。讀操做有三種: 讀當前地址存儲單元的數據、讀指定地址存儲單元的數據、讀連續存儲單元的數據。在這裏只介紹讀指定地址存儲單元數據的操做。讀指定地址存儲單元數據的幀格式如圖3: