1. I2C总线概述:历史、物理层特性、电气特性与总线拓扑

1.1 聊聊I2C的出身

I2C总线,全称是Inter-Integrated Circuit。说白了,就是芯片之间聊天用的。

1982年,飞利浦半导体(现在的NXP)搞出了这个东西。初衷很简单——他们想把电视、收音机里的各种芯片连起来,又不想用太多引脚。你想想看,那时候的芯片引脚金贵得很,能省一根是一根。

我记得刚入行那会儿,带我的老工程师跟我说:「小子,I2C你学透了,嵌入式通信就通了三分之一。」当时我不信,后来做了十几年项目,发现这话一点不夸张。从温度传感器到EEPROM,从电源管理到触摸屏,I2C无处不在。

核心特点:

  • 只需要两根线:SCL(时钟线)和SDA(数据线)
  • 多主多从架构,谁都能当老大
  • 标准模式100kHz,快速模式400kHz,高速模式3.4MHz

1.2 物理层特性——两根线走天下

I2C的物理层,说白了就是两根线加一个上拉电阻。

SCL(Serial Clock):时钟线,由主设备驱动。就像乐队指挥的指挥棒,节奏由它定。

SDA(Serial Data):数据线,双向传输。主设备发数据,从设备也能发数据,但得听时钟的指挥。

这两根线都是开漏输出。什么叫开漏?就是芯片只能把线拉低,不能主动拉高。拉高的工作,交给上拉电阻来做。

我的经验:上拉电阻的取值很关键。我做过一个项目,选了4.7kΩ的电阻,总线长度30cm,跑400kHz没问题。但换到另一块板子,总线长度到了1米,同样的电阻就不行了。波形变得圆滚滚的,通信时好时坏。后来换成2.2kΩ,问题解决。

上拉电阻怎么选?记住这个原则:

  • 总线电容越大,电阻要越小
  • 速度越快,电阻要越小
  • 但电阻太小,功耗会变大
总线长度 标准模式(100kHz) 快速模式(400kHz)
10cm以内 10kΩ 4.7kΩ
10-30cm 4.7kΩ 2.2kΩ
30cm-1m 2.2kΩ 1kΩ

1.3 电气特性——电压与电平

I2C的电气特性,嗯,这里要注意:不同电压的设备可以共存。

早期的I2C是5V逻辑。现在3.3V是主流,1.8V也越来越常见。关键是,你得保证主设备和从设备的逻辑电平能互相识别。

逻辑电平阈值(以3.3V系统为例):

  • 输入低电平(VIL):最大0.3 × VDD ≈ 1.0V
  • 输入高电平(VIH):最小0.7 × VDD ≈ 2.3V
  • 输出低电平(VOL):最大0.4V(灌电流3mA时)

避坑指南:我曾经在一个项目里,把3.3V的MCU和5V的传感器直接连在一起。结果传感器死活不响应。查了半天,发现是5V设备认为3.3V的高电平不够高。后来加了个电平转换芯片,一切正常。所以,不同电压域的设备,千万别直接连!

电平转换有几种常见做法:

  • 专用电平转换芯片(如PCA9306)——最可靠
  • MOS管分立电路——省钱但麻烦
  • 开漏兼容——如果从设备支持,最简单

1.4 总线拓扑——谁跟谁说话

I2C的总线拓扑,说白了就是一条线上挂一堆设备。

典型结构:

VDD
  |
  R_pullup
  |
主设备 ──┬── SCL ──┬── 从设备1 ──┬── 从设备2
         │          │              │
         └── SDA ──┴── 从设备1 ──┴── 从设备2

每个从设备都有一个唯一的7位或10位地址。主设备发地址,只有地址匹配的从设备才会响应。

总线上的角色:

  • 主设备(Master):发起通信,产生时钟
  • 从设备(Slave):响应主设备,不能主动发起
  • 多主模式:多个主设备可以共存,通过仲裁决定谁说话

我做过一个项目,用了三个主设备:一个MCU、一个DSP、一个FPGA。它们都挂在同一条I2C总线上,共享一组传感器。刚开始我担心会冲突,但I2C的仲裁机制很巧妙——谁先拉低SDA,谁就赢得总线。输的那个自动退让,等总线空闲再试。

总线电容限制:

I2C规范规定,总线上所有设备的引脚电容加上走线电容,总和不能超过400pF。超过这个值,信号上升沿会变慢,通信就容易出错。

怎么估算?每个芯片引脚电容约10pF,走线每厘米约1pF。所以,挂10个设备、走线30cm,电容大概就是10×10 + 30×1 = 130pF,完全没问题。但如果挂40个设备、走线2米,那就超了。

1.5 我的一些实战心得

做了这么多年I2C,踩过的坑不少。分享几个:

  1. 上拉电阻别省:有人觉得内部上拉够用,结果通信不稳定。我建议外部加上拉,2.2kΩ到10kΩ之间,根据实际情况调。
  2. 地线要粗:I2C是同步通信,对地线噪声敏感。地线细了,信号容易乱。
  3. 走线别太长:超过1米,建议用缓冲器或I2C中继器。我试过用3米线连一个传感器,结果只能跑10kHz,还时不时丢数据。
  4. 地址冲突:很多芯片有多个可选地址,但同一总线上不能有两个相同地址的设备。选型时就要规划好。

嗯,I2C总线的基础就这些。看似简单,但每个细节都藏着坑。下一章我们聊聊通信协议,看看数据是怎么在两根线上跑来跑去的。