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
- 协议：串列, 半双工