I2C協議解析

2021-07-09 05:23:28 字數 3761 閱讀 8363

1、基本概念

主機            初始化傳送,產生時鐘訊號和終止傳送的器件

從機            被主機定址的器件

傳送器        傳送資料到匯流排的器件

接收器        從匯流排接收資料的器件

多主機        同時有多於乙個主機嘗試控制匯流排 但不破壞報文

仲裁           是乙個在有多個主機同時嘗試控制匯流排,但只允許其中乙個控制匯流排並使報文不被破壞的過程

同步           兩個或多個器件同步時鐘訊號的過程

2、硬體結構

每乙個i2c匯流排器件內部的sda、scl引腳電路結構都是一樣的,引腳的輸出驅動與輸入緩衝連在一起。其中輸出為漏極開路的場效電晶體、輸入緩衝為乙隻高輸入阻抗的同相器。這種電路具有兩個特點:

(1)由於 sda、scl 為漏極開路結構,借助於外部的上拉電阻實現了訊號的「線與」邏輯; 

(2)引腳在輸出訊號的同時還將引腳上的電平進行檢測,檢測是否與剛才輸出一致。為 「時鐘同步」和「匯流排仲裁」提供硬體基礎。

3、時鐘同步

如果從機希望主機降低傳送速度可以通過將scl主動拉低延長其低電平時間的方法來通知主機,當主機在準備下一次傳送發現scl的電平被拉低時就進行等待,直至從機完成操作並釋放scl線的控制控制權。這樣以來,主機實際上受到從機的時鐘同步控制。可見scl線上的低電平是由時鐘低電平最長的器件決定;高電平的時間由高電平時間最短的器件決定。這就是時鐘同步,它解決了i2c匯流排的速度同步問題。

4、主機傳送資料流程

(1)主機在檢測到匯流排為「空閒狀態」(即 sda、scl 線均為高電平)時,傳送乙個啟動訊號「s」,開始一次通訊的開始

(2)主機接著傳送乙個命令位元組。該位元組由 7 位的外圍器件位址和 1 位讀寫控制位 r/w組成(此時 r/w=0)

(3)相對應的從機收到命令位元組後向主機回饋應答訊號 ack(ack=0)

(4)主機收到從機的應答訊號後開始傳送第乙個位元組的資料

(5)從機收到資料後返回乙個應答訊號 ack

(6)主機收到應答訊號後再傳送下乙個資料位元組

(7)當主機傳送最後乙個資料位元組並收到從機的 ack 後,通過向從機傳送乙個停止訊號p結束本次通訊並釋放匯流排。從機收到p訊號後也退出與主機之間的通訊

注意:①主機通過傳送位址碼與對應的從機建立了通訊關係,而掛接在匯流排上的其它從機雖然同時也收到了位址碼,但因為與其自身的位址不相符合,因此提前退出與主機的通訊;②主機的一次傳送通訊,其傳送的資料數量不受限制。主機是通過 p 訊號通知傳送的結束,從機收到 p 訊號後退出本次通訊;③主機的每一次傳送後都是通過從機的 ack 訊號了解從機的接收狀況,如果應答錯誤則重發。

5、主機接收資料流程

(1)主機傳送啟動訊號後,接著傳送命令位元組(其中 r/w=1)

(2)對應的從機收到位址位元組後,返回乙個應答訊號並向主機傳送資料

(3)主機收到資料後向從機反饋乙個應答訊號

(4)從機收到應答訊號後再向主機傳送下乙個資料 

(5)當主機完成接收資料後,向從機傳送乙個「非應答訊號(ack=1)」,從機收到ask=1 的非應答訊號後便停止傳送

(6)主機傳送非應答訊號後,再傳送乙個停止訊號,釋放匯流排結束通訊

注意:主機所接收資料的數量是由主機自身決定,當傳送「非應答訊號/a」時從機便結束傳送並釋放匯流排(非應答訊號的兩個作用:前乙個資料接收成功,停止從機的再次傳送)。

6、匯流排死鎖原因分析

i2c匯流排寫操作過程中,主機在產生啟動訊號後控制scl產生8個時鐘脈衝,然後拉低scl訊號為低電平,在這個時候,從機輸出應答訊號,將sda訊號拉為低電平。如果這個時候主機異常復位,scl就會被釋放為高電平。此時,如果從機沒有復位,就會繼續i2c的應答,將sda一直拉為低電平,直到scl變為低電平,才會結束應答訊號。而對於主機來說,復位後檢測scl和sda訊號,如果發現sda訊號為低電平,則會認為i2c匯流排被占用,會一直等待scl和sda訊號變為高電平。這樣,主機等待從機釋放sda訊號,而同時從機又在等待主機將scl訊號拉低以釋放應答訊號,兩者相互等待,i2c匯流排進人一種死鎖狀態。同樣,當i2c進行讀操作時,從機應答後輸出資料,如果在這個時刻主機異常復位而此時從機輸出的資料位正好為0,也會導致i2c匯流排進入死鎖狀態。

