天天看點

解讀I2C協定和讀寫流程

I2C具體包括以下幾部分内容

1、I2C協定

包括2條雙向串行線,一條資料線SDA,一條時鐘線SCL。

SDA傳輸資料是大端傳輸,每次傳輸8bit,即一位元組。

支援多主要(multimastering),任何時間點隻能有一個主要。

總線上每個裝置都有自己的一個addr,共7個bit,廣播位址全0.

系統中可能有多個同種晶片,為此addr分為固定部分和可程式設計部份,細節視晶片而定,看datasheet。

2、I2C位傳輸

資料傳輸:SCL為高電平時,SDA線若保持穩定,那麼SDA上是在傳輸資料bit;

若SDA發生跳變,則用來表示一個會話的開始或結束(後面講)

資料改變:SCL為低電平時,SDA線才能改變傳輸的bit

3、I2C開始和結束信号

開始信号:SCL=1時,SDA由1->0,開始傳送資料。

結束信号:SCL=1時,SDA由0->1,結束傳送資料。

4、I2C應答信号

Master每發送完8bit資料後等待Slave的ACK。

即在第9個clock,若從IC發ACK,SDA=0。

若沒有ACK,SDA=1,這會引起Master發生RESTART或STOP流程

5、I2C寫流程

寫寄存器的标準流程為:

  1. Master發起START
  2. Master發送I2C addr(7bit)和w操作0(1bit),等待ACK
  3. Slave發送ACK
  4. Master發送reg addr(8bit),等待ACK
  5. Slave發送ACK
  6. Master發送data(8bit),即要寫入寄存器中的資料,等待ACK
  7. Slave發送ACK
  8. 第6步和第7步可以重複多次,即順序寫多個寄存器
  9. Master發起STOP

6、I2C讀流程

讀寄存器的标準流程為:

10. Master發送I2C addr(7bit)和r操作1(1bit),等待ACK

11. Slave發送ACK

12. Master發送reg addr(8bit),等待ACK

13. Slave發送ACK

14. Master發起START

15. Master發送I2C addr(7bit)和r操作1(1bit),等待ACK

16. Slave發送ACK

17. Slave發送data(8bit),即寄存器裡的值

18. Master發送ACK

19. 第8步和第9步可以重複多次,即順序讀多個寄存器

20.

21.

i2c波形:寫資料波形解讀(圖檔來自網上):

解讀I2C協定和讀寫流程

1.由主機發起,在SCL為高電平時,SDA由高到低切變,形成開始信号;

2. 接着是7位位址和一位讀寫标志,這裡7位位址為0111100,即0x3c,正是我們代碼中設定的位址ID;最後一位為0表示寫操作;

3. 接着在下一個時鐘,主機以高電平狀态釋放SDA,這時從機響應,将SDA拉低了;

4. 接着是兩個8位資料00101110與響應,即0x2E,正是“.”号的ASCII碼,符合預期輸出;

5. 還有其它資料和最後的停止位,圖中被截掉了。

從圖中可知,縱向一格是200mV,則SDA和SCL的電平大概就是350mV;由于信号筆上設定了信号x10,是以實際電平應該大概是3.5V(理論上應該是3.3V)。橫向一格是25us,10個時鐘周期大概用了4格,即4x25us=100us,平均每個時鐘周期是10us,可算出傳輸頻率為1/10us=100,000/s,即100k bps。

i2c波形: 讀寫資料波形解讀(圖檔來自網上):

解讀I2C協定和讀寫流程

---------- 愛生活,愛安卓,愛Linux ----------

繼續閱讀