1. 程式人生 > >【轉】I2C總線協議

【轉】I2C總線協議

和數 編號 智能 file bit adc 共存 忽略 targe

I2C總線(Inter Integrated-Circuit)是由PHILIPS公司在上世紀80年代發明的一種電路板級串行總線標準,通過兩根信號線——時鐘線SCL和數據線SDA——即可完成主從機的單工通信。總線硬件連接極其簡單,不同I2C設備掛接在總線上,只需在信號線安裝上拉電阻即可完成硬件線路的搭建。另外,I2C總線采用器件地址的硬件設置方法,通過軟件尋址方式完全避免了片選尋址的弊端,從而使硬件系統擴展更為靈活。

由於簡單有效,I2C在業界得到廣泛應用。基於I2C衍生出來的標準有SMBus、PMBus、IPMI、DDC和ATCA等。常見集成I2C硬件接口的設備有微控制器、溫度傳感器、LED控制器、EEPROM、ADC/DAC、RTC、時鐘振蕩器和I/O控制器等。

I2C總線最主要的優點是其簡單性和有效性,其次I2C支持多主機(Multi-Mastering),任何能夠進行發送和接收的設備都可以成為主機。主機控制數據的傳輸和時鐘的頻率。在任何時間點只能有一個主機。因為只有兩條線,在處理地址和應答時,I2C存在一定的開銷,效率不如設備直接相連的SPI總線。

下面就I2C總線的主要特點、總線操作、同步和仲裁、電接口特點等作簡單介紹。

一、主要特點

  • I2C只有兩根信號線:串行數據線SDA和串行時鐘線SCL;
  • I2C總線上所有器件的SDA、SCL引腳輸出驅動都為漏極開路結構,通過外接上拉電阻實現總線上所有節點SDA、SCL信號的“線與”邏輯關系;
  • 總線上的所有設備通過軟件尋址且具有唯一的地址(7位或10位)。7位“從機專用地址碼”,其高4位為設備類型地址(由生產廠家制定),低3位為器件引腳定義地址(由使用者定義);10位地址不常見;
  • 任何時刻都只存在簡單的主/從關系,按數據傳輸的方向,主機可以是主發送器或主接收器;
  • 支持多主機。在總線上存在多個主機時,通過沖突檢測和仲裁機制防止多個主機同時發起數據傳輸時存在的沖突;
  • I2C總線上所有器件都具有“自動應答”功能,保證數據傳輸的正確性;
  • 主機和從機的區別在於對SCL的發送權,只有主機才能發送SCL;
  • I2C總線不僅廣泛應用於電路板級的內部通信,還可以通過I2C總線驅動器進行不同系統間的通信;
  • 支持傳輸速率包括標準模式(Standard Mode)100kb/s、快速模式(Fast Mode)400kb/s、增強快速模式(Fast Mode Plus)1Mb/s和高速模式(High Speed Mode)3.4Mb/s;極速模式(Ultra-Fast Mode),單向數據傳輸速率可達5Mb/s;
  • I2C總線允許掛載最多的設備數量取決於總線上最大電容值,一般為400pf(Hs模式100pf)

技術分享圖片

表1. I2C總線概念定義

技術分享圖片圖1. I2C連接示意圖(S和F模式)

I2C的數據(SDA)和時鐘(SCL)信號都是雙向的,通過電流源或上拉電阻接到電源(如圖1示),VDD大小取決於I2C設備接口的耐壓能力。兩根線都為高時,總線處於空閑狀態(IDLE)。I2C接口的特殊構造以實現“線與”功能,即每個信號接口都分為輸出的漏極開路(或集電極開路)和輸入緩沖器部分。“線與”邏輯是I2C實現時鐘同步和總線仲裁的硬件基礎。

“線與”功能

漏極開路/集電極開路的特點是不能輸出高電平,必須通過外接上拉輸出高電平。如果總線上有任何一個設備接口輸出低電平,則整個總線的狀態表現為低電平,由此實現I2C總線信號的“線與”功能。

“線與”功能的好處在於可以實現總線的仲裁控制。總線的控制權會交給最後一個輸出低電平的設備,其它設備(輸出為高)通過檢測總線上的電平狀態(表現為低),對比與自己輸出狀態不一致,則自動退出對總線的控制請求。

