I2C协议概述:从一根线到万物互联

各位同学,咱们今天正式开讲I2C。说实话,这个协议我用了十几年,每次新项目选型,它几乎都是板上钉钉的标配。你想想看,两根线就能挂一堆设备,省GPIO又省PCB面积,哪个嵌入式工程师不爱?

但别急着写代码。先把底层的物理特性和历史渊源搞清楚,后面分析时序、调驱动时才不会抓瞎。我见过太多人上来就调I2C,结果波形乱飞,最后发现是上拉电阻没选对——嗯,这种坑咱们今天先填上。

1.1 I2C总线历史:飞利浦的“小发明”

I2C的全称是Inter-Integrated Circuit,直译就是“集成电路间总线”。1982年,飞利浦半导体(现在的NXP)为了简化电视机的内部通信,搞出了这个协议。当时电视里一堆芯片——调谐器、音频处理器、视频解码器——每个都要连一堆控制线,飞利浦的工程师一拍脑袋:能不能用两根线搞定所有?

于是I2C诞生了。最初的标准速率只有100kHz,后来慢慢演进:

标准版本 推出年份 最大速率 主要变化
Standard-mode 1982 100 kbit/s 原始规范
Fast-mode 1992 400 kbit/s 速率提升,兼容旧设备
Fast-mode Plus 2007 1 Mbit/s 驱动能力增强,可接更多设备
High-speed mode 1998 3.4 Mbit/s 增加HS模式握手
Ultra Fast-mode 2012 5 Mbit/s 单向通信,简化设计

我个人习惯在项目里优先用Fast-mode(400kHz),兼顾速度和稳定性。如果设备距离远或者线缆长,我会降到100kHz——别问为什么,问就是吃过亏。

1.2 物理层特性:SDA/SCL与上拉电阻

I2C的物理层极其简单,就两条线:

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

这两条线都是开漏输出(Open-Drain),什么意思?说白了,芯片只能把线拉低,不能主动拉高。高电平靠外部上拉电阻实现。所以I2C总线上必须接上拉电阻,否则通信直接废掉。

我曾经踩过的坑: 第一次画I2C板子,忘了加上拉电阻,结果示波器一看,SDA和SCL全是浮空电平,设备死活不响应。后来老老实实焊了两个4.7kΩ电阻上去,世界清净了。

上拉电阻的取值有讲究:

  • 电阻太小(比如1kΩ):电流大,功耗高,但上升沿陡峭,适合高速
  • 电阻太大(比如10kΩ):省电,但上升沿变缓,速率上不去

我一般遵循这个经验法则:

总线电容 推荐上拉电阻 适用场景
< 100 pF 4.7kΩ ~ 10kΩ 短距离、低速(100kHz)
100 pF ~ 400 pF 2.2kΩ ~ 4.7kΩ 常规板级通信(400kHz)
> 400 pF 1kΩ ~ 2.2kΩ 长线缆、多设备(1MHz)

还有一个细节:I2C总线上每个设备都有一个7位或10位地址。7位地址最多挂127个设备,但实际受限于总线电容,一般不超过20个。我做过一个项目挂了12个传感器,SCL波形已经有点圆润了——嗯,这时候就得考虑加I2C缓冲器。

核心要点: I2C的物理层精髓就是“开漏+上拉”。所有设备共用两条线,靠地址区分。谁拉低谁说话,谁都不拉低就是高电平。

1.3 I2C vs SPI vs UART:三兄弟的恩怨

很多初学者会问:I2C、SPI、UART到底选哪个?我直接说结论:没有最好的协议,只有最合适的场景。

下面这张对比表,我建议你收藏:

特性 I2C SPI UART
信号线数量 2(SDA + SCL) 3~4(MOSI + MISO + SCK + CS) 2(TX + RX)
通信方式 半双工 全双工 全双工
主从关系 多主多从 单主多从 点对点
速率 100kHz ~ 5MHz 10MHz ~ 100MHz+ 9600 ~ 10Mbps
地址机制 硬件地址(7/10位) 片选信号(CS) 无地址
硬件复杂度 低(开漏+上拉) 中(推挽输出) 低(推挽输出)
典型应用 传感器、EEPROM、RTC ADC、DAC、LCD、SD卡 GPS、蓝牙、串口屏

我个人的选型原则:

  • 设备多、引脚少、速率要求不高 → 选I2C。比如挂一堆温湿度传感器、光照传感器。
  • 需要高速、大数据量 → 选SPI。比如驱动LCD屏幕、读写SD卡。
  • 简单点对点、长距离 → 选UART。比如和GPS模块通信。

你想想看,如果非要拿I2C去刷LCD屏幕,那画面刷新率估计会让你崩溃。反过来,用SPI挂一个RTC时钟芯片,又有点大材小用——多出来的线还得占用宝贵的GPIO。

一个小技巧: 如果项目里既有I2C又有SPI设备,我会优先把I2C放在低速总线上,SPI放在高速总线上。别混在一起,否则调试的时候你会怀疑人生。

1.4 知识体系总览:一张图看懂I2C

下面这张SVG图,把I2C的核心知识点串起来了。你可以把它当作本章的思维导图:

I2C协议知识体系 I2C总线 物理层特性 SDA / SCL 开漏输出 上拉电阻选择 7位/10位地址 协议层核心 起始/停止条件 数据帧格式 应答/非应答 协议对比 I2C vs SPI I2C vs UART 选型原则 本章重点:物理层 + 协议对比,为后续时序分析打基础

这张图把I2C拆成三大块:物理层、协议层、协议对比。咱们今天只讲物理层和对比,协议层的时序细节后面几章会逐个击破。

1.5 本章小结

好了,第一节课就到这里。咱们捋一捋今天的关键点:

  • I2C是飞利浦发明的两线制总线,从100kHz一路演进到5MHz
  • 物理层核心是开漏输出+上拉电阻,电阻取值影响速率和功耗
  • I2C用地址区分设备,适合多设备、低速场景
  • 和SPI、UART比,I2C在引脚数和设备数量上有优势,但速率是短板