I2C總線協議學習筆記


I2C(Inter-Integrated Circuit:內置集成電路)總線的概念:

        I2C通訊只需要2條雙向總線——一條數據線SDA(serial data:串行數據線),一條時鍾線SCL(serial clock:串行時鍾線)。SDA線用於傳輸數據,SCL線用於同步數據收發。SDA線傳輸數據是大端傳輸(字節高位先傳),每次傳輸8bit,即1字節。支持多主控(multi-mastering),任何時間點只能有一個主控。每個連接到總線的設備都有一個獨立的地址addr,共7個bit,主機正是利用該地址對設備進行訪問。SDA和SCL總線都需要連接上拉電阻,當總線空閑時,兩根線均為高電平。連接到總線上的任意器件輸出低電平都會將總線信號拉低,即各器件的SDA和SCL都是線與的關系。多個主機同時使用總線時,需要用仲裁方式決定哪個設備占用總線,不然數據將會產生沖突。

 

I2C總線的位傳輸

數據傳輸:SCL為高電平時,SDA線必須保持穩定,SDA上傳輸1個bit數據;數據改變:SCL為低電平時,SDA線才可以改變電平。

 

I2C總線的開始和結束信號

開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。起始信號由主控制器產生。

結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數據。結束信號也只能由主控制器產生。

 

I2C總線的字節格式

發送到SDA線上的每個字節必須是8位,每次傳輸可以發送的字節數量不受限制,每個字節后必須跟一個ACK應答位,數據從最高有效位(MSB)開始傳輸。如果從機要完成一些其他功能后(如一個內部中斷服務程序)才能接收或發送下一個完整的字節,可以使時鍾線SCL保持低電平迫使主機進入等待(wait)狀態。當從機准備好新的字節數據傳輸時,釋放時鍾線SCL,數據傳輸便繼續進行。

 

I2C應答信號ACK/NACK

主機每發送完8bit數據后等待從機ACK。即在第9個clock,若從機發回ACK,SDA會被拉低。若沒有ACK,SDA會被置高,這會引起主控發生RESTART或STOP流程。相關的響應時鍾脈沖由主機產生,在相應的時鍾脈沖期間,發送器釋放SDA線(高電平)。在響應的時鍾脈沖期間,接收器必須將SDA線拉低,使它在這個時鍾脈沖的高電平期間保持穩定的低電平。通常,被尋址的接收器在接收到的每個字節后,必須產生一個響應,當從機不能響應從機地址時,從機必須使數據線保持高電平,主機然后產生一個停止條件終止傳輸或者產生重復起始條件開始新的傳輸。

 

I2C總線上的所有數據都是以8位字節傳送的,發送器每發送一個字節,就在時鍾脈沖9期間釋放數據線,由接收器反饋一個應答信號。應答信號為低電平時,規定為有效應答位(ACK簡稱應答位),表示接收器已經成功地接收了該字節;應答信號為高電平時,規定為非應答位(NACK),一般表示接收器接收該字節沒有成功。 對於反饋有效應答位ACK的要求是,接收器在第9個時鍾脈沖之前的低電平期間將SDA線拉低,並且確保在該時鍾的高電平期間為穩定的低電平。 如果接收器是主控器,則在它收到最后一個字節后,發送一個NACK信號,以通知被控發送器結束數據發送,並釋放SDA線,以便主控接收器發送一個停止信號P。

SDA 線上發送的每個字節必須為8 位,其后必須跟一個響應位。傳輸過程中每次可以發送的字節數量不受限制。首先傳輸的是數據的最高位(MSB)。 如果從機要在完成一些其他功能之后才能接收或發送下一個完整的數據字節,則可以使時鍾線SCL 保持低電平,從而迫使主機進入等待狀態。當從機准備好接收下一個數據字節,並且釋放時鍾線SCL 后,數據傳輸繼續。

I2C總線傳輸的每個字節為8位,受控的器件在接收到8位數據后,在第9個時鍾脈沖必須輸出低電平作為應答信號,同時,要求主控制器在第9個時鍾脈沖位上釋放SDA線,以便受控器發出應答信號,將SDA線拉低,表示接收數據的應答(ACK)。如果在第9個時鍾周期收到非應答信號(NACK),則表示停止數據的發送或接收。

I2C總線必須由主器件控制,即必須由主控器產生開始信號、停止信號和時鍾信號。在時鍾信號為高電平期間,數據線上的數據必須保持穩定,數據線上的數據狀態僅在時鍾為低電平期間才可以改變,而當時鍾線為高電平期間,數據線上數據的改變被用來表示起始和停止條件。需要說明的是,當主控器接收數據時,在最后一個數據字節,必須發送一個非應答信號(NACK),使受控器釋放數據線,以便主控器產生一個停止信號來終止總線的數據傳送。

 

 

I2C時鍾同步

SCL線被有最長低電平周期的器件保持低電平,此時,低電平周期短的器件會進入高電平的等待狀態。當所有的器件數完它們的低電平周期后,時鍾線被釋放並變成高電平,所有的器件開始數它們的高電平周期,最先完成高電平周期的器件會再次將SCL線拉低。所以,產生的同步SCL時鍾的低電平周期由低電平時鍾周期最長的器件決定,而SCL時鍾的高電平時鍾周期由高電平時鍾周期最短的器件決定。

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

SCL同步是由於總線具有“線與”的邏輯功能,即只要有一個節點發送低電平時,總線上就表現為低電平。當所有的節點都發送高電平時,總線才能表現為高電平。正是由於“線與”邏輯功能的原理,當多個節點同時發送時鍾信號時,在總線上表現的是統一的時鍾信號,這就是SCL的同步原理。

 

