1. I2C协议基础回顾:物理层、电气特性、开漏输出与线与逻辑

各位同学,咱们今天先不急着上逻辑分析仪抓波形。做嵌入式这么多年,我有个习惯——先把物理层吃透,再谈协议。I2C看起来简单,就两根线,但很多人栽跟头就栽在电气特性上。你想想看,两根线要支持多主通信,还要能仲裁,这背后靠的是什么?

说白了,就三个关键词:开漏输出、上拉电阻、线与逻辑。咱们一个一个拆开讲。

1.1 物理层:就两根线,但别小看它们

I2C总线只有两根信号线:

  • SCL(Serial Clock) —— 时钟线,由主设备驱动
  • SDA(Serial Data) —— 数据线,双向传输

再加上一根公共地线(GND),就构成了完整的通信回路。所有设备都挂在这两根线上,设备地址唯一,谁被寻址谁应答。

关键点: I2C是同步通信,时钟由主设备产生。从设备不能主动产生时钟,但可以通过时钟拉伸(Clock Stretching)拉低SCL来延缓通信。这个后面抓包时会经常见到。

1.2 电气特性:开漏输出,为什么非它不可?

I2C的IO口必须是开漏(Open-Drain)或开集(Open-Collector)结构。什么意思呢?

普通推挽输出,一个引脚既能输出高电平也能输出低电平。但开漏输出不一样——它只能输出低电平,或者高阻态。高电平靠外部上拉电阻实现。

我刚开始学的时候也觉得奇怪:为什么非要这么麻烦?直接推挽不行吗?

答案很简单:为了多主通信和仲裁。你想想,如果两个设备同时往总线上写数据,一个写1一个写0,推挽输出直接短路烧管子。但开漏输出不会——谁拉低谁说了算,这就是后面要讲的线与逻辑。

输出类型 输出高电平 输出低电平 高阻态 多设备共用
推挽输出 主动驱动 主动驱动 不支持 ❌ 会短路
开漏输出 靠上拉电阻 主动驱动 支持 ✅ 线与逻辑

1.3 上拉电阻:选大了还是选小了?

开漏输出需要外部上拉电阻,把SDA和SCL拉到VDD。电阻值的选择直接影响通信质量。

我在项目中遇到过一个问题:一块板子I2C通信偶尔出错,用示波器一看,上升沿慢得像蜗牛爬。查了半天,发现上拉电阻用了10kΩ,总线电容又大,根本充不上去。

上拉电阻的选型原则:

  • 电阻太小(如1kΩ):灌电流太大,IO口可能承受不住,功耗也高
  • 电阻太大(如10kΩ):上升沿变慢,高速通信时波形畸变
  • 标准模式(100kHz):4.7kΩ ~ 10kΩ
  • 快速模式(400kHz):1.5kΩ ~ 4.7kΩ
  • 高速模式(3.4MHz):需要更小的电阻,甚至用电流源

我的经验: 如果总线上挂的设备多(超过4个),或者线缆比较长,建议用2.2kΩ ~ 4.7kΩ。别死磕标准值,拿示波器看波形最靠谱。

1.4 线与逻辑:I2C仲裁的物理基础

这是I2C最巧妙的设计。多个开漏输出接在一起,只要有一个设备输出低电平,总线就是低电平。所有设备都输出高阻态时,总线才被上拉成高电平。

用逻辑表达式表示:

总线状态 = (设备1输出) AND (设备2输出) AND ... AND (设备N输出)

这就是线与(Wired-AND)。低电平优先,谁拉低谁赢。

为什么会这样?因为开漏输出只能拉低,不能拉高。拉高靠上拉电阻,而电阻是被动的。所以:

  • 只要有一个设备拉低 → 总线低电平
  • 所有设备都释放(高阻)→ 总线高电平

仲裁时,主设备在SDA上发送数据位,同时监测SDA的实际电平。如果自己发送的是1(高阻),但检测到SDA是低电平,说明有其他设备在拉低——仲裁失败,立即退出。

注意: 仲裁只在SDA上进行,SCL始终由主设备共同驱动。仲裁失败的设备必须释放SDA和SCL,不能干扰胜出设备的通信。

1.5 知识结构图:I2C物理层核心要素

下面这张图把I2C物理层的核心关系画清楚了,建议保存下来对照着看。

I2C物理层核心要素结构图 I2C物理层核心要素 I2C总线 SCL 时钟线 SDA 数据线 开漏输出 上拉电阻 线与逻辑 多主仲裁基础 开漏输出 + 上拉电阻 → 线与逻辑 → 多主仲裁 低电平优先:谁拉低谁赢,仲裁失败者自动释放总线 主设备1 主设备2 从设备 SDA/SCL

1.6 常见误区与避坑指南

做I2C调试这么多年,我见过太多人在这几个地方翻车。列出来给大家提个醒:

我曾经踩过的坑:

  • 上拉电阻忘焊 —— 总线一直低电平,通信完全瘫痪。用逻辑分析仪一看,SDA和SCL都是0V,还以为芯片坏了。
  • 上拉电阻接到不同电源域 —— SDA用3.3V上拉,SCL用5V上拉,电平不匹配,从设备不响应。
  • 误用推挽输出 —— 有些MCU的I2C引脚默认是推挽模式,需要手动配置成开漏。不配的话,多主通信直接短路。
  • 总线电容过大 —— 线缆太长或者挂的设备太多,上升沿变慢,时序违规。标准模式建议总线电容不超过400pF。

1.7 小结:物理层决定了I2C的上限

I2C协议本身很优雅,但它的可靠性很大程度上取决于物理层的实现。开漏输出和线与逻辑是I2C的灵魂,理解了它们,你才能真正明白为什么I2C能支持多主通信,为什么仲裁不会损坏设备。