I2C協議

weixin_34402090發表於2013-06-07

什麼是I2C協議?

I2C協議是微控制器與其它晶片常用的通訊協議,由於只需要兩根線,所以很好使用。

 1. I2C匯流排的特點

(1)只要求兩條匯流排線路 一條序列資料線SDA 一條序列時鐘線SCL 

(2) 每個連線到匯流排的器件都可以通過唯一的地址和一直存在的簡單的主機/從機關係軟體設定地址;主機可以作為主傳送器或主機接收器 

(3)它是一個真正的多主機匯流排,如果兩個或更多主機同時初始化資料傳輸可以通過沖突檢測和仲裁防止資料被破壞 

(4)序列的 8 位雙向資料傳輸位速率在標準模式下可達 100kbit/s 快速模式下可達 400kbit/s 高速模式下可達.4Mbit/s 

(5)片上的濾波器可以濾去匯流排資料線上的毛刺波保證資料完整

(6) 連線到相同匯流排的IC數量只受到匯流排的最大電容400pF 限制

I2C協議匯流排訊號時序分析

1 .資料的有效性:

SDA線上的資料必須在時鐘的高電平週期保持穩定資料線的高或低電平狀態只有在 SCL線的時鐘訊號是低電平時才能改變。

2 .起始和停止條件

當SCL線是高電平時,SDA線從高電平向低電平切換,這個情況表示起始條件。

當SCL線是高電平時,SDA線由低電平向高電平切換表示停止條件。如圖3.2 I2C起始和停止條件所示。

3. 匯流排空閒狀態

SDA和SCL兩條訊號線都處於高電平,即匯流排上所有的器件都釋放匯流排,兩條訊號線各自的上拉電阻把電平拉高;

4 .資料傳輸與應答訊號ACK

傳送到SDA線上的資料必須是8位的。每次傳輸可以傳送的資料不受限制。每個位元組後必須在時鐘的第9個脈衝期間釋放資料匯流排(SDA為高),
由接收器傳送一個ACK(把資料匯流排的電平拉低)來表示資料成功接收。如圖3.3 I2C匯流排響應。

首先傳輸的是資料的最高位(MSB)。如果從機要完成一些其他功能後(例如一個內部中斷服務程式)才能接收或傳送下一個完整的資料位元組,
可以使時鐘SCL保持低電平迫使主機進入等待狀態。當從機準備好接收下一個資料位元組並釋放時鐘線SCL後,資料傳輸繼續。如圖3.4 I2C匯流排資料傳輸所示。

4. 地址格式

資料的傳輸遵循如圖4.1 完整的資料傳送所示,在起始條件之後,傳送一個7位的從機地址,緊接著第8位是資料方向(R/ — W),0-表示傳送資料(寫),
1-表示接收資料(讀)。資料傳輸一般由主機產生的停止位(P)終止。但是如果主機仍希望在匯流排上通訊,它可以產生重複起始條件(Sr),和定址另一個從機,
而不是首先產生一個停止條件。在這種傳輸中,可能有不同的讀/寫格式結合。如圖3.5 I2C匯流排完整的資料傳輸。

 

現代電子系統中,有為數眾多的IC需要進行相互之間以及與外界的通訊。為了提供硬體的效率和簡化電路的設計,
PHILIPS開發了一種用於內部IC控制的簡單的雙向兩線序列匯流排I2C。I2C匯流排支援任何一種IC製造工藝,
並且PHILIPS和其他廠商提供了種類非常豐富的I2C相容晶片。作為一個專利的控制匯流排,I2C已經成為世界性的工業標準。
 
每個器件都有一個唯一的地址,而且可以是單接收的器件(例如:LCD驅動器)或者可以接收也可以傳送的器件(例如:儲存器)。
傳送器或接收器可以在主模式或從模式下操作,這取決於晶片是否必須啟動資料的傳輸還是僅僅被定址。I2C是一個多主匯流排,即它可以由多個連線的器件控制。
基本的I2C匯流排規範於20年前釋出,其資料傳輸速率最高為100Kbits/s,採用7位定址。但是由於資料傳輸速率和應用功能的迅速增加,
I2C匯流排也增強為快速模式(400Kbits/s)和10位定址以滿足更高速度和更大定址空間的需求。
I2C匯流排始終和先進技術保持同步,但仍然保持其向下相容性。並且最近還增加了高速模式,其速度可達3.4Mbits/s。
它使得I2C匯流排能夠支援現有以及將來的高速序列傳輸應用,例如EEPROM和Flash儲存器。


請問:為何IIC傳送過程中,其地址(slaver address)是7bits?
IIC的書上說:送入SDA中的每個位元組長度必須是8-bits,在IIC匯流排上,START訊號後,一個從地址(slave address)被傳送,
在該位元組中的bit7是一個讀寫選擇訊號,“0”表示寫,“1”表示讀。但在實際中傳送的地址是8bits的,如在我們門的一個系統中EDID的
地址是0xA0,這種矛盾怎麼解釋?請e-mail:xintan_chen@amlogic.com

你可能還沒理解到,因為第一個位元組(為slave address)由7位地址和一位R/W讀寫位組成的,這位元組是個器件地址。
首先,你要知道:常用IIC介面通用器件的器件地址是由種型別號,及定址碼組成的,共7位。
如格式如下:
  D7 D6 D5 D4 D3 D2 D1 D0
1-器件型別由:D7-D4 共4位決定的。這是由半導公司生產時就已固定此型別的了,也就是說這4位已是固定的。

 

2-使用者自定義地址碼:D3-D1共3位。這是由使用者自己設定的,通常的作法如EEPROM這些器件是由外部IC的3個引腳所組合
電平決定的(用常用的名字如A0,A1,A2)。這也就是定址碼。所以為什麼同一IIC匯流排上同一型號的IC只能最多共掛8片同種類晶片的原因了。
3-最低一位就是R/W位。這位不用我多說了。
這沒什麼矛盾可解釋,你再看看書本和多動腦子我想你很快就會明白的。

經你這麼一說,我大概明白了,謝謝!
按你的說法:在IIC傳送中,先傳送最高位D7,我現在明白為何在我們的系統中EDID有兩個地址是0xA0/0xA1,一個是讀地址,一個是寫地址,我以前還真沒搞懂

您好,有關I2C的傳送又來請教你了。

1st、 在我們系統的主晶片與MStar晶片的通訊過程中,傳送的第一個資料的最高位總是為低電平,比如我向某暫存器中先寫一個數(0xff),
再讀取該暫存器,讀出的資料的最高位總是為“0”(0x7f)。不過這種錯誤僅僅在第一個資料出現,以後的資料就正確了。

2nd、 在我們系統的主晶片與EEPROM晶片的通訊過程中,情況就更糟糕,不管向memory Addr 中寫什麼資料,然後再讀取
這個memory Addr中資料,出來的資料總是“0xff”(note:slaver Addr正確,晶片的電源ok,也沒有防寫WP=0),我實驗了兩塊板子,
不可能這兩塊板子的EEPROM都壞了吧!程式(與1st中的)是一樣的,只是slaver Addr發生改變。

從你的資料看來,我無法總判定是那裡或什麼問題;估計很大程式上是你的程式問題。
要知道,主機向從訪問時。
  1-先向匯流排發出晶片地址
  2-如果有晶片地址正確的晶片,會產生一個SDA上應答。
  3-接著主機再發出應答過的晶片發出將要所進行操作的片內地址。
  4-晶片地址正確的晶片,會再產生一個SDA上應答。
  5-此時如果是讀操作,從晶片將輸出資料到SDA上。如果是寫操作,主機會將資料寫到SDA上。
  就這樣可以完成了一個讀或寫的操作。當然這裡面還開始和停止位這些動作。
  對以此類的分析,我們一般建議學生使用我站銷售的虛擬示波器來做分析,用ezSDO虛擬示波器可以方便地為IIC匯流排進行分析,
  因為有較深圳的波動儲存功能。捕獲回來的波形後,可以進行分析比較等動作。
  以下就是一個例項波形,有關詳細看檢視本論壇上的虛擬示波器銷售專區中的文章

 

相關文章