(1)概述

I2C(Inter-Integrated Circuit BUS) 積體電路匯流排,該匯流排由NXP(原PHILIPS)公司設計,多用於主控制器和從器件間的主從通訊,在小資料量場合使用,傳輸距離短,任意時刻只能有一個主機等特性。

經常IIC和SPI介面被認為指定是一種硬體裝置,但其實這樣的說法是不盡準確的,嚴格的說他們都是人們所定義的軟硬結合體,分為物理層(四線結構)和協議層(主機,從機,時鐘極性,時鐘相位)。

IIC,SPI的區別不僅在與物理層,IIC比SPI有著一套更為複雜的協議層定義。下面來分別說明一下IIC的物理層和協議層。

(2)IIC的物理層

a.只要求兩條匯流排線路,一條是序列資料線SDA,一條是序列時鐘線SCL。(IIC是半雙工,而不是全雙工)。

b.每個連線到匯流排的器件都可以通過唯一的地址和其它器件通訊,主機/從機角色和地址可配置,主機可以作為主機發送器和主機接收器。

c.IIC是真正的多主機匯流排,(而這個SPI在每次通訊前都需要把主機定死,而IIC可以在通訊過程中,改變主機),如果兩個或更多的主機同時請求匯流排,可以通過沖突檢測和仲裁防止匯流排資料被破壞。

d.傳輸速率在標準模式下可以達到100kb/s,快速模式下可以達到400kb/s。

e.連線到匯流排的IC數量只是受到匯流排的最大負載電容400pf限制。

一個典型的IIC介面如下圖(1)所示

圖(1)

(3)IIC的協議層

IIC的協議層才是掌握IIC的關鍵。現在簡單概括如下:

  a.資料的有效性

  在時鐘的高電平週期內,SDA線上的資料必須保持穩定,資料線僅可以在時鐘SCL為低電平時改變。

  如圖(2)所示:  

  

圖(2)

  b.起始和結束條件

  起始條件:當SCL為高電平的時候,SDA線上由高到低的跳變被定義為起始條件,結束條件:當SCL為高電平的時候,SDA線上由低到高的跳變被定義為停止條件,要注意起始和終止訊號都是由主機發出的,連線到I2C總線上的器件,若具有I2C匯流排的硬體介面,則很容易檢測到起始和終止訊號。匯流排在起始條件之後,視為忙狀態,在停止條件之後被視為空閒狀態,對起始條件和結束條件的描述如下圖(3)所示。

圖(3)

  c.應答

  每當主機向從機發送完一個位元組的資料,主機總是需要等待從機給出一個應答訊號,以確認從機是否成功接收到了資料,從機應答主機所需要的時鐘仍是主機提供的,應答出現在每一次主機完成8個數據位傳輸後緊跟著的時鐘週期,低電平0表示應答,1表示非應答,如圖(4)所示。


圖(4)

  d.資料幀格式

  I2C總線上傳送的資料訊號是廣義的,既包括地址訊號,又包括真正的資料訊號。

  在起始訊號後必須傳送一個從機的地址(7位),第8位是資料的傳送方向位(R/T),用“0”表示主機發送資料(T),“1”表示主機接收資料(R)。{這裡小編在驅動MPU6050模組的時候,就犯過這樣的錯誤,它寫的MPU6050從機地址是0x68,因為傳送從機地址的時候,要加一位讀寫方向位,因為剛開始應該是向這個MPU6050裡寫從機裡某個暫存器的地址,所以應該是7位地址   0x68(1101000)+二進位制位0=11010000)也就是0xD0,表示要向該IIC裝置裡寫東西,然後再緊接著寫入IIC裝置裡的暫存器地址,而我直接寫入了0x68,導致出錯},每次資料傳送總是由主機產生的終止訊號結束。但是,若主機希望繼續佔用匯流排進行新的資料傳送,則可以不產生終止訊號,馬上再次發出起始訊號對另一從機進行定址。
在匯流排的一次資料傳輸過程中,可以有以下幾種組合方式:
[1]

主機向從機發送資料,資料傳送方向在整個傳送過程中不變:
注:有陰影部分表示資料由主機向從機傳送,無陰影部分則表示資料由從機向主機傳送。
    A表示應答(低電平), A非表示非應答(高電平)。S表示起始訊號,P表示終止訊號。
[2]主機在第一個位元組後,立即從從機讀資料:

[3]在傳送過程中,當需要改變傳送方向時,起始訊號和從機地址都被重複產生一次,但兩次讀/寫方向位正好反相:

一般情況下,[3]是比較常見的,比如MPU6050模組,

傳送起始訊號
等待從機應答
寫一個從機地址+0(表示寫),
等待從機應答
傳送一個位元組的MPU6050加速度儲存暫存器地址,
等待從機應答
再發送一次起始訊號
等待從機應答
寫一個從機地址+1(表示讀)
等待從機應答
讀取MPU6050感測器資料
主機非應答