1. 程式人生 > >I2C匯流排訊號時序

I2C匯流排訊號時序

I2C匯流排訊號時序總結

匯流排空閒狀態 
  I2C匯流排匯流排的SDA和SCL兩條訊號線同時處於高電平時,規定為匯流排的空閒狀態。此時各個器件的輸出級場效電晶體均處在截止狀態,即釋放匯流排,由兩條訊號線各自的上拉電阻把電平拉高。

 

啟動訊號 
  在時鐘線SCL保持高電平期間,資料線SDA上的電平被拉低(即負跳變),定義為I2C匯流排匯流排的啟動訊號,它標誌著一次資料傳輸的開始。啟動訊號是一種電平跳變時序訊號,而不是一個電平訊號。啟動訊號是由主控器主動建立的,在建立該訊號之前I2C匯流排必須處於空閒狀態。
重啟動訊號 

  在主控器控制匯流排期間完成了一次資料通訊(傳送或接收)之後,如果想繼續佔用匯流排再進行一次資料通訊(傳送或接收),而又不釋放匯流排,就需要利用重啟動Sr訊號時序。重啟動訊號Sr既作為前一次資料傳輸的結束,又作為後一次資料傳輸的開始。利用重啟動訊號的優點是,在前後兩次通訊之間主控器不需要釋放匯流排,這樣就不會丟失匯流排的控制權,即不讓其他主器件節點搶佔匯流排。

 

重啟動訊號 
  在主控器控制匯流排期間完成了一次資料通訊(傳送或接收)之後,如果想繼續佔用匯流排再進行一次資料通訊(傳送或接收),而又不釋放匯流排,就需要利用重啟動Sr訊號時序。重啟動訊號Sr既作為前一次資料傳輸的結束,又作為後一次資料傳輸的開始。利用重啟動訊號的優點是,在前後兩次通訊之間主控器不需要釋放匯流排,這樣就不會丟失匯流排的控制權,即不讓其他主器件節點搶佔匯流排。

 

停止訊號 
  在時鐘線SCL保持高電平期間,資料線SDA被釋放,使得SDA返回高電平(即正跳變),稱為I2C匯流排的停止訊號,它標誌著一次資料傳輸的終止。停止訊號也是一種電平跳變時序訊號,而不是一個電平訊號,停止訊號也是由主控器主動建立的,建立該訊號之後,I2C匯流排將返回空閒狀態。

       不是在資料有效性中規定在SDA只能在SCL的低電平的時候變化,為何STAR,STOP不一樣?首先STAR和STOP不是資料,所以可以不遵守資料有效性中的規定,其它資料都遵守,而STAR和STOP“不遵守”導致STAR和STOP更容易被識別。這樣不是不遵守而是更有優勢。

    起始和停止條件一般由主機產生,匯流排在起始條件後被認為處於忙的狀態,在停止條件的某段時間後匯流排被認為再次處於空閒狀態。

    如果產生重複起始(Sr) 條件而不產生停止條件,匯流排會一直處於忙的狀態。此時的起始條件(S)和重複起始(Sr) 條件在功能上是一樣的。 
    如果連線到匯流排的器件合併了必要的介面硬體,那麼用它們檢測起始和停止條件十分簡便。但是沒有這種介面的微控制器在每個時鐘週期至少要取樣SDA 線兩次來判別有沒有發生電平切換。

 
資料位傳送 
  在I2C總線上傳送的每一位資料都有一個時鐘脈衝相對應(或同步控制),即在SCL序列時鐘的配合下,在SDA上逐位地序列傳送每一位資料。進行資料傳送時,在SCL呈現高電平期間,SDA上的電平必須保持穩定,低電平為資料0,高電平為資料1。只有在SCL為低電平期間,才允許SDA上的電平改變狀態。邏輯0的電平為低電壓,而邏輯1的電平取決於器件本身的正電源電壓VDD(當使用獨立電源時)。資料位的傳輸是邊沿觸發。

 

 

 

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

 

插入等待時間  
  
如果被控器需要延遲下一個資料位元組開始傳送的時間,則可以通過把時鐘線SCL電平拉低並且保持,使主控器進入等待狀態。一旦被控器釋放時鐘線,資料傳輸就得以繼續下去,這樣就使得被控器得到足夠時間轉移已經收到的資料位元組,或者準備好即將傳送的資料位元組。帶有CPU的被控器在對收到的地址位元組做出應答之後,需要一定的時間去執行中斷服務子程式,來分析或比較地址碼,其間就把SCL線鉗位在低電平上,直到處理妥當後才釋放SCL線,進而使主控器繼續後續資料位元組的傳送。

 

