I²C 总线通信原理与时序
I²C(Inter-Integrated Circuit),又称 I2C 或 IIC,中文一般称为 集成电路总线。它是一种由 Philips(现 NXP)提出的 串行总线通信协议,常用于微控制器与外设之间的短距离通信,如 EEPROM、传感器、显示屏、RTC 等。
I²C 总线只需要 两根信号线即可完成通信:
SDA(Serial Data Line):串行数据线
SCL(Serial Clock Line):串行时钟线
I²C 信号定义
START 条件:SCL 高电平时,SDA 从高变低,边沿就是开始信号;
STOP 条件:SCL 高电平时,SDA 从低变高;
数据有效性:数据在 SCL 高电平时必须稳
1. I²C 总线发送一个字节的时序
I²C 通信过程由主机控制。发送一个字节的典型时序如下:
起始信号(START):当 SCL 保持高电平时,主机将 SDA 从高电平拉低,表示开始通信。
数据传输:
发送 8 位数据(高位在前)。
数据在 SCL 低电平时可以改变,而在 SCL 高电平时采样。
应答信号(ACK/NACK):
数据发送完第 8 位后,接收方在第 9 个 SCL 周期内将 SDA 拉低,表示 ACK 应答。
若读数据结束时,主机发送一个 NACK 表示不再需要数据。
2. I²C 写操作时序
通过 I²C 向从设备写数据的典型步骤如下:
主机发送 起始信号 START。
发送 7 位设备地址 + 1 位读写控制位(写操作时最后一位为
0
),共 8 位。从设备返回 ACK 应答。
主机逐字节发送要写入的数据,每发一个字节都要等待从设备的 ACK。
数据全部发送完后,主机发送 停止信号 STOP,释放总线。
3. I²C 读操作时序
读取从设备数据的过程稍复杂一些,通常需要 先写后读:
主机发送 起始信号 START。
发送 设备地址 + 写位(0),并等待从设备返回 ACK。
发送目标 寄存器地址,从设备返回 ACK。
主机再次发送 起始信号 START(即 重复起始)。
发送 设备地址 + 读位(1),从设备返回 ACK。
从设备开始逐字节向主机传输数据,每个字节之后主机都要返回 ACK。
当读到最后一个字节时,主机发送 NACK 表示不再需要更多数据。
主机发送 停止信号 STOP,释放总线,读操作结束。
4. I²C 硬件要求
为了保证 SDA 和 SCL 线路在空闲时保持高电平,I²C 总线需要在两条线上各接入 上拉电阻,常用阻值为 4.7 kΩ ~ 10 kΩ。
5.I²C 特点和优点
只需两根信号线,节省引脚;
支持多主多从,扩展性强;
支持不同速率(标准模式 100 kbps,快速模式 400 kbps,高速模式 3.4 Mbps 等)。