李倩 發表於 2018-03-21 10:24:24
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位地址格式
打開APP閱讀更多精彩內容
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