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,踩过的坑不少。分享几个:
- 上拉电阻别省:有人觉得内部上拉够用,结果通信不稳定。我建议外部加上拉,2.2kΩ到10kΩ之间,根据实际情况调。
- 地线要粗:I2C是同步通信,对地线噪声敏感。地线细了,信号容易乱。
- 走线别太长:超过1米,建议用缓冲器或I2C中继器。我试过用3米线连一个传感器,结果只能跑10kHz,还时不时丢数据。
- 地址冲突:很多芯片有多个可选地址,但同一总线上不能有两个相同地址的设备。选型时就要规划好。
嗯,I2C总线的基础就这些。看似简单,但每个细节都藏着坑。下一章我们聊聊通信协议,看看数据是怎么在两根线上跑来跑去的。