I2C 通信协议概述
I2C 是一种半双工系统内部协议,通常用于系统内多个集成电路(IC)间的通讯。通过调节时钟频率,其可以实现 5 种速率:100kbps 400kbps 1Mbps 3.4Mbps 5Mbps。
一、物理层

- 两条线路:
- SDA:双向串行数据线,用来传输数据
- SCL:串行时钟线,用来同步时钟
- 多从机:一个 I2C 控制器下可以挂多个 I2C 从设备
- 每个设备都有一个独立的地址,I2C 控制器利用这个地址访问不同的从机设备
- 总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态。
- 多个主机同时使用总线时,为了防止数据冲突, 会利用仲裁方式决定由哪个设备占用总线
- 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制
- 为了避免总线信号的混乱,连接到总线设备的输出端必须是开漏输出结构。
- 上拉电阻结构使 SDA 和 SCL 总线保持高电平
不同于 RS-232 为异步通信需要设置波特率,I2C 拥有一条时钟线,为同步传输,其数据有效性如下:
- SCL为高电平的时候SDA表示的数据有效:SDA 为高电平时表示逻辑1, 为低电平时表示逻辑0
- SCL为低电平的时候SDA表示的数据无效:SDA 一般在这个时候进行电平切换
二、协议层
I2C 的通信过程是由主机发起的,支持主机写数据到从机和主机在从机中读数据,其过程如下。

-
起始信号:SCL 线是高电平时 SDA 线从高电平向低电平切换,即一个下降沿,表示通讯的起始。起始和停止信号一般由主机产生。
-
设备地址:起始信号产生后所有从机开始等待主机接下来的广播。与主机广播地址相同的设备被选中等待接下来的信号,其余设备会忽略接下来的信号。这个从机地址可以是7位(或10位),这是一个 8 位的数据,其中高 7 位是设备地址。
-
操作位:最后 1 位是读写位,为 0 表示写操作,为 1 表示读操作。
-
数据传输:
- 写数据:主机接收到从机的应答 ACK 信号后开始发送数据,每个数据包大小为 8 bits, 主机每发送一个数据包,等待从机应答信号 ACK,并重复这个过程。
- 读数据:主机接收到从机的应答 ACK 信号后开始接收数据,从机开始发送数据,每个数据包也是 8 bits,从机每发送一个数据包要等待主机的应答信号 ACK,并重复这个过程。倘若主机希望停止接收数据,会发送一个非应答信号 NACK,从机接收到需停止发送
-
停止信号 P:当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。
Ref
[1] 野火 STM32 I2C https://doc.embedfire.com/mcu/stm32/f103badao/std/zh/latest/book/I2C.html
[2] A Basic Guide to I2C - Texas Instruments https://www.ti.com/lit/an/sbaa565/sbaa565.pdf?ts=1747371431982&ref_url=https%253A%252F%252Fwww.google.com%252F