解決方案通常有如下幾種:

(1)將從機的電源設計為可控,當發生匯流排死鎖的時將從機復位

(2)可以在從機的程式中加入監測功能,如果匯流排長時間被拉低則釋放對匯流排的控制

(3)在主機中增加i2c匯流排恢復程式。每次主機復位後,如果檢測到sda被拉低,則控制scl產生<=9個時鐘脈衝(針對8位資料的情況),每傳送乙個時鐘脈衝就檢測sda是否被釋放,如果sda已經被釋放就再模擬產生乙個停止訊號,這樣從機就可以完成被掛起的讀寫操作,從死鎖狀態中恢復過來。這種方法有一定的侷限性,因為大部分主機的i2c模組由內建的硬體電路來實現,軟體並不能夠直接控制scl訊號模擬產生需要時鐘脈衝

7、處理器的i2c模組會在如下所述的情況產生中斷訊號

rx_under    當處理器通過ic_data_cmd暫存器讀取接收緩衝器為空時置位

rx_over      當接收緩衝器被填滿,而且還有資料從外設傳送過來時被置位;緩衝器被填滿後接收的資料將會丟失

rx_full       當接收緩衝器達到或者超過ic_rx_tl暫存器中規定的閾值時被置位;當資料低於閾值時標誌位將被自動清除

tx_over      當傳送緩衝器被填滿,而且處理器試圖傳送另外的命令寫ic_data_cmd暫存器時被置位

tx_empty    當傳送緩衝器等於或者低於ic_tx_tl暫存器中規定的閾值時被置位;當資料高於閾值時標誌位將被自動清除

rd_req        當i2c模組作為從機時並且另外的主機試圖從本模組讀取資料時被置位

tx_abrt       當i2c模組無法完成處理器下達的命令時被置位,有如下幾種原因:

* 傳送位址位元組後沒有從機應答

* 位址識別成功後主機傳送的資料從機沒有應答

* 當i2c模組只能作為從機時試圖傳送主機命令

* 當模組的restart功能被關閉,而處理試圖完成的功能必須要restart功能開啟才能完成

* 高速模組主機**被應答

* start byte被應答

* 模組仲裁失敗

無論標誌位什麼時候被置位,傳送緩衝器和接收緩衝器的內容都會被重新整理

rx_done      當i2c模組作為從機傳送資料時,如果主機沒有應答則置位;這種情況發生在i2c模組傳送最後乙個位元組資料時,表明傳輸結束

activity       表明i2c模組正在活動,這個標誌位將會一直保持直到用以下4種方式清除:

* 關閉i2c

* 讀取ic_clr_activity暫存器

* 讀取ic_clr_intr暫存器

* 系統重啟

即使i2c模組是空閒的,這個標誌仍然需要被置位直到被清除,因為這表明i2c匯流排上有資料正在傳輸

stop_det     表明i2c匯流排上產生了stop訊號,無論模組作為主機還是從機

start_det   表明i2c匯流排上產生了start訊號,無論模組作為主機還是從機

i2c 協議解析

1 基本概念 主機 初始化傳送,產生時鐘訊號和終止傳送的器件 從機 被主機定址的器件 傳送器 傳送資料到匯流排的器件 接收器 從匯流排接收資料的器件 多主機 同時有多於乙個主機嘗試控制匯流排 但不破壞報文 仲裁 是乙個在有多個主機同時嘗試控制匯流排,但只允許其中乙個控制匯流排並使報文不被破壞的過程 ...

I2C協議詳解

1 i2c匯流排知識 1.1 i2c匯流排物理拓撲結構 i2c 匯流排在物理連線上非常簡單,分別由sda 序列資料線 和scl 序列時鐘線 及上拉電阻組成。通訊原理是通過對scl和sda線高低電平時序的控制,來產生i2c匯流排協議所需要的訊號進行資料的傳遞。在匯流排空閒狀態時,這兩根線一般被上面所接...

協議理解之I2C協議

協議我們參考 eeprom 24c64的datasheet 速度 標準模式下可以達到100kbit s 快速模式下可以達到400kbit s 高速模式下可以達到3.4mbit s i2c匯流排術語 傳送器 傳送資料到匯流排的器件 接收器 從匯流排接收資料的器件 主機 初始化傳送 產生時鐘訊號和終止傳...