I2C(Inter-Integrated Circuit,内部集成电路)总线是一种由飞利浦半导体公司(现NXP)在20世纪80年代设计的简单、高效的双线制串行通信总线。它被广泛用于微控制器与各种外设(如传感器、存储器、数模转换器等)之间的短距离通信。
Inter-:之间、内部(更准确地说是“内部互联”的意思)
Integrated Circuit:集成电路
Circuit:电路
完整的Inter-Integrated Circuit意为“内部集成电路互联”,也就是芯片与芯片之间在同一块电路板上进行通信的协议,这也正是 I²C 总线得名的由来。
🔌 物理层与电气特性
I2C总线仅使用两条双向信号线即可实现多设备通信,极大地节省了PCB的布线空间和芯片引脚。
两条信号线:
SDA(串行数据线):用于在主设备(Master)和从设备(Slave)之间传输数据。
SCL(串行时钟线):由主设备产生的时钟信号,用于同步数据传输。
工作模式:I2C是一种半双工通信总线,意味着在同一时刻,数据只能在SDA线上单向传输。
开漏输出与上拉电阻:SDA和SCL线均采用开漏输出结构。这意味着线路本身只能将电平拉低,而无法主动输出高电平。因此,两条线必须通过上拉电阻(Rp)连接到正电源(VDD),以保证在空闲状态时保持高电平。上拉电阻的阻值选择很重要,阻值过大影响信号上升时间,过小则功耗过大。
逻辑电平:逻辑"0"通过将线路拉低至接地来实现,逻辑"1"则通过释放线路使其浮空至高电平(由上拉电阻拉高)来实现。I2C支持不同的电源电压,如5V、3.3V或1.8V。
设备寻址:总线上的每个从设备都有一个唯一的7位或10位地址。主设备通过发送目标地址来选择通信对象,无需额外的片选信号线。
⚙️ 协议层与通信时序
I2C通信由主设备发起和终止,遵循一套严格的时序规则。
1. 起始与停止条件
这是所有I2C通信的起始和终止标志:
起始条件:当SCL为高电平时,SDA线从高电平向低电平切换(下降沿)。总线被标记为"忙"。
停止条件:当SCL为高电平时,SDA线从低电平向高电平切换(上升沿)。总线被释放,重新回到"空闲"状态。
重复起始条件:在主设备不释放总线控制权的情况下,发起另一次起始条件,用于改变数据传输方向或寻址另一个从设备。
2. 数据有效性
在SCL为高电平期间,SDA线上的数据必须保持稳定。只有当SCL为低电平时,SDA线的电平状态才能改变。唯一的例外是起始和停止条件。
3. 字节格式与应答机制
数据传输:数据以字节(8位)为单位传输,首先传输最高有效位(MSB)。每次传输的字节数没有限制。
应答位:每个字节传输完成后(即第9个SCL时钟周期),发送方会释放SDA线,由接收方控制。接收方需将SDA线拉低以产生一个应答位,表示"ACK";若SDA保持高电平,则为非应答,表示"NACK"。
ACK:接收器在第9个时钟周期将SDA拉低,表示成功收到一个字节。
NACK:接收器在第9个时钟周期释放SDA(保持高电平)。可能原因包括:总线上无对应地址的设备、接收器忙无法接收数据、或主设备作为读取方时,在读完最后一个字节后发出NACK以通知从设备停止发送。
4. 典型的数据传输流程
完整的一次写/读操作遵循以下步骤:
写数据流程:
主设备发送起始条件。
主设备发送7位从设备地址 + 1位写标志位(0)。
被寻址的从设备返回ACK。
主设备发送8位数据(如寄存器地址或实际数据),从设备每接收一个字节便返回一个ACK。
主设备发送停止条件,结束通信。
读数据流程(随机读):
主设备发送起始条件。
主设备发送从设备地址 +写标志位(0),从设备ACK。
主设备发送要读取的寄存器地址,从设备ACK。
主设备再次发送重复起始条件。
主设备发送从设备地址 +读标志位(1),从设备ACK。
从设备向主设备发送数据。主设备为每个收到的字节返回ACK,但在接收最后一个字节后返回NACK。
主设备发送停止条件,结束通信。
📊 传输速率与模式
I2C协议经过多年发展,定义了多种速率模式以适应不同需求,所有模式均向下兼容。
| 模式 | 传输速率 | 主要特点 |
|---|---|---|
| 标准模式 | 100 kbit/s | 最基础的模式,最初定义 |
| 快速模式 | 400 kbit/s | 1992年引入,大幅提升速度 |
| 快速模式+ | 1 Mbit/s | 2007年引入,用于需要更高速率的设备 |
| 高速模式 | 3.4 Mbit/s | 1998年引入,需要特殊的时序和电平 |
| 超快速模式 | 5 Mbit/s | 2012年引入,为单向、无ACK的高速传输设计 |
💡 高级特性与应用
多主模式与仲裁:I2C支持多个主设备连接在同一条总线上。当两个主设备同时发起通信时,会通过"线逻辑与"进行仲裁:一个主设备发送"1"而另一个发送"0"时,发送"0"的设备会将SDA线拉低,发送"1"的设备检测到SDA并非高电平,就会退出竞争。此机制保证了数据传输不丢失。
时钟延展:当从设备处理速度跟不上主设备时,它可以在主设备释放SCL后,主动将SCL线拉低,强制主设备进入等待状态,直到从设备处理完毕并释放SCL。需要注意,并非所有主设备都支持此功能。
10位寻址:除了标准的7位地址,I2C还支持10位寻址,可与7位地址设备共存于同一总线,从而连接最多1008个节点,突破了112个节点的限制。
I2C凭借其简洁高效的架构,已成为嵌入式系统中不可或缺的通信标准。