I²C

I2C bus
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-Bus
一个由单一主控端（一个微控制器）及三个从属节点（一个类比数位转换器）、一个数位类比转换器以及一另一个微控制器）所构成，并使用了上拉电阻Rp。
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个节点通讯应该为27＝128个，但是其中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。
Data transfer sequence

**参考设计**
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的最新修订可以承载更多的节点，并以更快的速度运行400 kbit / s的快速模式，1 Mbit / s的快速模式加上或FM +和3.4 Mbit / s的高速模式。这些速度被更广泛地使用在嵌入式系统中而不是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进行应答，除了接收到的最后一个字节。此时，主节点处于主节点接收模式，从节点处于从节点发送模式。
此后，主节点不是发送停止位元终止传输，就是发送另一个起始位元以发起另一次传输（即“组合消息”）。

**修订**

**应用**
STMicroelectronics 24C08: Serial EEPROM with I2C bus
ADC board with I2C interface
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 specificationsdate=20130511150526 -  Detailed introduction, Primer date=20201212104553 -  Introduction to I2C-  I2C Bus / Access Bus date=20200718131532 -  Using the I2C Bus with Linux date=20201201065448 -  OpenBSD iic(4) manual pagefix-attempted=yes - Linux package  lm-sensors support I2C bus among others.-  massmind i2c page date=20081007101600  Source code, samples and technical information for using i2c with PC, PIC and SX microcontrollers.-  I2C bus-  Serial buses information pagedate=20080719114000 -  I2C Bus Technical Overview and Frequently Asked Questions date=20090806082509 -  The I2C Faq Version 2.0-  The Bus Buffer Resource. For 2-wire buses such as I2C, SMBus, PMBus, IPMB & IPMI-  I2C Licensing Information