I2C(Inter-Integrated Circuit,集成電路總線)是一種簡單、雙向、二線制的串行通信總線,由Philips半導體公司(現(xiàn)在的NXP半導體公司)在八十年代初設計出來。它以通俗易懂的方式解釋如下:
基本概念
雙向二線制:I2C總線只使用兩根線——一根數(shù)據(jù)線(SDA)和一根時鐘線(SCL),就可以實現(xiàn)數(shù)據(jù)的雙向傳輸。這種設計使得連接設備變得非常簡單和節(jié)省空間。
串行通信:數(shù)據(jù)不是同時傳輸多個比特(并行通信),而是按順序一個接一個地傳輸(串行通信)。這雖然降低了傳輸速度,但簡化了硬件設計。
SCL為高電平的時候,SDA由高電平向低電平跳變。SCL為高電平的時候,SDA由低電平向高電平跳變。
I2C總線上的所有數(shù)據(jù)都是以8位字節(jié)傳送的,發(fā)送器每發(fā)送一個字節(jié),就在時鐘脈沖9期間釋放數(shù)據(jù)線,由接收器反饋一個應答信號。應答信號為低電平時,規(guī)定為有效應答位(ACK簡稱應答位),表示接收器已經(jīng)成功地接收了該字節(jié);應答信號為高電平時,規(guī)定為非應答位(NACK),一般表示接收器接收該字節(jié)沒有成功,對于反饋有效應答位ACK的要求是,接收器在第9個時鐘脈沖之前的低電平期間將SDA線拉低,并且確保在該時鐘的高電平期間為穩(wěn)定的低電平。如果接收器是主控器,則在它收到最后一個字節(jié)后,發(fā)送一個NACK信號,以通知被控發(fā)送器結束數(shù)據(jù)發(fā)送,并釋放SDA線,以便主控接收器發(fā)送一個停止信號P。
主機+從設備地址+寫命令,從機應答,應答成功,表示有這個設備,然后主機+設備內部寄存器地址,此時不用再加寫命令控制字,從機應答,應答成功,表示設備內有這個地址,主機寫入數(shù)據(jù),從機應答,是否繼續(xù)發(fā)送,不發(fā)送的話,發(fā)送停止信號P。
要想讀設備,首先要知道將要所讀取設備的地址告訴從設備,從設備才能將數(shù)據(jù)放到(發(fā)送)SDA上使主設備讀取,從設備將數(shù)據(jù)放入SDA上的過程,由硬件主動完成,不用人為的寫入。所以首先先寫入從機地址,然后+寫控制命令,從機應答,應答成功,表示有這個設備,然后寫入內部寄存器地址,此時不用再加寫命令控制字,從機應答,應答成功,表示設備內有這個地址。然后主機繼續(xù)發(fā)出:寫入從機地址,然后+讀命令,從機應答,應答成功,此時便可以讀取數(shù)據(jù)了,從設備已經(jīng)將數(shù)據(jù)放入到SDA上了。地址跟設備已經(jīng)驗證了,不用再進行驗證。
I2C總線總線的SDA和SCL兩條信號線同時處于高電平時,規(guī)定為總線的空閑狀態(tài)。此時各個器件的輸出級場效應管均處在截止狀態(tài),即釋放總線,由兩條信號線各自的上拉電阻把電平拉高。
為了支持您的項目開發(fā)需求,我們特別準備了詳盡的開發(fā)資料(有例程)。若您對此感興趣,并希望獲得這些資源以助力您的項目進展,歡迎添加我的微信(限前50位:xinsousou 會親自解答)。我將免費為您發(fā)送這些資料,希望能為您的開發(fā)工作帶來便利與啟發(fā)。
總線封鎖狀態(tài)
在特殊情況下,如果需要禁止所有發(fā)生在I2C總線上的通信活動,封鎖或關閉總線是一種可行途徑,只要掛接于該總線上的任意一個器件將時鐘線SCL鎖定在低電平上即可。
總線競爭的仲裁
總線上可能掛接有多個器件,有時會發(fā)生兩個或多個主器件同時想占用總線的情況,這種情況叫做總線競爭。I2C總線具有多主控能力,可以對發(fā)生在SDA線上的總線競爭進行仲裁,其仲裁原則是這樣的:當多個主器件同時想占用總線時,如果某個主器件發(fā)送高電平,而另一個主器件發(fā)送低電平,則發(fā)送電平與此時SDA總線電平不符的那個器件將自動關閉其輸出級。總線競爭的仲裁是在兩個層次上進行的。首先是地址位的比較,如果主器件尋址同一個從器件,則進入數(shù)據(jù)位的比較,從而確保了競爭仲裁的可靠性。由于是利用I2C總線上的信息進行仲裁,因此不會造成信息的丟失。
為何識別到“0”將丟失仲裁呢?因為對于OD門,只能驅動到低電平,釋放總線只能通過不驅動總線釋放,停止驅動即產(chǎn)生“1”,但是發(fā)現(xiàn)總線還是“0”,這說明還有主機在跟自己競爭總線使用權,自己線驅動到“1”,確檢測到“0”,那代表自己已經(jīng)失去了仲裁。
主機只能在總線空閑的時侯啟動傳送。兩個或多個主機可能在起始條件的最小持續(xù)時間tHD;STA 內產(chǎn)生一個起始條件,結果在總線上產(chǎn)生一個規(guī)定的起始條件。
當SCL 線是高電平時,仲裁在SDA 線發(fā)生;這樣,在其他主機發(fā)送低電平時,發(fā)送高電平的主機將斷開它的數(shù)據(jù)輸出級,因為總線上的電平與它自己的電平不相同。然后,進一步獲得其的判定條件:
仲裁可以持續(xù)多位。首先是比較地址位。如果每個主機都試圖尋址同一的器件,仲裁會繼續(xù)比較數(shù)據(jù)位(假設主機是發(fā)送器),或者比較響應位(假設主機是接收器)。
I2C 總線的地址和數(shù)據(jù)信息由贏得仲裁的主機決定,在仲裁過程中不會丟失信息。丟失仲裁的主機可以產(chǎn)生時鐘脈沖直到丟失仲裁的該字節(jié)末尾。
在串行傳輸過程中時,一旦有重復的起始條件或停止條件發(fā)送到I2C 總線的時侯,仲裁過程仍在進行。如果可能產(chǎn)生這樣的情況,有關的主機必須在幀格式相同位置發(fā)送這個重復起始條件或停止條件。
此外,如果主機也結合了從機功能,而且在尋址階段丟失仲裁,它很可能就是贏得仲裁的主機在尋址的器件。那么,丟失仲裁的主機必須立即切換到它的從機模式。
I2C 總線的控制只由地址或主機碼以及競爭主機發(fā)送的數(shù)據(jù)決定,沒有中央主機,總線也沒有任何定制的優(yōu)先權。
通信過程
起始信號:當SCL為高電平時,SDA由高電平向低電平跳變,表示通信開始。
發(fā)送地址:主機發(fā)送一個字節(jié)的數(shù)據(jù),其中包含了從機的地址和后續(xù)字節(jié)的傳送方向(讀或寫)。
從機應答:從機在接收到地址后,如果地址匹配,則在第9個時鐘周期將SDA拉低以應答;如果不匹配或無法應答,則保持SDA為高電平。
數(shù)據(jù)傳輸:在確認從機應答后,主機開始發(fā)送或接收數(shù)據(jù)。每個字節(jié)的數(shù)據(jù)后面都跟著一個應答位,以確保數(shù)據(jù)傳輸?shù)目煽啃浴?/p>
結束信號:當數(shù)據(jù)傳輸完成后,主機發(fā)送停止信號來結束通信。停止信號是在SCL為高電平時,SDA由低電平向高電平跳變。
時序圖
I2C總線因其簡單性和靈活性而被廣泛應用于各種電子設備中,如連接傳感器、存儲器、顯示屏等外設到微控制器或微處理器上。它特別適用于需要多個設備共享通信線并由一個(或多個)主設備管理的場景。
總結
I2C是一種簡單、雙向、二線制的串行通信總線,通過兩根線(SDA和SCL)實現(xiàn)數(shù)據(jù)的雙向傳輸。它采用主從架構和時鐘同步機制來確保數(shù)據(jù)的可靠傳輸。由于其簡單性和靈活性,I2C總線在電子設備中得到了廣泛應用。
審核編輯 黃宇
-
RS485
+關注
關注
39文章
1135瀏覽量
82071 -
總線
+關注
關注
10文章
2858瀏覽量
87912 -
I2C
+關注
關注
28文章
1477瀏覽量
123051
發(fā)布評論請先 登錄
相關推薦
評論