I2C

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

## 設計概說

* 一般 I²C 晶片常用的傳輸格式有下列二種:

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

I²C 只使用兩條雙向汲極開路（Open Drain）線，其中一條線為傳輸資料的串列資料線（SDA），另一條線是啟動或停止傳輸以及傳送時鐘序列的串列時脈（SCL）線，這兩條線上都有上拉電阻。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。

### 參考設計

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 進行應答，除了接收到的最後一個位元組。此時，主節點處於**主節點接收**模式，從節點處於**從節點傳送**模式。

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

## 修訂

## 應用

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）以支援一些常見的主控端控制器及感應器。

## 工具開發

### I²C 主機配接器

### I²C 協定分析儀

### 邏輯分析儀

## 限制

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

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

* 上升電阻計算:

## 衍生技術

## 參見

* 序列周邊介面
* I²S
* 1-Wire Bus
* Serial Peripheral Interface Bus
* SMBus

## 參考資料

## 註釋

## 外部連結

* 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