I²C
I²C(Inter-Integrated Circuit,集成电路间通信总线)是一种常见的 同步串行通信总线,由 Philips 公司在 1980 年代提出,现已成为嵌入式系统中使用最广泛的低速通信接口之一。它采用双线通信方式,支持多主多从结构,常用于主控芯片与传感器、存储器、外围模块之间的通信。I²C 的最大特点是硬件资源需求极少,只需两根信号线即可实现设备间的数据交换。
1. 物理结构
I²C 只需要两条信号线:
- SCL(Serial Clock Line,时钟线)
- SDA(Serial Data Line,数据线)
两条线均为 开漏/开集电极 输出,必须通过上拉电阻接到电源(一般为 3.3V 或 5V)。这意味着总线上任意一个器件可以将信号线拉低,但不能主动拉高,保持了“线与”的总线特性,从而实现多主多从的共享通信。
┌─────┐
│ 主机 │
└─┬─┬─┘
│ │
SCL──┘ └──SCL
SDA──┐ ┌──SDA
┌─┴─┴─┐
│ 从机 │
└─────┘
(其余从机并联在总线上)
2. 帧格式
I²C 的通信以消息为单位,而消息由若干“帧”构成。
一般帧结构
┌─────┬─────────────┬──────────┬─────────┬────┐
│ 起始 │ 从机地址+R/W │ ACK/NACK │ 数据字节 │ 停止│
└─────┴─────────────┴──────────┴─────────┴────┘
- 起始位 (START):由主机产生,SCL 为高时 SDA 从高到低的跳变。
- 地址帧:7 位或 10 位地址 + 1 位读/写标志(0=写,1=读)。
- 应答位 (ACK/NACK):接收方拉低 SDA 表示应答,拉高表示无应答。
- 数据帧:8 位数据 + 1 位应答。可连续传输多个字节。
- 停止位 (STOP):由主机产生,SCL 为高时 SDA 从低到高的跳变,表示通信结束。
SDA: ─────┐ ┌───────┐───────┐───────┐─────
│ S │Addr+W │ ACK │ Data │ P
SCL: ──┐┌─┘┐┌─┘┐┌─┘┐┌─┘┐┌─┘┐┌─┘┐┌─┘┐┌─┘┐──
↑起始 ↑地址帧 ↑应答 ↑数据帧 ↑停止
3. 原理
I²C 是一种 同步通信协议。所有数据传输均依赖于时钟信号 SCL 的节奏,SDA 上的数据必须在 SCL 为高电平时稳定,在低电平时允许变化。主机负责产生时钟并控制数据方向,从机根据地址进行响应。由于 SDA 和 SCL 都是“线与”特性,因此即便多个主机同时尝试发起通信,也能通过仲裁机制保证只有一个主机成功获得总线,从而避免冲突。
4. 硬件协议
I²C 的电气特性决定了其灵活性和局限性:
- 通过上拉电阻实现线与逻辑,总线空闲时为高电平。
- 总线上可挂接多个设备,数量仅受寻址空间和总线电容限制。
- 支持 7 位和 10 位两种寻址方式(7 位更常见,最多可挂 112 个有效设备地址)。
- 总线拓扑通常为“星形+并联”,所有设备 SDA、SCL 并联在一起。
5. 参数
I²C 提供了多个速度等级,以适应不同应用场景:
| 模式 | 速率上限 | 应用场景 |
|---|---|---|
| 标准模式 | 100 kbps | 低速传感器、配置寄存器 |
| 快速模式 | 400 kbps | 一般外设通信(EEPROM 等) |
| 快速模式+ | 1 Mbps | 较高性能外设 |
| 高速模式 | 3.4 Mbps | 显示器、摄像头等高速数据 |
| 超高速模式 | 5 Mbps(少见) | 特殊应用 |
除了速率,I²C 还需要关注 寻址方式(7/10 位)、应答机制(ACK/NACK)、总线长度(电容限制通常 < 400 pF) 等参数。