借鑒:https://blog.csdn.net/qq_29344757/article/details/76520378
1. 物理層
????????I2C通訊系統(tǒng)接線圖如下:
? ??

????????SCL總線:控制線
? ? ? ? SDA總線:數(shù)據(jù)線
????????(1) 在I2C通訊總線上,可連接多個(gè)I2C通訊設(shè)備,支持多個(gè)通訊主機(jī)和多個(gè)通訊從機(jī)
????????(2) I2C通訊只需要兩條雙向總線:串行數(shù)據(jù)線(SDA),串行時(shí)鐘線(SCL)。數(shù)據(jù)線用于傳輸數(shù)據(jù),時(shí)鐘線用于同步數(shù)據(jù)收發(fā)
????????(3) 每個(gè)連接到總線的設(shè)備都有一個(gè)獨(dú)立的地址,主機(jī)正是利用該地址對(duì)設(shè)備進(jìn)行訪問
????????(4) SDA和SCL總線都需要接上上拉電阻,當(dāng)總線空閑時(shí),兩根線均為高電平。連接到總線上的任意器件輸出低電平都會(huì)將總線信號(hào)拉低。即各器件的SDA和SCL都是線與的關(guān)系
????????(5) 多個(gè)主機(jī)同時(shí)使用總線時(shí),需要用仲裁方式?jīng)Q定哪個(gè)設(shè)備占用總線,不然數(shù)據(jù)將會(huì)產(chǎn)生沖突
????????(6) 串行的8位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá)100kbps,快速模式下可達(dá)400kbps,高速模式下可達(dá)3.4Mbps(目前大多數(shù)I2C設(shè)備還不支持高速)
2. 協(xié)議層
????????協(xié)議層規(guī)約了通訊的起始、停止信號(hào),數(shù)據(jù)有效性、響應(yīng)、沖裁同步、地址廣播等。
????????在SCL線為高電平期間,SDA線由高電平向低電平轉(zhuǎn)換表是起始信號(hào)

2.1 通訊的起始信號(hào)/結(jié)束信號(hào)
????????在SCL線為高電平期間,SDA線由低電平向高電平轉(zhuǎn)換表是結(jié)束信號(hào)。

? ??起始/結(jié)束信號(hào)都是由主機(jī)發(fā)出的,在起始信號(hào)產(chǎn)生后,總線就處于被占用的狀態(tài);在結(jié)束信號(hào)產(chǎn)生后,總線就處于空閑狀態(tài)。
需要注意的兩點(diǎn):
????????(1) 接收器件接收到一個(gè)完整的數(shù)據(jù)字節(jié)后,可能需要完成一些其他工作,如處理內(nèi)部接收中斷服務(wù)函數(shù)等,這就無法立即接收下一字節(jié)的數(shù)據(jù),這時(shí)接收器件可將SCL線拉成低電平,從而使得主機(jī)處于等待狀態(tài)。直至接收器件準(zhǔn)備好接收下一字節(jié)數(shù)據(jù)時(shí)再釋放SCL線使之為高電平。
????????(2) 連接到I2C總線上的器件,若具有I2C總線控制器那么很硬件會(huì)自動(dòng)檢測(cè)到起始、結(jié)束信號(hào),而對(duì)于不具備I2C總線控制器的器件(單片機(jī))來說,需要在每個(gè)時(shí)鐘周期內(nèi)保證對(duì)數(shù)據(jù)線SDA采樣兩次,捕獲是否接收到起始/結(jié)束信號(hào)。
2.2 數(shù)據(jù)傳輸

? ? ? ? (1)通過每個(gè)設(shè)備上的地址,進(jìn)行數(shù)據(jù)信號(hào)的處理。
? ? ? ? ?(2)結(jié)束由主機(jī)發(fā)送信號(hào),若需要繼續(xù)新的數(shù)據(jù)傳輸,則不產(chǎn)生結(jié)束信號(hào),而是發(fā)送起始信號(hào)對(duì)另一從機(jī)地址尋址
? ? ? ? ?(3)寫數(shù)據(jù)方向,主機(jī)-->從機(jī),數(shù)據(jù)包為8位,等待從機(jī)應(yīng)答信號(hào)(ACK),多字節(jié),重復(fù)此操作,最后主機(jī)發(fā)送停止信號(hào)結(jié)束。
? ? ? ? ? (4)讀數(shù)據(jù)方向,從機(jī)-->主機(jī),數(shù)據(jù)包為8位,等待從機(jī)應(yīng)答信號(hào)(ACK),多字節(jié),重復(fù)此操作,若為NACK,則數(shù)據(jù)傳輸結(jié)束。
? ? ? ? ? (5)實(shí)際I2C通訊采用的是讀寫復(fù)合的格式。傳輸過程中主機(jī)需要發(fā)出2次起始信號(hào):第一次傳輸主機(jī)通過從機(jī)地址找到從機(jī)設(shè)備,發(fā)送一段數(shù)據(jù),這個(gè)數(shù)據(jù)是從設(shè)備內(nèi)部寄存器或者存儲(chǔ)器地址;第二次傳輸是對(duì)該地址進(jìn)行讀/寫。主機(jī)要讀取從機(jī)數(shù)據(jù)時(shí),主機(jī)會(huì)釋放對(duì)SDA總線的控制,由從機(jī)控制SDA總線,主機(jī)負(fù)責(zé)接收信號(hào);主機(jī)要向從機(jī)設(shè)備寫數(shù)據(jù)時(shí),SDA由主機(jī)控制,從機(jī)負(fù)責(zé)接收信號(hào)。