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寫流程
寫寄存器的标準流程為:
- Master發起START
- Master發送I2C addr(7bit)和w操作0(1bit),等待ACK
- Slave發送ACK
- Master發送reg addr(8bit),等待ACK
- Slave發送ACK
- Master發送data(8bit),即要寫入寄存器中的資料,等待ACK
- Slave發送ACK
- 第6步和第7步可以重複多次,即順序寫多個寄存器
- 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波形:寫資料波形解讀(圖檔來自網上):
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波形: 讀寫資料波形解讀(圖檔來自網上):
---------- 愛生活,愛安卓,愛Linux ----------