1. 程式人生 > >淺談I2C匯流排

淺談I2C匯流排

I2C(Inter Integrated Circuit,內部積體電路)匯流排是價格低廉卻很有效的用以互連小規模嵌入式系統內的外設的網路。I2C 匯流排有時候也叫作 IIC,它已有20多年的歷史了。I2C 介面和 SPI 介面的作用相同,但二者的使用方法有些不同。 
 
I2C 匯流排用兩根線來連線多支路匯流排中的多個裝置。這種匯流排是雙向、低速的,並與公共時鐘同步。可以直接將一個裝置接到 I2C 總線上或是從該總線上取下,而不會影響其他裝置。一些生產商比如 Microchip 公司、Philips 公司、Intel 公司等生產的小型微處理器都內建了 I2C 介面。I2C 匯流排的資料傳輸率比 SPI 匯流排要慢一些,在標準模式下的傳輸速度為 100kbps,在快速模式下為 400kbps。 
 
利用 I2C 介面在裝置之間進行連線使用的兩根線是 SDA(序列資料)和 SCL(序列時鐘),它們都是開漏,通過一個上拉電阻接到正電源,因此在不使用的時候扔保持高電平。使用 I2C 匯流排進行通訊的裝置驅動這兩根線變為低電平,在不使用的時候就讓它們保持高電平。每個連到 I2C 的裝置都有一個唯一地址,這個裝置可以是資料傳送者(匯流排主機)、接收者(匯流排從機),也可以二者都是。I2C 是多主機匯流排,這意味著可以有多個裝置充當匯流排主機的角色。 
 

 

這裡寫圖片描述
圖1. I2C匯流排連線圖

 

SDA 和 SCL 都是雙向的。SPI 匯流排有兩根單獨的線,分別用於兩個方向的通訊,而 I2C 匯流排不同,它使用同一根線來完成主機發送資料和接收從機響應。另外,與 SPI 匯流排具有多個工作模式不同,I2C 匯流排只有一個工作模式,時鐘線 SCL 和資料線 SDA 之間的時序關係很簡單直觀:當空閒的時候,SDA 和 SCL 都是高電平,只有 SDA 變為低電平,接著 SCL 也變為低電平時,才開始 I2C 匯流排的資料傳輸。當 SDA 和 SCL 都變為低電平時,就是告訴總線上的所有接收裝置資料包的傳輸開始了,在 SCL 變為低電平後,SDA 才傳送第一個有效資料位,這稱為開始條件。 
 


對於被傳輸的每一位,當 SCL 為低電平時在 SDA 上必須變為有效,該位是在 SCL 的上升沿對 SDA 上的資料位進行取樣的,也必須一直保持有效直到 SCL 再次變為低電平,然後 SDA 就在 SCL 再次變為高電平之前傳輸下一位。 
 


最後,SCL 變為高電平,接著 SDA 也變為高電平,資料傳輸結束。這被稱為結束條件。 
 

這裡寫圖片描述
圖2. I2C匯流排傳輸的開始條件和結束條件

 

無論多大的資料包都可以通過 I2C 匯流排進行傳輸。像 SPI 匯流排一樣,I2C 也是高位先傳輸。如果資料接收者無法再接收更多的資料,它可以通過將SCL保持低電平來中斷傳輸,這樣可以迫使資料傳送者等待,直到 SCL 被重新釋放。 
 


傳送方發出的每個位元組都必須經過接收方確認,每個位元組的第8位資料一旦傳送結束,傳送方就釋放資料線 SDA,然後主機在 SCL 上產生一個額外的時鐘脈衝,這會觸發接收方通過將 SDA 置為低電平來表示接收到的位元組進行確認。如果接收方沒有能將 SDA 置為低電平,傳送方就會中斷傳輸,並且採取適當的錯誤處理措施。 
 

這裡寫圖片描述
圖3. 帶有接收方確認的I2C資料包

 

由於 I2C 是多主機匯流排,因此存在同一時刻會有多個主機試圖開始資料傳輸的可能。SPI 匯流排使用一個獨立的片選端來使接收從機有效,每個 SPI 從機都有一個單獨的片選端,由主機驅動。I2C 沒有這樣的選擇機制,不過總線上的每個裝置都有一個唯一的地址,資料包傳輸時先發送地址位,接著才是資料。一個地址位元組由7個地址位和1個指示位組成。如果指示位是0,意味著這個傳輸是一個寫操作,被選中的從機將接收資料並將其作為輸入;如果指示位是1,就要求從機將資料傳送回主機。

 

I2C 匯流排還支援一個擴充套件的10位定址模式,可連線的外設數量可達1024個,使用7位定址模式的裝置和10位定址模式的裝置可以在同一個系統中混合使用。10位定址時,使用2個位元組來儲存地址。如果第1個地址位元組以0b11110xx_開始,就會產生一個10位地址,第1個位元組的第1、2位(第0位是讀寫指示位)和第2個位元組的8位合起來構成10位的地址。而7位裝置將會忽略這個過程。 
 

這裡寫圖片描述
圖4. I2C普通的和帶重複開始條件的7位地址格式 
 

這裡寫圖片描述
圖5. I2C匯流排10位地址格式

原文:https://blog.csdn.net/lu_embedded/article/details/51535681