----- 正文 -----
1、概述
I2C(Inter-Integrated Circuit)也稱為IIC,是由飛利浦公司(現在屬于恩智浦半導體)開發的串行通信協議,廣泛應用于連接低速外圍設備,例如ADC、DAC、電源管理芯片、電流采集芯片等,采用兩線制,最高支持5Mhz通信頻率,支持多主機多從機模式。
2、基本結構
I2C基本結構如下圖,SCL與SDA為通信總線,SCL:時鐘線,SDA:數據線,由于其協議有仲裁功能,因此上面可以掛多個主機和多個從機,另外由于其開漏輸出結構,兩根線上均有上拉電阻來提供高電平。
當然最常見的還是單主機和(單)多從機用法:
3、開漏輸出與線與邏輯
開漏輸出:
開漏輸出是I2C的特點,開漏輸出是指輸出端通過 MOS管的漏極連接到外部電路,MOS管的源極接地,柵極受控,如下圖,此種結構的特點無法輸出高電平,當MOS管開啟時輸出低電平,當MOS管關斷時,輸出高阻態,也就是說不拉高也不拉低,因此需要外部加一個上拉電阻來實現高電平輸出。
開漏輸出的一個好處是即使總線上各個設備有的輸出高電平有的輸出低電平,由于高電平是由上拉電阻產生,因此總線上不會出現VDD與GND短路。
線與邏輯:
線與邏輯類似于與門的邏輯,由于開漏輸出原因,總線上只要有一個設備輸出低電平,那么總線上就會是低電平,如下表:
4、數據有效性:
I2C再進行數據傳輸時,需要遵循以下邏輯才能保持數據有效:
SCL為高電平期間:SDA線上的數據必須保持穩定。
SCL為低電平期間:SDA線上的數據可以發生變化。
5、數據傳輸:
以下是官方文檔給出的一個時序示例
5.1 位傳輸:
從上面的時序圖可以看出,I2C傳輸中,每8位為一個字節,后面跟隨一個應答或非應答位
應答位(ACK):設備將SDA拉低
非應答位(NACK):SDA保持高電平
另外:
讀(Read):SDA保持高電平
寫(Write):主機將SDA拉低
起始位(Start):在SCL為高電平時,SDA由高電平變為低電平。
終止位(Stop):在SCL為高電平時,SDA由低電平變為高電平。
5.2 常見時序
以下是最常見的時序的抽象圖,該時序由①起始位開始然后主機發送②七位從機地址,后面跟隨一個③讀或寫位,此后等待從機④應答,待從機應答后,⑤如果是讀數據,那么后續將會是從機返回數據,主機讀取數據;如果是寫數據,那么就是主機寫入一位數據,讀或者寫完成后,主機或者從機再次發⑥非應答信號,此后發送⑦停止位停止此次通信。
另外還有常見的復雜一點的時序,該時序由①起始位開始然后主機發送②七位從機地址,后面跟隨一個③寫位,此后等待從機④應答,從機應答后,主機⑤發送寄存器地址,從機收到后再次⑥應答,主機收到應答后再次發送⑦起始位,并再次⑧發送從機地址,然后發送⑨讀或寫位,此后再次等待從機10. 應答,主機收到應答后,11. 向從機發送數據或者讀取從機返回的數據,后續主機或者從機再次發12. 非應答信號,最后主機發送停止位停止此時通信。
上述時序的關鍵在于第一個字節發送從機地址,后跟隨第二個字節從機某個寄存器的地址,第三個字節再次發送從機地址,然后第四個字節才是寫入或讀取的數據,這樣的時序對于稍微復雜一點的芯片通信比較友好,因為可以對不同的寄存器進行配置。
6、實際時序示例:
如下是一個讀數據的時序示意圖,從機地址為:1011 001,從機返回的數據為:0101 1101
歡迎評論區討論,別忘了點贊?。?!