1. 程式人生 > >android底層驅動學習之I2C概述及工作原理(一)

android底層驅動學習之I2C概述及工作原理(一)

1.概述:

I²C 是Inter-Integrated Circuit的縮寫,發音為"eye-squaredcee" or "eye-two-cee" , 它是一種兩線介面。

I²C 只是用兩條雙向的線,一條 Serial Data Line (SDA) ,另一條Serial Clock (SCL)。

SCL:上升沿將資料輸入到每個EEPROM器件中;下降沿驅動EEPROM器件輸出資料。(邊沿觸發)

SDA:雙向資料線,為OD門,與其它任意數量的OD與OC門成"線與"關係。

主從裝置關係:二者都可以傳輸資料,但是從裝置不能發起傳輸,且傳輸是受到主裝置控制的。
一、協議 


1.空閒狀態 


 I2C匯流排匯流排的SDA和SCL兩條訊號線同時處於高電平時,規定為匯流排的空閒狀態。此時各個器件的輸出級場效電晶體均處在截止狀態,即釋放匯流排,由兩條訊號線各自的上拉電阻把電平拉高。 

2.起始位與停止位的定義:
  • 起始訊號:當SCL為高期間,SDA由高到低的跳變;啟動訊號是一種電平跳變時序訊號,而不是一個電平訊號。
  • 停止訊號:當SCL為高期間,SDA由低到高的跳變;停止訊號也是一種電平跳變時序訊號,而不是一個電平訊號。

3.ACK

  傳送器每傳送一個位元組,就在時鐘脈衝9期間釋放資料線,由接收器反饋一個應答訊號。 應答訊號為低電平時,規定為有效應答位(ACK簡稱應答位),表示接收器已經成功地接收了該位元組;應答訊號為高電平時,規定為非應答位(NACK),一般表示接收器接收該位元組沒有成功。 對於反饋有效應答位ACK的要求是,接收器在第9個時鐘脈衝之前的低電平期間將SDA線拉低,並且確保在該時鐘的高電平期間為穩定的低電平

。 如果接收器是主控器,則在它收到最後一個位元組後,傳送一個NACK訊號,以通知被控傳送器結束資料傳送,並釋放SDA線,以便主控接收器傳送一個停止訊號P。

   如下圖邏輯分析儀的取樣結果:釋放匯流排後,如果沒有應答訊號,sda應該一直持續為高電平,但是如圖中藍色虛線部分所示,它被拉低為低電平,證明收到了應答訊號。

這裡面給我們的兩個資訊是:1)接收器在SCL的上升沿到來之前的低電平期間拉低SDA;2)應答訊號一直保持到SCL的下降沿結束;正如前文紅色標識所指出的那樣。
4.資料的有效性: 
I2C匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。 
我的理解:雖然只要求在高電平期間保持穩定,但是要有一個提前量,也就是資料在SCL的上升沿到來之前就需準備好,因為在前面I2C匯流排之(一)---概述一文中已經指出,資料是在SCL的上升沿打入到器件(EEPROM)中的。

5.資料的傳送:

  在I2C總線上傳送的每一位資料都有一個時鐘脈衝相對應(或同步控制),即在SCL序列時鐘的配合下,在SDA上逐位地序列傳送每一位資料。資料位的傳輸是邊沿觸發。

 二、工作過程

  總線上的所有通訊都是由主控器引發的。在一次通訊中,主控器與被控器總是在扮演著兩種不同的角色。

1.主裝置向從裝置傳送資料

  主裝置傳送起始位,這會通知總線上的所有裝置傳輸開始了,接下來主機發送裝置地址,與這一地址匹配的slave將繼續這一傳輸過程,而其它slave將會忽略接下來的傳輸並等待下一次傳輸的開始。主裝置定址到從裝置後,傳送它所要讀取或寫入的從裝置的內部暫存器地址; 之後,傳送資料。資料傳送完畢後,傳送停止位:

寫入過程如下:

  傳送起始位

  • 傳送從裝置的地址和讀/寫選擇位;釋放匯流排,等到EEPROM拉低匯流排進行應答;如果EEPROM接收成功,則進行應答;若沒有握手成功或者傳送的資料錯誤時EEPROM不產生應答,此時要求重發或者終止。
  • 傳送想要寫入的內部暫存器地址;EEPROM對其發出應答;
  • 傳送資料
  • 傳送停止位.
  • EEPROM收到停止訊號後,進入到一個內部的寫入週期,大概需要10ms,此間任何操作都不會被EEPROM響應;(因此以這種方式的兩次寫入之間要插入一個延時,否則會導致失敗,博主曾在這裡小坑了一下)

  詳細:

  需要說明的是:①主控器通過傳送地址碼與對應的被控器建立了通訊關係,而掛接在總線上的其它被控器雖然同時也收到了地址碼,但因為與其自身的地址不相符合,因此提前退出與主控器的通訊;

2.主控器讀取資料的過程:

  讀的過程比較複雜,在從slave讀出資料前,你必須先要告訴它哪個內部暫存器是你想要讀取的,因此必須先對其進行寫入(dummy write):

  • 傳送起始位;
  • 傳送slave地址+write bit set;
  • 傳送內部暫存器地址;
  • 重新發送起始位,即restart;
  • 重新發送slave地址+read bit set;
  • 讀取資料
    主機接收器在接收到最後一個位元組後,也不會發出ACK訊號。於是,從機發送器釋放SDA線,以允許主機發出P訊號結束傳輸。 
  • 傳送停止位   
詳細: