I²C

<image>

I²C（Inter-Integrated Circuit）字面上的意思是積體電路之間，它其實是I²C Bus簡稱，所以中文應該叫積體匯流排電路，它是一種串列通訊匯流排，使用多主從架構，由飛利浦公司在1980年代為了讓主機板、嵌入式系統或手機用以連接低速週邊裝置而發展。自2006年10月1日起，使用I²C協定已經不需要支付專利費，但製造商仍然需要付費以取得I²C從屬裝置位址。

## 設計概說

(啟始)-控制-指令-資料-(結束)

(啟始)-控制0-指令-(r啟始)-控制1-資料-(結束)

<image>

<image>

I²C只使用兩條雙向漏極開路（Open Drain）線，其中一條線為傳輸數據的串列資料線（SDA, Serial DAta line），另一條線是啟動或停止傳輸以及發送時鐘序列的串列時脈（SCL, Serial CLock line）線，這兩條線都必須外接上拉電阻。I²C允許相當大的工作電壓範圍，但典型的電壓準位為+3.3V或+5V。

I²C的參考設計使用一個7位元長度的位址空間但保留了16個位址，所以在一組匯流排最多可和112個節點通訊。常見的I²C匯流排依傳輸速率的不同而有不同的模式：標準模式（100 kbit/s）、低速模式（10 kbit/s），但時脈頻率可被允許下降至零，這代表可以暫停通訊。而新一代的I²C匯流排可以和更多的節點（支援10位元長度的位址空間）以更快的速率通訊：快速模式（400 kbit/s）、快速+模式（1 Mbit/s）高速模式（3.4 Mbit/s）超高速模式（5 Mbit/s）。

雖然最大的節點數目是被位址空間所限制住，但實際上也會被匯流排上的總電容所限制住，一般而言為400 pF。

<image>

### 參考設計

I²C僅使用兩個雙向開漏線，串列數據線（SDA）和串列時鐘線（SCL），以及上拉電阻。使用的典型電壓是+5 V或+3.3 V（雖然其他電壓系統也是允許的）。

在I²C參考設計中，使用7或10位（取決於所使用的設備）地址空間。普通I²C總線速度為100 kbit / s的標準模式和10 kbit / s的低速模式，但任意低時鐘頻率也是允許的。I²C的最新修訂可以承載更多的節點，並以更快的速度運行。這些速度被更廣泛地使用在嵌入式系統中而不是PC上。I²C也有其他的特性，例如16位尋址。

請注意，這裡引用的比特率為主節點和從節點之間沒有時鐘延長或其他硬體開銷的傳輸比特率。協議開銷包括一個字節從地址（或許還有從設備內部寄存器地址）以及每個字節的ACK / NACK比特。因此這意味著，使用者數據的實際傳輸速率要低於峰值比特率。例如，如果與從設備以低效的每次僅一個字節數據進行傳輸，數據率將比峰值比特率少於一半（因為其餘的時鐘需要發送一個字節地址和ACK比特）。

節點的最大數量受限於地址空間以及400 pF的總總線電容。400 pF總電容也限制了實際通訊距離只有幾米。

如上所述，參考設計為使用串列數據線（SDA）和串列時鐘線（SCL）、擁有7位元尋址空間的總線。

總線上有兩種類型角色的節點：

- 主節點 - 產生時鐘並發起與從節點的通訊
- 從節點 - 接收時鐘並響應主節點的尋址

該總線是一種多主控總線，即可以在總線上放置任意多主節點。此外，在停止位元（STOP）發出後，一個主節點也可以成為從節點，反之亦然。

總線上有四種不同的操作模式，雖然大部分設備只作為一種角色和使用其中兩種操作模式：

- 主節點發送 - 主節點發送數據給從節點
- 主節點接收 - 主節點接收從節點數據
- 從節點發送 - 從節點發送數據給主節點
- 從節點接收 - 從節點接收主節點數據

一開始，主節點處於主節點發送模式，發送起始位元（START），跟著發送希望與之通訊的從節點的7位元地址，最後再發送1位讀寫位元，該位元表示主節點想要與從節點進行讀（1）還是寫（0）操作。

如果從節點在總線上，它將以ACK字元應答（低態觸發）該地址。主節點收到應答後，根據它發送的讀寫位元，處於發送模式或者接收模式，從節點則處於對應的相反模式（接收或發送）。

地址和數據首先發送最高有效位。

起始位元在SCL為高時，由SDA上準位從高變低表示；停止位元在SCL為高時，由SDA上準位從低變高表示。其他SDA上的準位變化在SCL為低時發生。

如果主節點想要向從節點寫數據，它將發送一個字節，然後從節點以ACK位元應答，如此重複。此時，主節點處於主節點發送模式，從節點處於從節點接收模式。

如果主節點想要讀取從節點數據，它將不斷接收從節點發送的一個個字節，在收到每個字節後發送ACK進行應答，除了接收到的最後一個字節。此時，主節點處於主節點接收模式，從節點處於從節點發送模式。

此後，主節點不是發送停止位元終止傳輸，就是發送另一個起始位元以發起另一次傳輸（即「組合消息」）。

## 修訂

年份｜版本｜最高速度｜註解｜PDF

1982｜Original｜100 kbit/s｜當時的I²C系統是一種簡單的內部匯流排系統，當時主要的用途在於控制由飛利浦所生產的晶片。｜n/a

1992｜1｜400 kbit/s｜新增了傳輸速率為400 kbit/s的快速模式及長度為10位元的定址模式，該模式下可容納最多1008個節點。這是最初的標準版本。｜n/a

1998｜2｜3.4 Mbit/s｜新增了傳輸速率為3.4Mbit/s的高速模式，並減小總線需要的電壓及電流以節省能源。｜n/a

2000｜2.1｜3.4 Mbit/s｜僅對2.0版做一些小修正，功能並無變化。

2007｜3｜3.4 Mbit/s｜新增了高速+模式，這一模式需要20 mA的電流來驅動。添加設備ID機制。

2012｜4｜5 Mbit/s｜增加5 MHz的超快速模式（UFM），這種模式是單工模式。使用帶有推輓輸出的新型USDA和USCS線，這兩條線上不再有上拉電阻。增加了製造商指定的ID表。

2012｜5｜5 Mbit/s｜修正錯誤。

2014｜6｜5 Mbit/s｜修正兩幅圖。這是目前最新的標準。

## 應用

<image>

<image>

I²C被應用在構造簡單且可以犧牲傳輸速度來降低製造成本的週邊上。一些常見的應用如下：

- 為了保存使用者的設定而存取NVRAM晶片。
- 存取低速的數位類比轉換器（DAC）和類比數位轉換器（ADC）。
- 改變監視器的對比度、色調及色彩平衡設定（VESA顯示數據頻道）。
- 控制小型液晶或OLED螢幕。
- 改變音量大小。
- 取得硬體監視及診斷資料，例如中央處理器的溫度及風扇轉速。
- 讀取實時時鐘（Real-time clock）。
- 在系統設備中用來開啟或關閉電源供應。

I²C的一個優勢在於其接腳數少。通過兩個接腳以及相應的軟體，微控制器就可以控制某一個網路內的設備，而使用其他技術則需要更多的接腳。而且，較少的接腳數可以減小封裝尺寸，進而減少重量及電源的消耗，這對於行動電話及手持式電腦而言格外重要。由於電腦工程師發現到對於整合電路設計而言，許多的製造成本源自於封裝尺寸及接腳數量，因而像I²C這樣的匯流排受到了廣泛應用。

週邊可以在系統仍然在運作的同時加入或移出匯流排，這代表對於有熱插拔需求的裝置而言是個理想的匯流排。

- arduino mega上的pin腳
- raspberry pi 4 上的pin腳

可參考arduino mega 轉 raspberry pi 4 i2c 3v轉5v的轉換電路

## 作業系統的支援

在Linux中，I²C已經列入了核心模組的支援了，更進一步的說明可以參考核心相關的文件及位於/usr/include/linux/i2c.h 的這個標頭檔。OpenBSD則在最近的更新中加入了I²C的架構（framework）以支援一些常見的主控端控制器及感應器。

## 限制

i2c在容易線長導致訊號品質不佳，速度越快能用的距離越短(一般約在10公分上下)，上拉電阻用小一點可能有幫助

i2c阻抗50,usb阻抗100在做訊號轉換時阻抗不匹配會造成訊號極差

## 外部連結

- Philips I2C specifications
- Detailed introduction, Primer
- Introduction to I2C
- I2C Bus / Access Bus
- Using the I2C Bus with Linux
- OpenBSD iic(4) manual page
- Linux package lm-sensors support I2C bus among others.
- massmind i2c page Source code, samples and technical information for using i2c with PC, PIC and SX microcontrollers.
- I2C bus
- Serial buses information page
- I2C Bus Technical Overview and Frequently Asked Questions
- The I2C Faq Version 2.0
- The Bus Buffer Resource. For 2-wire buses such as I2C, SMBus, PMBus, IPMB & IPMI
- I2C Licensing Information

## 基本資料

- 日語原文：I2C總線
- 類別：串列 總線
- 設計者：飛利浦半導體，現為恩智浦半導體
- 設計時間：1982年
- 數據信號：集電極開路
- 寬度：1-bit (SDA) with separate clock (SCL)
- 比特率：在不同模式下 0.1, 0.4, 1.0, 3.4 or 5.0Mbit/s
- 協議：串列, 半雙工