I²C

I²C（Inter-Integrated Circuit）字面上的意思是積體電路之間，它其實是I²C Bus簡稱，所以中文應該叫-{zh-hant:積體匯流排電路;zh-hans:集成电路总线}-，它是一種-{zh:串列;zh-hant:串列;zh-hans:串行}-通訊匯流排，使用多主從架構，由飛利浦公司在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）线，其中一条线为传输数据的-{zh:串列;zh-hant:串列;zh-hans:串行}-資料线（SDA, Serial DAta line），另一条线是启动或停止传输以及发送时钟序列的-{zh:串列;zh-hant:串列;zh-hans:串行}-時脈（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。

参考设计 

I²C仅使用两个双向开漏线，-{zh:串列;zh-hant:串列;zh-hans:串行}-数据线（SDA）和-{zh:串列;zh-hant:串列;zh-hans:串行}-时钟线（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总电容也限制了实际通訊距离只有几米。

如上所述，参考设计为使用-{zh:串列;zh-hant:串列;zh-hans:串行}-数据线（SDA）和-{zh:串列;zh-hant:串列;zh-hans:串行}-时钟线（SCL）、拥有7位元寻址空间的总线。
总线上有两种类型角色的节点：
 主节点 - 产生时钟并发起与从节点的通訊
 从节点 - 接收时钟并响应主节点的寻址

该总线是一种多主控总线，即可以在总线上放置任意多主节点。此外，在停止位元（STOP）发出后，一个主节点也可以成为从节点，反之亦然。

总线上有四种不同的操作模式，虽然大部分设备只作为一种角色和使用其中两种操作模式：
 主节点发送 - 主节点发送数据给从节点
 主节点接收 - 主节点接收从节点数据
 从节点发送 - 从节点发送数据给主节点
 从节点接收 - 从节点接收主节点数据

一开始，主节点处于主节点发送模式，发送起始位元（START），跟着发送希望与之通訊的从节点的7位元地址，最后再发送1位读写位元，该位元表示主节点想要与从节点进行读（1）还是写（0）操作。

如果从节点在总线上，它将以ACK字元应答（低態觸發）该地址。主节点收到应答后，根据它发送的读写位元，处于发送模式或者接收模式，从节点则处于对应的相反模式（接收或发送）。

地址和数据首先发送最高有效位。
起始位元在SCL为高时，由SDA上準位从高变低表示；停止位元在SCL为高时，由SDA上準位从低变高表示。其他SDA上的準位变化在SCL为低时发生。

如果主节点想要向从节点写数据，它将发送一个字节，然后从节点以ACK位元应答，如此重复。此时，主节点处于主节点发送模式，从节点处于从节点接收模式。

如果主节点想要读取从节点数据，它将不断接收从节点发送的一个个字节，在收到每个字节后发送ACK进行应答，除了接收到的最后一个字节。此时，主节点处于主节点接收模式，从节点处于从节点发送模式。

此后，主节点不是发送停止位元终止传输，就是发送另一个起始位元以发起另一次传输（即“组合消息”）。

修訂

應用 

I²C被應用在构造簡單且可以牺牲傳輸速度来降低製造成本的-{zh:週邊;zh-hant:週邊;zh-hans:外设}-上。一些常見的應用如下：

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

I²C的一個优势在於其接腳数少。通过两个接腳以及相应的软件，微控制器就可以控制某一个网络内的设备，而使用其他技术则需要更多的接腳。而且，较少的接腳数可以减小封装尺寸，进而減少重量及電源的消耗，這對於行動電話及手持式電腦而言格外重要。由于電腦工程師發現到對於整合電路設計而言，許多的製造成本源自於封裝尺寸及接腳數量，因而像I²C這樣的匯流排受到了广泛应用。

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

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

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

工具开发

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

串行总线