IIC序列匯流排的組成及工作原理

Real_Biter_Oliver發表於2019-01-26

I2C匯流排是PHLIPS公司推出的一種序列匯流排,是具備多主機系統所需的包括匯流排裁決和高低速器件同步功能的高效能序列匯流排。

I2C匯流排只有兩根雙向訊號線。一根是資料線SDA,另一根是時鐘線SCL。

I2C匯流排通過上拉電阻接正電源。當匯流排空閒時,兩根線均為高電平。連到匯流排上的任一器件輸出的低電平,都將使匯流排的訊號變低,即各器件的SDA及SCL都是線“與”關係

資料位的有效性規定
    I2C匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。

起始和終止訊號

    SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始訊號;SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止訊號。

起始和終止訊號都是由主機發出的,在起始訊號產生後,匯流排就處於被佔用的狀態;在終止訊號產生後,匯流排就處於空閒狀態。

接收器件收到一個完整的資料位元組後,有可能需要完成一些其它工作,如處理內部中斷服務等,可能無法立刻接收下一個位元組,這時接收器件可以將SCL線拉成低電平,從而使主機處於等待狀態。直到接收器件準備好接收下一個位元組時,再釋放SCL線使之為高電平,從而使資料傳送可以繼續進行。

主機向從機傳送資料,資料傳送方向在整個傳送過程中不變(注:有陰影部分表示資料由主機向從機傳送,無陰影部分則表示資料由從機向主機傳送。  A表示應答, A非表示非應答(高電平)。S表示起始訊號,P表示終止訊號)

主機在第一個位元組後,立即從從機讀資料

 

 在傳送過程中,當需要改變傳送方向時,起始訊號和從機地址都被重複產生一次,但兩次讀/寫方向位正好反相

I2C匯流排協議有明確的規定:採用7位的定址位元組(定址位元組是起始訊號後的第一個位元組)。
定址位元組的位定義 

 D7~D1位組成從機的地址。D0位是資料傳送方向位,為“0”時表示主機向從機寫資料,為“1”時表示主機由從機讀資料

主機傳送地址時,匯流排上的每個從機都將這7位地址碼與自己的地址進行比較,如果相同,則認為自己正被主機定址,根據R/T位將自己確定為傳送器或接收器

從機的地址由固定部分和可程式設計部分組成。在一個系統中可能希望接入多個相同的從機,從機地址中可程式設計部分決定了可接入匯流排該類器件的最大數目。如一個從機的7位定址位有4位是固定位,3位是可程式設計位,這時僅能定址8個同樣的器件,即可以有8個同樣的器件接入到該I2C匯流排系統中

主機可以採用不帶I2C匯流排介面的微控制器,如80C51、AT89C2051等微控制器,利用軟體實現I2C匯流排的資料傳送,即軟體與硬體結合的訊號模擬

典型訊號模擬
    為了保證資料傳送的可靠性,標準的I2C匯流排的資料傳送有嚴格的時序要求。I2C匯流排的起始訊號、終止訊號、傳送“0”及傳送“1”的模擬時序:

典型訊號模擬子程式:

(1)起始訊號
Void I2CStart(void)
{       SDA = 1;
    SomeNop(  );
    SCL = 1;
    SomeNop(  );
    SDA = 0;
    SomeNop(  );
}

(2)終止訊號
void I2cStop(void)
{
    SDA = 0;
    SomeNop(  );
    SCL = 1;
    SomeNop(  );
    SDA = 1;
    SomeNop(  );
}

 

相關文章