漏極開路/集電極開路的缺點是對於一個距離長的數據線,信號傳輸速率得不到有效保證。更長的走線對於輸出驅動器表現為更大的容性負載,等效容性負載C和信號線的上拉電阻R構成RC振蕩器。RC越大,意味著反射和振蕩越強,從而影響總線的信號完整性。這也是I2C規範對總線電容值約束在400pf以內的原因。高速模式(Hs)對信號完整性的要求更高,協議有定義相關SDA/SCL處理辦法,以保證在數據線夠長、速率夠高時,信號完整性也可以得到滿足。

二、總線操作

  1. 數據有效性

協議沒有規定I2C邏輯“1”和“0”的電平值,參考實際應用中的VDD。每傳輸一比特數據SDA,對應產生一個時鐘脈沖SCL。SCL為高時,SDA不允許變化;只有在SCL為低時,SDA才可以變化(圖2)。

技術分享圖片

圖2. 位的傳輸

  1. 開始和結束條件

SDA和SCL的特定組合表示總線開始或結束一次數據傳輸。

開始條件(S):SCL為高時,SDA由高變低;

結束條件(P):SCL為高時,SDA由低變高。

技術分享圖片

圖3. 開始和結束條件

開始/結束條件總是由主機(Master)發起的。主機發出開始條件(START)後,總線處於忙的狀態;主機發出結束條件(STOP)後,總線處於空閑狀態。

在操作中,如果主機發出重復開始條件(repeated START,Sr)而非結束條件(STOP),則總線仍處於忙的狀態。也就是說,重復開始條件(Sr)和開始條件(S)在功能上是相同的。在本文(協議)中,除非特別說明,開始條件和重復開始條件統一表述為S。

判斷開始或結束條件對於具有相應邏輯接口的設備相對簡單,對於沒有該接口的微控制器,需要在每個SCL周期內對SDA至少采樣2次,才能正確檢測到開始或結束條件。

  1. 字節格式

SDA上傳輸字節數據必須是8比特長度,每次傳輸不限定傳輸的字節數。每個字節(8位)數據傳送完畢後緊接著應答信號(第9位,Acknowledge Bit)。數據傳輸過程中,先發送高位(MSB),再發送低位(LSB),如圖4示。如果在數據傳輸過程中,從機如果沒有準備好接收或發送下一個字節(比如內部中斷需要處理等),它可以通過拉低SCL強制主機進入等待狀態。直到從機釋放SCL,主機才開始下一個字節的發送或接收。

技術分享圖片

圖4. I2C總線的數據傳輸

  1. 應答

協議規定數據傳輸過程必須包含應答。接收器通過應答(1 bit)通知發送的字節已被成功接收,發送器可以進行下一個字節的傳輸。主機產生數據傳輸過程中的所有時鐘,包括應答的第9個時鐘。發送器在應答時鐘周期內釋放對SDA的控制,這樣接收器可以通過將SDA拉低通知發送器數據已被成功接收(圖5)。

技術分享圖片

圖5. I2C總線的數據應答

參照圖2說明,SCL為高的時候,SDA數據才是有效的,因此接收器發送ACK時,要保證SCL為高的同時,SDA為低電平;建立和保持時間也要滿足規範要求。如果在第9個時鐘周期,SDA為高,表明接收器無應答(NACK),主機可以據此發出結束條件(STOP)命令結束此次傳輸,或發起重傳請求(repeated START)重新傳輸數據。有5種情況可能導致無應答(NACK):

  • 總線上沒有對應地址的接收器件;
  • 接收器件沒有準備好與主機的通信;
  • 接收器件無法解析讀取的數據;
  • 接收器件無法收取更多的數據;
  • 主機作為接收器(Master-Receiver)時,在讀取從機(Slave-Transmitter)發出的最後一個字節數據後,發出NACK通知從發送器釋放數據線SDA,以便主機發起結束(STOP)或重傳(Sr)指令。

圖6表示主機作為發送器和接收器在寫和讀情況下的數據格式(ACK/NACK)。

技術分享圖片

圖6. I2C數據讀寫的格式

三、時鐘同步和仲裁

I2C的一大特點是可以在同一條總線上接多個主機。兩個及以上的主機同時發起傳輸請求時,需要通過某種機制確定哪個主機獲得總線的使用權;另外,每個主機都獨立產生時鐘,時鐘速率可能千差萬別,這也需要某種機制解決時鐘速率不一致的問題。這種機制就是時鐘同步(Clock Synchronization)和仲裁(Arbitration)。在單主機的I2C系統中,不需要時鐘同步和仲裁。

1.時鐘同步

每個I2C的主機內部都有兩個計數器,分別計數SCL上高電平和低電平的時間。如果總線上只有一個主機,則這兩個計數器的值決定系統時鐘速率。當多個主機存在時,不同設備的計數器速度可能不一致,因此涉及時鐘同步的概念。

時鐘同步是通過I2C接口的“線與”邏輯實現的。SCL信號線由高變低時,所有連接在SCL上的主機都開始計數低電平的時間(低電平計數器復位),由前文對“線與”邏輯的介紹可知:只有當SCL總線上所有主機的時鐘輸出端都為高時,SCL總線才會由低變高。SCL的低電平時間由總線上低電平時間最長的主機決定。時鐘端口先跳變為高的其它主機進入等待狀態(圖7)。這樣所有主機的時鐘輸出和SCL線上的狀態保持相同;當SCL由低變高後,所有主機(高電平計數器)開始計數SCL高電平的時間;最早由高跳變到低的主機再次將SCL拉低。通過這種方式產生的同步時鐘:其低電平時間是所有主機時鐘中最長的低電平時間,其高電平時間是所有主機時鐘中最短的高電平時間。

技術分享圖片

圖7. 仲裁階段的時鐘同步

2.仲裁

當總線上有一個以上的主機時,協議通過仲裁的方法確定哪個主機獲得總線的使用權。從機不參與仲裁的過程。

當總線處於空閑狀態(IDLE)時,在最小的保持時間內(tHD;STA),多個主機都可能發起開始條件(START)在總線上傳輸數據。仲裁用來判斷哪個主機的傳輸可以正常進行。

仲裁是按位進行的。仲裁開始時,對於每一位數據,SCL為高時,每個主機都檢測SDA上的數據是否和自己發送的數據相同。可能需要進行多個位(bit)的比較,主機才開始檢測到SDA上數據和自己發送的不一致。實際上,只要SDA上的數據和主機發送的數據一致,這些主機就可以將數據一致發送下去。當主機發送為HIGH,檢測SDA上電平卻為LOW,那麽該主機就在仲裁中失去主控權,並將其SDA輸出關閉。余下的主機獲得總線控制權並繼續數據的傳輸。如圖8,當主機1在檢測到SDA數據和它自身的輸出DATA1不一致時,將自動關閉DATA1的輸出,停止向總線上發送數據。

由此可見,在仲裁過程中勝出的主機是沒有丟失數據的。在仲裁中失去總線控制權的主機在本次字節傳輸結束後繼續產生時鐘,並在總線空閑時開始上次數據的重傳。如果同一個器件可以工作在主從兩種模式,它在仲裁過程中失去總線控制權,那麽有可能是仲裁勝出的主機將要訪問該器件,該器件應該立即切換到從機模式。

技術分享圖片

圖8. 兩個主機的仲裁過程

從上面的原理分析可知,I2C不存在核心主機,是沒有優先級的概念的。總線的控制權僅取決於主機在SDA上的競爭(SDA包含地址和數據)。

在仲裁過程中,存在以下未定條件會導致不可預期的結果:

  • 主機1在主機2發送數據的過程中發出重復開始條件(Sr)
  • 主機1在主機2發送數據的過程中發出結束條件(P)
  • 主機1在主機發出結束條件(P)的過程中發出重復開始條件(Sr)

3.Clock Stretching

Clock Stretching 通過拉低SCL延遲數據的傳輸。Clock Stretching 是可選功能,實際上許多從機不包括SCL驅動器,因此也無法延遲時鐘。

在字節級的數據傳輸中,接收器在下一個字節接收前,可能需要一段時間存儲上一個接收的字節。從機可以在接收字節和發送ACK後將SCL置低,通知發送器延遲數據的發送,直到從機準備好,再次將SCL釋放為止。從機以一種握手機制迫使主機進入等待狀態,直到從機準備好接收下一個字節。

在位級的數據傳輸中,設備(例如有或沒有I2C總線接口邏輯的微控制器)可以通過延長每個時鐘的低電平時間降低總線的時鐘速率,由此使得任何主機的速度都可以適配總線上設備的內部工作速率。

在Hs 模式,握手機制只在字節級數據傳輸中使用。

四、數據/地址模式

1.七位地址系統

開始條件(S)後的第一個字節包括尋址的從機地址(7 bit)和數據方向控制位R/W(1 bit),如圖9。其中第8位數據方向控制位R/W

  • 0:主機寫數據 TO 從機
  • 1:主機讀數據 FROM 從機

技術分享圖片

圖9. START後的第一個字節格式

由讀寫位的特點可知對於I2C總線上的第一個字節,讀操作都是奇數,寫操作是偶數。有的廠商提供的是8位地址(包括讀寫位),這樣對於讀寫會有兩個不同的地址。更合理的辦法是直接提供唯一的7位地址。如圖10所示。

技術分享圖片

圖10. 7位 vs 8位地址

主機發送結束條件(P)終止一次傳輸。主機也可以通過發起重復開始條件(Sr)進行一次新的傳輸,而不需要先產生結束條件(P)。在一次傳輸過程中,可能存在多種讀寫組合,包括:

  • 主機作為發送,向從機發送(寫)數據,傳輸的方向不變(圖11);

技術分享圖片

圖11. 7位地址主發從收模式

  • 主機發送開始條件(S)以及其後的第一個字節,立即改為從總線上讀取狀態。收到從機的應答(ACK)後,主機由主發模式切換到主收模式,從機由從收模式切換到從發模式。第一個應答是從機發出的。主機先發送NACK,再發送結束條件(P)結束本次傳輸(圖12);

技術分享圖片

圖12. 主機在第一個字節後立即讀取從機內容

  • 混合模式(圖13)。

技術分享圖片

圖12. 混合模式

2.十位地址系統

采用10位地址系統擴充了I2C系統的地址範圍。7位和10位地址設備可以共存於同一個I2C總線系統,並且可工作在所有速度模式。目前,使用10位地址系統的I2C設備不多。

10位從機地址由緊接著START(或Repeated Start)後的兩個字節定義。

第一個字節的前七位格式為1111 0XX,其中最後兩位XX表示10位地址空間的最高兩位(MSB);第一個字節的第八位R/W,表示數據的方向。註意,第一個字節前七位1111 1XX為預留,方便未來協議升級。

所有7位地址系統包括的讀/寫模式,在10位地址系統中同樣存在。舉例其中兩條如下:

  • 主發送器向10位地址的從接收器發送數據。如圖14所示,在整個過程中,數據傳送方向沒有改變。在START發起之後,所有從機對比總線上第一個字節的前七位(1111 0XX)是否和自身地址一致,並檢測第八位是否為0(寫)。可能有一個以上設備會檢測到地址匹配(因為只對比了10位地址的最高2位),它們都會產生響應A1。接下來,所有上面響應的從機對比總線上第二個字節和它們各自地址的後八位(XXXX XXXX)是否一致。只有一個設備的地址匹配,並產生響應A2。被尋址的從機一直受主機控制,直到STOP或Sr指向另外的地址;

技術分享圖片

圖14. 主發送器尋址從接收器(10位地址空間)

  • 主接收器讀取10位地址的從發送器發送的數據。數據傳送方向在第二個R/W後發生改變。如圖15所示,A2之前的操作和主發送器向從接收器寫數據沒有區別。通過Sr,匹配地址的從機得知它就是被尋址的設備,接下來從機檢測Sr後的七個比特是否和先前START後的七比特一致(1111 0XX),並檢測第八位(R/W)是否為1。如果是,則從機據此判斷它被尋址並將要作為發送器往總線上發送數據,此時從機產生響應A3。從機一直占用總線,直到接收到STOP或Sr指向另一個從機地址。收到Sr信號後,所有從機都會對比Sr後第一個字節的前七位(1111 0XX),並檢測該字節的第八位(R/W)。對於10位地址設備R/W=1,對於7位地址設備,地址(1111 0XX)不匹配,因此這些設備都不會響應Sr,不會被尋址。

技術分享圖片

圖15. 主接收器尋址從發送器(10位地址空間)

3.保留地址

I2C系統保留地址如表2所示:

技術分享圖片

表2. I2C保留地址

4.通用廣播地址

通用廣播地址是為了尋址總線上所有設備。如果一個設備不需要使用廣播功能,可以不響應廣播。如果設備需要使用廣播功能,則它在檢測到廣播地址後發送響應,並作為從接收器讀取總線上發送的數據。主機不知道總線上有多少從機發送響應。總線上所有可以響應廣播的從機讀取廣播地址後的第二個及後面的字節。不能處理這些廣播數據的從機通過不發送響應的方式忽略它。同樣地,如果有一個或一個以上的從機發送響應,則主機就檢測不到總線上其它沒有響應的設備。廣播消息的含義總是定義在第二個字節(圖16)。

