前言

前面两篇我们讲了串口(UART/RS-232/RS-485)和波特率,这些都属于异步通信。但异步有个特点:没有时钟线,全靠约定波特率。这就带来两个问题:

  1. 速度上不去(一般不超过 115200 bps)
  2. 想挂多个设备?得用 RS-485 这种多点总线,还得自己解决“谁发言”的问题

有没有一种协议,既省引脚(两根线)、又能挂多个设备、还有时钟线保证速度
有的,它就是 I2C(读作 I-squared-C,或者 I-two-C)。

I2C 由飞利浦(现 NXP)在 1982 年发明,最初是为了让电视机里的芯片之间能简单通信。如今,它已经是嵌入式领域最通用的板级总线之一。

一句话概括:I2C 是同步、半双工、多主多从的串行总线,仅用 SDA(数据线)SCL(时钟线) 两根线,就可以连接最多 100 多个设备。


一、物理层:开漏 + 上拉电阻,两根线的秘密

1. 两线结构

  • SDA(Serial Data Line):数据线,双向。
  • SCL(Serial Clock Line):时钟线,由主设备产生。

与 UART 不同,I2C 的这两根线都是双向的,而且具有一个非常特殊的电气特性:开漏输出(Open-Drain)

2. 什么是开漏输出?

普通 GPIO 可以输出高电平(推挽)或低电平。但开漏输出只能主动拉低(输出 0),无法主动拉高(输出 1)。当它要输出 1 时,只能“释放”引脚,让引脚处于高阻态。

那么高电平从哪里来?--------------------上拉电阻

所有设备的 SDA 和 SCL 引脚都并联到总线上,并且总线必须通过电阻接到电源(VCC,通常 3.3V 或 5V)。

这样设计的好处

  • 线与逻辑:任何设备都可以拉低总线;只要有一个设备拉低,整条总线就是低电平。只有所有设备都释放,总线才被上拉电阻拉高。
  • 多主仲裁:多个主设备同时发送时,谁先拉低谁“赢”。
  • 电压兼容:不同电压的设备(如 3.3V 和 5V)可以共存,只要上拉电阻接在较低电压即可。

这就像一群人共用一根电话线。每个人手里有一个开关,按下去(拉低)就是占用线路;松开手(释放)就是让线路空闲。另外有个弹簧(上拉电阻)一直把线路拉回空闲状态。谁先按下,谁就获得了发言权。


二、协议层:起始、地址、应答、停止

I2C 的通信有一套非常规范的“礼仪”。我们以 7 位地址模式 为例(也有 10 位地址,但 7 位最常用)。

1. 起始条件(Start Condition,S)

当 SCL 为高电平时,SDA 从高电平跳变到低电平。这个信号告诉所有设备:注意,要开始通信了!

2. 停止条件(Stop Condition,P)

当 SCL 为高电平时,SDA 从低电平跳变到高电平。这个信号表示:本次通信结束,总线释放

3. 数据传输与时钟

在 SCL 为高电平时,SDA 上的数据必须保持稳定;只有在 SCL 为低电平时,SDA 才允许变化。数据在 SCL 的上升沿被采样。

每次传输 1 个字节(8 位),先发送最高位(MSB)

这里需要一张时序图来帮助理解

4. 地址与读写位

主设备发送的第一个字节(8 位)包含:

  • 高 7 位:从机地址(例如 0x50 表示某个 EEPROM)
  • 最低位(LSB):读写位(0 表示写,1 表示读)

例如:主设备要向地址 0x50 的从机写入数据,则第一个字节发送 0x50 << 1 | 0 = 0xA0

5. 应答(ACK)与非应答(NACK)

每传输完一个字节(包括地址字节、数据字节),接收方必须在第 9 个时钟周期内做出回应:

  • 将 SDA 拉低 → ACK,表示“收到了,请继续”
  • 保持 SDA 高电平 → NACK,表示“没收到/出错/别再发了”

注意:在读取数据的最后一个字节,主设备会主动发送 NACK 然后停止,告诉从机“不要再发了”。

6. 完整写操作流程(主写从)

起始 → 发送(地址+写) → 等待 ACK → 发送(寄存器地址) → 等待 ACK → 发送(数据) → 等待 ACK → ... → 停止

7. 完整读操作流程(主读从)

起始 → 发送(地址+写) → ACK → 发送(寄存器地址) → ACK → 重复起始 → 发送(地址+读) → ACK → 读取数据 → 主设备发 NACK → 停止

那个“重复起始”很关键:它不需要先发停止,可以无缝切换读写方向,而且保证总线不被其他主设备抢占。


三、多主多从与仲裁

I2C 支持多个主设备挂在同一总线上。如果两个主设备同时想发送,会发生什么?

  • 它们都会先检测总线是否空闲(SCL 和 SDA 都是高电平)。
  • 同时发送起始条件,然后开始发送地址。
  • 仲裁机制:谁先拉低 SDA 谁胜出。因为开漏结构,一个设备试图发送 1(释放),另一个发送 0(拉低),总线电平是 0。发送 1 的设备检测到总线与自己预期不符,就知道自己输掉了仲裁,立即退出,让另一个设备继续。

仲裁过程不会丢失数据,因为所有设备发送的地址高位相同(否则冲突就无解了)。通常设计中,我们尽量避免多主同时发送,但仲裁机制提供了安全网。


四、时钟拉伸(Clock Stretching)

这是一个不太常用但需要知道的功能。

某些慢速从机接收数据后需要时间处理,来不及立刻响应下一个时钟。它可以主动拉低 SCL,让主设备等待。主设备检测到 SCL 被拉低,就会进入等待状态,直到从机释放 SCL。

注意:不是所有从机都支持时钟拉伸,主设备驱动也要处理这种情况。在简单应用中,我们一般假设从机足够快。


五、常见速率

模式 最高速率 典型应用
标准模式(SM) 100 kbps 大多数传感器、EEPROM
快速模式(FM) 400 kbps 较新的设备
快速模式+(FM+) 1 Mbps 更高性能
高速模式(HS) 3.4 Mbps 特殊需求

嵌入式中最常用的是 100 kHz400 kHz


六、典型应用场景

1. EEPROM(如 AT24C02)

  • 容量 256 字节,地址 0x50(A0/A1/A2 引脚决定)
  • 写操作:先发送设备地址+写,再发送存储地址,最后发送数据。
  • 读操作:先虚写地址,再重复起始+读。

2. 温湿度传感器(如 AHT10、SHT30)

  • 单总线地址,发送命令(如 0xAC)启动测量,等待后读取 6 字节数据(温湿度值)。

3. 实时时钟(如 DS3231)

  • 地址 0x68,内部有秒、分、时、日、月、年寄存器,可读写。

4. IO 扩展芯片(如 PCF8574)

  • 通过 I2C 扩展 8 个 GPIO,适合引脚不够的场合。

七、优缺点

优点

  • 引脚少:2 根线挂几十个设备
  • 多主多从:自带仲裁
  • 应答机制:可靠性高
  • 电压兼容好:开漏 + 上拉,3.3V 和 5V 设备可混用
  • 地址机制:无需片选线

缺点

  • 速度慢:比 SPI 慢(SPI 可达几十 MHz)
  • 总线电容限制:总线电容不能超过 400pF,否则信号变形。这就限制了线缆长度(一般几十厘米到几米)和设备数量(最多 100 多个,但实际受电容限制)。
  • 地址冲突:相同地址的两个设备不能挂在同一总线上(除非有地址引脚可配置)。
  • 调试稍复杂:需要逻辑分析仪看起始、应答等时序。

八、常见问题与注意事项

  1. 上拉电阻选择:常见 4.7kΩ(100kHz)、2.2kΩ(400kHz)。阻值太小会增大功耗,太大会使上升沿变缓。
  2. 忘记使能时钟:使用硬件 I2C 前,必须使能 RCC 中对应的外设时钟。
  3. 地址错误:7 位地址需要左移 1 位,再补读写位。例如设备地址 0x50,写操作是 0xA0,读操作是 0xA1。很多新手直接用 0x50,导致无应答。
  4. 应答检查:写地址后要检查 ACK,否则说明设备不存在或总线故障。
  5. 重复起始 vs 停止+起始:重复起始(Restart)可以避免总线被其他主设备抢占,推荐使用。
  6. 逻辑分析仪抓波形:调试 I2C 最好的工具就是逻辑分析仪,可以直观看到起始、地址、应答、数据。

九、总结

I2C 是嵌入式开发中不可或缺的协议。两根线,几十个设备,简洁而强大。

  • 物理层:开漏 + 上拉电阻,实现线与和多主仲裁。
  • 协议层:起始、停止、地址、读写位、应答。
  • 速度:100k/400k 最常见。
  • 应用:EEPROM、传感器、RTC、IO 扩展。
  • 调试:注意上拉电阻、地址左移、应答检查。

系列全篇快速索引:

篇目 标题 核心关键词
1 嵌入式到底是什么? LED、时钟、GPIO、ARM vs C51 vs STM32
2 串口江湖 UART、RS-232、RS-485、TTL
番外 波特率解析 波特率、比特率、晶振分频
3 两线走天下 I2C、开漏、上拉、地址、应答
4 极速先锋 SPI、四线、CPOL/CPHA、全双工
5 嵌入式大脑 中断、NVIC、ISR、事件驱动
6 时间管理大师 定时器、PWM、输入捕获、SysTick
7 存储与地址 内存映射、大小端、4GB 寻址
8 从裸机到 RTOS 任务、调度、FreeRTOS、优先级
9 任务间悄悄话 队列、信号量、互斥量、IPC
10 位运算的艺术 &、
11 芯片选型 STM32 vs ESP32、选型框架
12 调试与工具链 printf、调试器、逻辑分析仪
13 总结 读手册、写可维护代码、回顾
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