I2C總線的仲裁機制

當SCL線是高電平時,仲裁在SDA線上發生。在其他主機發送低電平時,發送高電平的主機將會斷開它的數據傳輸級,因為總線上的電平與它自己的電平不同(線與連接)。

假設主控器1要發送的數據DATA1為“101 ……”;主控器2要發送的數據DATA2為“1001 ……”總線被啟動后兩個主控器在每發送一個數據位時都要對自己的輸出電平進行檢測,只要檢測的電平與自己發出的電平一致,他們就會繼續占用總線。在這種情況下總線還是得不到仲裁。當主控器1發送第3位數據“1”時(主控器2發送“0”),由於“線與”的結果SDA上的電平為“0”,這樣當主控器1檢測自己的輸出電平時,就會測到一個與自身不相符的“0”電平。這時主控器1只好放棄對總線的控制權;因此主控器2就成為總線的唯一主宰者。

SDA線的仲裁也是建立在總線具有線“與”邏輯功能的原理上的。節點在發送1位數據后,比較總線上所呈現的數據與自己發送的是否一致。是,繼續發送;否則,退出競爭。SDA線的仲裁可以保證I2C總線系統在多個主節點同時企圖控制總線時通信正常進行並且數據不丟失。總線系統通過仲裁只允許一個主節點可以繼續占據總線。

上圖是以兩個節點為例的仲裁過程。DATA1和DATA2分別是主節點向總線所發送的數據信號,SDA為總線上所呈現的數據信號,SCL是總線上所呈現的時鍾信號。當主節點1、2同時發送起始信號時,兩個主節點都發送了高電平信號。這時總線上呈現的信號為高電平,兩個主節點都檢測到總線上的信號與自己發送的信號相同,繼續發送數據。第2個時鍾周期,2個主節點都發送低電平信號,在總線上呈現的信號為低電平,仍繼續發送數據。在第3個時鍾周期,主節點1發送高電平信號,而主節點2發送低電平信號。根據總線的線“與”的邏輯功能,總線上的信號為低電平,這時主節點1檢測到總線上的數據和自己所發送的數據不一樣,就斷開數據的輸出級,轉為從機接收狀態。這樣主節點2就贏得了總線,而且數據沒有丟失,即總線的數據與主節點2所發送的數據一樣,而主節點1在轉為從節點后繼續接收數據,同樣也沒有丟掉SDA線上的數據。因此在仲裁過程中數據沒有丟失。

總結:SDA仲裁和SCL時鍾同步處理過程沒有先后關系,而是同時進行的。

 

不難看出:

①對於整個仲裁過程主控器1和主控器2都不會丟失數據;

②各個主控器沒有對總線實施控制的優先級別;

③總線控制隨機而定,遵循“低電平優先”的原則,即誰先發送低電平誰就會掌握對總線的控制權。

根據上面的描述,“時鍾同步”與“總線仲裁”可以總結如下規律:

①主控器通過檢測SCL線上的電平來調節與從器件的速度同步問題——時鍾同步;

②主控器通過檢測SDA線上自身發送的電平來判斷是否發生總線“沖突”——總線仲裁。因此,I2C總線的“時鍾同步”與“總線仲裁”是靠器件自身接口的特殊結構得以實現的。

 

I2C總線的7位地址格式和7位尋址

  • SCL由master提供,只有master才能同時控制SCL和SDA。
  • SCL為低電平時才能改變數據,SCL為高電平時,數據有效。
  • 起始條件:當SCL為高電平時,master拉低SDA,總線進入start狀態。
  • 結束條件:當SCL為高電平時,master拉高SDA,總線進入stop狀態。
  • 無論是發送地址還是數據,其后都緊跟着一個ACK/NACK。ACK和NACK由slave提供。
  • ACK:在第9個CLK周期,slave拉低SDA,發送一個ACK。
  • NACK:在第9個CLK周期,slave保持SDA為高,發送一個NACK。
  • 一次可以傳輸多個字節,直到master發送start/stop。
  • 如果slave設備來不及處理data,它可以保持SCL為低,強制master進入等待狀態。

 

在起始條件(S)后,發送一個從機地址。地址共有7bit,緊接着的第8bit是數據的讀寫標志位 ——“0”表示寫,“1”表示讀。數據傳輸一般由主機產生停止位(P),但是如果主機仍希望在總線上通信,它可以產生重復起始條件(Sr)和尋址另一個從機,而不是首先產生一個停止條件。在這種傳輸中,可以有不同的讀/寫格式組合。

 

子地址:

帶有i2c總線的器件除了有從機地址(salve address)外,還可能有子地址。從機地址是指該器件在i2c總線上被主機尋址的地址,而子地址是指該器件內部不同器件或存儲單元的編址。例如,帶i2c接口的EEPROM就是擁有子地址器件的典型代表。

 

主機發送數據流程:

(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 信號了解從機的接收狀況,如果應答錯誤則重發。

 

主機接收數據流程:

(1)主機發送啟動信號后,接着發送命令字節(其中 R/W=1)

(2)對應的從機收到地址字節后,返回一個應答信號並向主機發送數據

(3)主機收到數據后向從機反饋一個應答信號

(4)從機收到應答信號后再向主機發送下一個數據

(5)當主機完成接收數據后,向從機發送一個“非應答信號(ACK=1)”,從機收到ASK=1 的非應答信號后便停止發送

(6)主機發送非應答信號后,再發送一個停止信號,釋放總線結束通信

注意:主機所接收數據的數量是由主機自身決定,當發送“非應答信號/A”時從機便結束傳送並釋放總線(非應答信號的兩個作用:前一個數據接收成功,停止從機的再次發送)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM