I2C協議


什么是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總線進行分析,
  因為有較深圳的波動存儲功能。捕獲回來的波形后,可以進行分析比較等動作。
  以下就是一個實例波形,有關詳細看查看本論壇上的虛擬示波器銷售專區中的文章

 


免責聲明!

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



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