第2章 I2C物理层:SDA、SCL与上拉电阻那些事
做嵌入式这些年,我调试过不下几十种I2C器件。说实话,90%的通信问题都出在物理层——要么波形塌了,要么电平对不上。这一章咱们就把SDA、SCL这两根线彻底聊透。
2.1 SDA与SCL:一根数据线,一根时钟线
I2C只有两根线,这大概是它最吸引人的地方。SDA(串行数据线)负责传数据,SCL(串行时钟线)负责提供同步时钟。两根线都是双向的,而且是开漏输出。
“开漏”是什么意思?说白了,就是芯片只能把线拉低,不能主动拉高。想拉高?全靠外接的上拉电阻。这个设计有个好处——多个器件可以共用一根线,谁要发数据就把线拉低,不发就释放,由电阻拉回高电平。你想想看,这相当于一个线与逻辑:只要有一个器件拉低,整条总线就是低电平。
💡 个人习惯提醒:我第一次用I2C时,以为MCU引脚配置成推挽输出也能用,结果一接从机,总线直接锁死。后来才意识到,开漏是I2C的根基,千万别偷懒用推挽。
SCL也是同样的开漏结构。主机通过控制SCL的高低来产生时钟,从机可以在需要时拉低SCL做时钟拉伸(clock stretching)——这个机制后面会细讲。
2.2 上拉电阻:选大了还是选小了?
上拉电阻的取值直接影响总线速度和功耗。我见过很多工程师直接把电阻焊成10kΩ,结果400kHz下波形圆得跟土豆似的——上升沿太慢,时序根本过不了。
电阻选型主要看两个参数:总线电容和目标速率。标准模式下(100kHz),上拉电阻可以大一些,比如4.7kΩ~10kΩ。快速模式(400kHz),就得降到1.5kΩ~4.7kΩ。高速模式(3.4MHz)就更讲究了,有时甚至要用0.5kΩ。
| 工作模式 | 最大速率 | 推荐上拉电阻范围 | 典型总线电容 |
|---|---|---|---|
| 标准模式 (Sm) | 100 kHz | 4.7 kΩ ~ 10 kΩ | ≤ 100 pF |
| 快速模式 (Fm) | 400 kHz | 1.5 kΩ ~ 4.7 kΩ | ≤ 200 pF |
| 快速模式+ (Fm+) | 1 MHz | 0.8 kΩ ~ 2.2 kΩ | ≤ 400 pF |
| 高速模式 (Hs) | 3.4 MHz | 0.5 kΩ ~ 1.5 kΩ | ≤ 100 pF |
我有个血的教训:一次项目里,总线长度超过30cm,电容大概到了150pF,我偷懒用了10kΩ上拉。结果在250kHz下通信时好时坏,用示波器一看,SDA上升沿接近1µs,SCL高电平时间根本不够。换成了2.2kΩ后立竿见影。
2.3 电气参数:别让电平杀手搞垮通信
I2C的电气参数其实很宽松,但有几个关键值必须记牢。我习惯把它们分成三类:输入电平、输出电平和时序指标。
2.3.1 输入电平阈值
所有I2C器件必须兼容以下电压标准(参考I2C规范V7.0):
- 低电平输入电压 VIL:最大 0.3 × VDD
- 高电平输入电压 VIH:最小 0.7 × VDD
- 迟滞(施密特触发输入):通常 ≥ 50 mV
这里有个坑:如果主控是3.3V,从机是5V,那么3.3V输出的高电平(约3.0V)对5V从机来说只有0.6×VDD,小于0.7×VDD(3.5V),从机根本识别不到高电平。怎么办?要么用电平转换芯片,要么确保所有器件共用一个VDD。
2.3.2 输出电平与灌电流
开漏输出拉低时,输出低电平 VOL 必须 ≤ 0.4V(在3mA灌电流下)。这个参数决定了上拉电阻的最小值。你想想,如果电阻太小,灌电流会很大,VOL就可能超过0.4V,总线逻辑就乱套了。
最小上拉电阻计算公式:
R_min = (V_DD - V_OL_max) / I_OL_max
例如 V_DD = 3.3V, V_OL_max = 0.4V, I_OL_max = 3mA
则 R_min = (3.3 - 0.4) / 0.003 ≈ 967 Ω
所以我通常不会把电阻搞到1kΩ以下,除非你确认器件灌电流能力够强。
2.3.3 时序参数(以100kHz标准模式为例)
| 参数 | 符号 | 最小 | 最大 | 说明 |
|---|---|---|---|---|
| SCL时钟频率 | fSCL | - | 100 kHz | 标准模式上限 |
| 保持时间(起始条件) | tHD;STA | 4.0 µs | - | SCL低后SDA变化前 |
| 低电平时间 | tLOW | 4.7 µs | - | SCL低电平持续时间 |
| 高电平时间 | tHIGH | 4.0 µs | - | SCL高电平持续时间 |
| 数据建立时间 | tSU;DAT | 250 ns | - | SDA在SCL高前稳定 |
| 数据保持时间 | tHD;DAT | 0 ns | 3.45 µs | SDA在SCL低后变化 |
| 上升时间 | tr | - | 1000 ns | SDA/SCL上升沿 |
| 下降时间 | tf | - | 300 ns | SDA/SCL下降沿 |
这些时序值在快速模式(400kHz)下会缩短约一个数量级。具体数值可以查芯片数据手册,但上面这些是我做项目时经常要核对的心算基准。
2.4 物理层知识一目了然
下面这张图帮你把本章核心概念串起来:
✔️ 核心要点回顾:
- SDA与SCL都是开漏输出,必须外接上拉电阻才能产生高电平。
- 上拉电阻的取值由总电容和目标速率共同决定:电容大、速率快,电阻就得小。
- 电气参数重点关注VIH/VIL阈值和时序的上升/下降时间,这些直接影响通信可靠性。
- 总线电容的影响经常被忽略,但它是导致“间歇性通信失败”的头号嫌疑犯。