技術分享圖片

圖16. 廣播消息格式

有兩種可能情況:

  • 最低位“B”為0
  • 最低位“B”為1

“B”為0,第二個字節包括以下定義:

  • 0000 011006h:復位並通過硬件寫內容到從機的可編程部分。所有可以響應此類廣播的從機,收到此兩字節後,進行復位並進入它們地址的可編程部分。註意確保設備在加電後不會將SDA或SCL拉低,因為這些低電平會阻塞總線;
  • 0000 010004h:通過硬件寫內容到從機的可編程部分,作用類似(06h),但設備不會復位;
  • 0000 000000h:這個不應該作為第二個字節用。

編程時序參考相應設備的DATASHEET。

“B”為1,兩字節廣播定義為“硬件廣播”。主機(如鍵盤掃描器)在編程後,可以發送既定的從機地址到總線上,構成兩字節序列的“硬件廣播”。既然主機可能並不知道總線上從機的地址,它只能通過硬件廣播的方式,將自身地址通知給系統。如圖17所示:

技術分享圖片

圖17. 主發送器的數據傳輸格式(硬件廣播)

硬件廣播的第二個字節的前七位包括主機的地址。總線上的智能設備如微控制器,讀取此地址並接收主機發送的其它信息。如果主機也可以作為從機使用,則以上讀取的主機地址實際上也就是(切換主從模式後的)從機地址。

在系統中,一種可能是系統復位後設備由主機發送模式切換到從機接收模式,這時由系統主機先告訴硬件主機數據應送往的從機地址,這樣當硬件主機發送數據時就可以直接向指定從機(地址)發送數據了。

五、其它說明

1.軟件復位

通用廣播地址0000 0000後發送0000 0110(06h)可以使總線上設備進入復位過程。該功能是可選的,所有預留該功能的設備在收到該兩字節序列(00 06h)後,開始響應(復位),並進入它們地址的可編程部分。註意確保設備在加電後不會將SDA或SCL拉低,因為這些低電平會阻塞總線。

2.START字節

起始字節是提供給沒有I2C總線接口的單片機查詢I2C總線時使用的特殊字節。

不具備I2C總線接口的單片機,必須通過軟件不斷地檢測總線,以便及時響應總線請求。單片機的速度與硬件接口器件的速度可能存在較大的差別。為此,I2C上的數據傳送需要一個較長的起始過程加以引導。引導過程由起始信號、起始字節、應答位、重復起始信號(Sr)組成。

技術分享圖片

圖18. 起始字節

請求訪問總線的主機發出開始條件(S)後,緊接著發送起始字節 0000 0001,總線上的單片機可以用比較低的速率采樣SDA線,直到檢測到起始字節中的7個“0”中的一個為止。在檢測到SDA上的高電平後,單片機可以切換到較高的采樣速率,采樣作為同步信號使用的第二個起始信號Sr。

在起始信號後的應答時鐘脈沖僅僅是為了和總線所使用的格式一致,並不要求設備在這個脈沖期間作應答。

3.Bus Clear

SCL:一般情況下,SCL不會擁堵(stuck)在低電平,出現這種情況的話,如果設備包含硬件復位引腳,推薦使用硬件復位。如果設備沒有硬件復位引腳,可以通過重新上電方式觸發設備內部上電復位電路(Power-On Reset Circuit)

SDA:如果SDA擁堵在低電平,主機應發送9個時鐘脈沖,那些將SDA拉低的設備在這9個時鐘周期內應釋放總線。如果沒有的話,則需要通過硬件復位或重新上電的方式清除擁堵。

4.設備號

設備號由三個字節(24bit)組成,包括以下信息:

  • 12位廠商編號,每個廠商具有唯一的編號(如NXP);
  • 9位設備編號,由廠商自定義(如PCA9698);
  • 3位版本號,由廠商自定義(如RevX)

技術分享圖片

圖19. 設備號編碼規則

參考資料

I2C-bus specification and user manual Rev.6

http://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/i2c-bus/general-introduction/i2c-bus-hardware.html

http://www.lammertbies.nl/comm/info/I2C-bus.html

http://www.analog.com/static/imported-files/application_notes/54305147357414AN686_0.pdf

http://www.ti.com/lit/an/scaa106/scaa106.pdf

http://www.totalphase.com/support/articles/200349176-7-bit-8-bit-and-10-bit-I2C-Slave-Addressing#8bit

來源

【轉】I2C總線協議