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从属设备地址[1]。
设计概说
- 一般 I²C 芯片常用的传输格式有下列二种:
(启始)-[控制]-[指令]-[资料]-(结束)
(启始)-[控制0]-[指令]-(r启始)-[控制1]-[资料]-(结束)
I²C只使用两条双向漏极开路(Open Drain)线,其中一条线为传输数据的串行资料线(SDA, Serial DAta line),另一条线是启动或停止传输以及发送时钟序列的串行主频(SCL, Serial CLock line)线,这两条线上都有上拉电阻[2]。I²C允许相当大的工作电压范围,但典型的电压准位为+3.3V或+5v。
I²C的参考设计使用一个7比特长度的地址空间但保留了16个地址,所以在一组总线最多可和112个节点通信[a]。常见的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的最新修订可以承载更多的节点,并以更快的速度运行[b]。这些速度被更广泛地使用在嵌入式系统中而不是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进行应答,除了接收到的最后一个字节。此时,主节点处于主节点接收模式,从节点处于从节点发送模式。
此后,主节点不是发送停止比特终止传输,就是发送另一个起始比特以发起另一次传输(即“组合消息”)。
修订
年份 | 版本 | 最高速度 | 注解 | |
---|---|---|---|---|
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版做一些小修正,功能并无变化。 | [3] |
2007 | 3 | 3.4 Mbit/s | 新增了高速+模式,这一模式需要20 mA的电流来驱动。添加设备ID机制。 | [4] |
2012 | 4 | 5 Mbit/s | 增加5 MHz的超快速模式(UFM),这种模式是单工模式。使用带有推挽输出的新型USDA和USCS线,这两条线上不再有上拉电阻。增加了制造商指定的ID表。 | [5] |
2012 | 5 | 5 Mbit/s | 修正错误。 | [6] |
2014 | 6 | 5 Mbit/s | 修正两幅图。这是目前最新的标准。 | [2] |
应用
I²C被应用在构造简单且可以牺牲传输速度来降低制造成本的外设上。一些常见的应用如下:
- 为了保存用户的设置而访问NVRAM芯片。
- 访问低速的数字模拟转换器(DAC)和模拟数字转换器(ADC)。
- 改变监视器的对比度、色调及色彩平衡设置(VESA显示数据频道)。
- 控制小型液晶或OLED屏幕。
- 改变音量大小。
- 获取硬件监视及诊断资料,例如中央处理器的温度及风扇转速。
- 读取实时时钟(Real-time clock)。
- 在系统设备中用来开启或关闭电源供应。[8]
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在做信号转换时阻抗不匹配会造成信号极差
- 上升电阻计算:
派生技术
参见
参考资料
注释
外部链接
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.