嵌入式笔记系列——IIC
二、I²C(Inter-Integrated Circuit)
I²C 是一种同步、串行、半双工通信协议,由 Philips(现为 NXP)提出,广泛应用于芯片间短距离通信,如 MCU 与传感器、EEPROM、RTC、显示屏等模块的连接。
1. 物理连接
-
仅需两根线:
- SCL(Serial Clock):时钟线,由主设备控制
- SDA(Serial Data):数据线,双向传输
-
开漏输出结构:
- 必须外接上拉电阻(常见:4.7kΩ,取决于总线电容和速率)
- 支持“线与”逻辑,便于多主仲裁
-
多主多从架构:
-
支持多个主设备(需仲裁机制)
-
每个从设备有唯一 7 位地址(也有 10 位扩展地址)
-

-
IIC的高阻态:
-
高阻态的作用 :当设备处于高阻态时,它对总线的影响就像一个高电阻,几乎不从总线汲取电流,也不会向总线输出电流。这种状态允许其他设备独占总线进行通信,是总线能够实现多主多从、分时通信的关键所在。
-
高阻态的实现 :I²C 总线的 SDA 和 SCL 引脚一般采用开漏输出结构,在这种结构下,输出端可以通过晶体管的导通将总线拉低至低电平(逻辑 0),但无法直接将总线拉高至高电平(逻辑 1)。总线的高电平由外部的上拉电阻实现。当设备不进行数据发送或接收操作时,它会释放总线,使其处于高阻态,以便其他设备可以使用总线进行通信。
-

2. 数据帧格式(Frame Structure)
| 字段 | 位数 | 电平 | 说明 |
|---|---|---|---|
| 起始位 | 1 bit | SDA↓SCL↑ | 表示通信开始 |
| 地址位 | 7 bits | 0/1 | 从机地址 |
| 读写位 | 1 bit | 0/1 | 0:写,1:读 |
| ACK | 1 bit | 0/1 | 接收方拉低表示应答 |
| 数据位 | 8 bits | 0/1 | 实际传输数据(高位在前) |
| 停止位 | 1 bit | SDA↑SCL↑ | 表示通信结束 |
典型写操作帧结构:
[S] [7位地址+W] [ACK] [数据1] [ACK] [数据2] [ACK] ... [P]
典型读操作帧结构:
[S] [7位地址+W] [ACK] [寄存器地址] [ACK]
[Sr] [7位地址+R] [ACK] [数据1] [ACK] [数据2] [NACK] [P]
3. 时序与速率
-
同步通信:由主设备提供时钟(SCL),数据在 SCL 高电平时必须稳定,低电平时可变化
-
速率等级:
模式 速率 备注 标准模式 100 kbps 最常见 快速模式 400 kbps 支持更大总线电容 高速模式 3.4 Mbps 需特殊驱动 超高速模式 5 Mbps 单向传输,非标准

4. 配置参数(通信前必须约定)
| 参数 | 说明 |
|---|---|
| 从机地址 | 7 位或 10 位,必须唯一 |
| 速率 | 标准/快速/高速,主从必须一致 |
| 上拉电阻 | 通常 2.2kΩ~4.7kΩ,取决于总线长度 |
| 总线电容 | 最大 400pF(标准模式) |
5. 通信流程(以读取传感器为例)
✅ 写一个字节:
- 主机发送 起始条件
- 发送 从机地址 + 写位
- 从机 ACK
- 发送 寄存器地址
- 从机 ACK
- 发送 数据字节
- 从机 ACK
- 主机发送 停止条件
✅ 读一个字节:
- 主机发送 起始条件
- 发送 从机地址 + 写位
- 从机 ACK
- 发送 寄存器地址
- 从机 ACK
- 重复起始条件(Sr)
- 发送 从机地址 + 读位
- 从机 ACK
- 从机发送 数据字节
- 主机发送 NACK(表示不继续读)
- 主机发送 停止条件
6. 优缺点
| 优点 | 缺点 |
|---|---|
| 接线简单,仅两根线 | 速率不如 SPI 高 |
| 支持多主多从,组网灵活 | 总线电容限制距离(<1米高速,<10米低速) |
| 硬件实现简单,成本低 | 需处理地址冲突、仲裁、挂死等问题 |
| 有 ACK 机制,可靠性高 | 半双工,不能同时收发 |
7. 实际应用示例
- MCU ↔ 温度传感器(如 TMP102、LM75)
- MCU ↔ EEPROM(如 AT24C02)
- MCU ↔ OLED 屏(SSD1306)
- MCU ↔ RTC 时钟模块(如 DS3231)
8. 调试技巧(实战)
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| 无 ACK 响应 | 地址错误、从机未上电、总线挂死 | 用逻辑分析仪查看地址是否正确 |
| 总线挂死 | 从机拉低 SDA 未释放 | 主机发送 9 个时钟脉冲释放总线 |
| 数据错乱 | 上拉电阻太小、总线电容过大 | 减小速率、缩短总线、更换电阻 |
| 读写失败 | 寄存器地址格式错误 | 查阅 datasheet,确认是否为 8 位地址 |
9. 与 SPI、UART 对比(面试常问)
| 特性 | I²C | SPI | UART |
|---|---|---|---|
| 线数 | 2 根(SCL+SDA) | 4 根(MOSI+MISO+SCK+CS) | 2 根(TX+RX) |
| 通信方式 | 半双工 | 全双工 | 全双工 |
| 速率 | 最高 3.4 Mbps | 可达 50 Mbps+ | 常见 115200 bps |
| 寻址方式 | 地址位寻址 | 片选引脚(CS) | 无寻址,点对点 |
| 多设备 | 支持多主多从 | 一主多从 | 点对点 |
| 复杂度 | 中等(需处理仲裁) | 简单(硬件控制) | 简单 |
10. 小结(一句话记忆)
I²C 是一种双线、同步、半双工的串行总线协议,支持多主多从,通过地址寻址和 ACK 机制实现可靠通信,广泛应用于芯片间短距离通信。