匯流排封鎖狀態  
  在特殊情況下,如果需要禁止所有發生在I2C總線上的通訊活動,封鎖或關閉匯流排是一種可行途徑,只要掛接於該總線上的任意一個器件將時鐘線SCL鎖定在低電平上即可。

 

匯流排競爭的仲裁 
        總線上可能掛接有多個器件,有時會發生兩個或多個主器件同時想佔用匯流排的情況,這種情況叫做匯流排競爭。I2C匯流排具有多主控能力,可以對發生在SDA線上的匯流排競爭進行仲裁,其仲裁原則是這樣的:當多個主器件同時想佔用匯流排時,如果某個主器件傳送高電平,而另一個主器件傳送低電平,則傳送電平與此時SDA匯流排電平不符的那個器件將自動關閉其輸出級。匯流排競爭的仲裁是在兩個層次上進行的。首先是地址位的比較,如果主器件定址同一個從器件,則進入資料位的比較,從而確保了競爭仲裁的可靠性。由於是利用I2C總線上的資訊進行仲裁,因此不會造成資訊的丟失。

         為何識別到“0”將丟失仲裁呢?因為對於OD門,只能驅動到低電平,釋放匯流排只能通過不驅動匯流排釋放,停止驅動即產生“1”,但是發現匯流排還是“0”,這說明還有主機在跟自己競爭匯流排使用權,自己線驅動到“1”,確檢測到“0”,那代表自己已經失去了仲裁。

  • 主機只能在匯流排空閒的時侯啟動傳送。兩個或多個主機可能在起始條件的最小持續時間tHD;STA 內產生一個起始條件,結果在總線上產生一個規定的起始條件。
  • 當SCL 線是高電平時,仲裁在SDA 線發生;這樣,在其他主機發送低電平時,傳送高電平的主機將斷開它的資料輸出級,因為總線上的電平與它自己的電平不相同。然後,進一步獲得其的判定條件:
  • 仲裁可以持續多位。首先是比較地址位。如果每個主機都試圖定址同一的器件,仲裁會繼續比較資料位(假設主機是傳送器),或者比較響應位(假設主機是接收器)。
  • I2C 匯流排的地址和資料資訊由贏得仲裁的主機決定,在仲裁過程中不會丟失資訊。丟失仲裁的主機可以產生時鐘脈衝直到丟失仲裁的該位元組末尾。
  • 在序列傳輸過程中時,一旦有重複的起始條件或停止條件傳送到I2C 匯流排的時侯,仲裁過程仍在進行。如果可能產生這樣的情況,有關的主機必須在幀格式相同位置傳送這個重複起始條件或停止條件。 
  • 此外,如果主機也結合了從機功能,而且在定址階段丟失仲裁,它很可能就是贏得仲裁的主機在定址的器件。那麼,丟失仲裁的主機必須立即切換到它的從機模式。
  • I2C 匯流排的控制只由地址或主機碼以及競爭主機發送的資料決定,沒有中央主機,匯流排也沒有任何定製的優先權。

                         

上圖顯示了兩個主機的仲裁過程當然可能包含更多的內容由連線到匯流排的主機數量決定此時產生DATA1 的主機的內部資料電平與SDA 線的實際電平有一些差別如果關斷資料輸出這就意味著匯流排連線了一個高輸出電平這不會影響由贏得仲裁的主機初始化的資料傳輸。

 

時鐘訊號的同步 
          在I2C總線上傳送資訊時的時鐘同步訊號是由掛接在SCL線上的所有器件的邏輯“與”完成的。SCL線上由高電平到低電平的跳變將影響到這些器件,一旦某個器件的時鐘訊號下跳為低電平,將使SCL線一直保持低電平,使SCL線上的所有器件開始低電平期。此時,低電平週期短的器件的時鐘由低至高的跳變並不能影響SCL線的狀態,於是這些器件將進入高電平等待的狀態。當所有器件的時鐘訊號都上跳為高電平時,低電平期結束,SCL線被釋放返回高電平,即所有的器件都同時開始它們的高電平期。其後,第一個結束高電平期的器件又將SCL線拉成低電平。這樣就在SCL線上產生一個同步時鐘。可見,時鐘低電平時間由時鐘低電平期最長的器件確定,而時鐘高電平時間由時鐘高電平期最短的器件確定。