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总线上必须接上拉电阻,否则通信直接废掉。
上拉电阻的取值有讲究:
- 电阻太小(比如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缓冲器。
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。
1.4 知识体系总览:一张图看懂I2C
下面这张SVG图,把I2C的核心知识点串起来了。你可以把它当作本章的思维导图:
这张图把I2C拆成三大块:物理层、协议层、协议对比。咱们今天只讲物理层和对比,协议层的时序细节后面几章会逐个击破。
1.5 本章小结
好了,第一节课就到这里。咱们捋一捋今天的关键点:
- I2C是飞利浦发明的两线制总线,从100kHz一路演进到5MHz
- 物理层核心是开漏输出+上拉电阻,电阻取值影响速率和功耗
- I2C用地址区分设备,适合多设备、低速场景
- 和SPI、UART比,I2C在引脚数和设备数量上有优势,但速率是短板