做嵌入式开发,I²C是绕不开的协议。温湿度传感器、OLED屏幕、陀螺仪、EEPROM……几乎所有常用外设都支持I²C。
这篇文章不贴复杂代码,纯讲核心概念和常见问题,帮你把I²C彻底搞明白。

一、I²C到底是什么?
I²C(Inter-Integrated Circuit),读作“I方C”,是Philips(现NXP)在1982年发明的一种串行通信总线。
它只用了两根线就搞定了所有通信:
| 引脚 | 全称 | 作用 |
|---|---|---|
| SCL | Serial Clock Line | 时钟线,由主机产生,控制通信节奏 |
| SDA | Serial Data Line | 数据线,双向传输数据 |
就靠这两根线,一个主机可以挂载最多127个从设备,而且每个设备都有唯一的地址。
核心优势就三条:
-
引脚少(只占2个IO)
-
支持多设备(一条总线挂多个)
-
硬件简单(开漏输出+上拉电阻)

二、硬件连接:就两件事
1. 开漏输出 + 上拉电阻
I²C的SDA和SCL引脚都是开漏(Open-Drain)结构。开漏的意思就是:引脚只能拉低(输出0),不能主动拉高(输出1)。
那高电平(逻辑1)怎么来?靠外部的上拉电阻把电平拉到VCC。
为什么这么设计?因为开漏结构支持多设备共用一条总线——任何一个设备都可以把总线拉低,不会发生短路。如果是推挽输出,两个设备一个输出高一个输出低,直接短路烧芯片。
上拉电阻阻值怎么选?
| 电阻值 | 效果 |
|---|---|
| 1k~2.2kΩ | 上升沿陡,速度最快,但功耗大 |
| 4.7kΩ(最常用) | 标准配置,兼容性最好 |
| 10kΩ | 功耗低,但速度受限 |
参考值: 标准模式(100kHz)用4.7kΩ或10kΩ;高速模式(400kHz以上)用2.2kΩ或1kΩ。
2. 总线电容
总线上的设备越多、线缆越长,寄生电容就越大。电容越大,信号上升沿就越缓,通信速率就要降低。I²C标准规定总电容不能超过400pF。
实际项目中如果发现通信不稳定,可以尝试:
-
减小上拉电阻(加快上升沿)
-
降低通信速率
-
缩短线缆长度
-
减少总线上的设备数量

三、通信时序:看懂波形图
I²C的通信由几个关键“动作”组成,看懂波形图就能理解全部过程。
1. 起始条件(Start)
SCL为高电平时,SDA从高电平跳变到低电平。
2. 停止条件(Stop)
SCL为高电平时,SDA从低电平跳变到高电平。
3. 数据位传输
SCL为高电平时,SDA上的电平必须保持稳定(此时读取数据)。
SCL为低电平时,SDA可以切换电平(准备下一位数据)。
4. 应答位(ACK)
每传输完8位数据,接收方要拉低SDA一个时钟周期,表示“收到了”。
一次完整的数据传输流程:
起始条件 → 发送7位从机地址 + 1位读写位 → 等待ACK → 发送8位数据 → 等待ACK → …… → 停止条件

四、地址:怎么区分不同的设备?
I²C总线上每个设备都有唯一的地址。
-
7位地址: 最常见。比如OLED屏幕常用0x3C或0x3D,MPU6050陀螺仪常用0x68或0x69
-
10位地址: 少数设备支持,兼容7位地址格式
调试时常犯的一个错误: 芯片数据手册上写的地址是7位地址(比如0x68),但在代码里发送时需要左移1位(变成0xD0),因为最低位要留给读写标志。
很多新手直接用0x68去通信,结果设备死活不响应,折腾半天才发现地址没移位。
五、速率等级
I²C支持多种通信速率,根据需求选择:
| 模式 | 最大速率 | 典型应用 |
|---|---|---|
| 标准模式(Standard) | 100 kbps | 老设备、兼容性要求高 |
| 快速模式(Fast) | 400 kbps | 传感器、EEPROM(最常用) |
| 快速+模式(Fast Plus) | 1 Mbps | 高性能传感器 |
| 高速模式(High Speed) | 3.4 Mbps | 特殊高速设备(较少用) |
大多数STM32项目用400kHz足够。速率越高,对上拉电阻和布线要求也越高。
六、新手常见的3个坑
坑1:忘记加上拉电阻
I²C引脚是开漏结构,不加上拉电阻,SDA和SCL永远输出低电平,通信完全失败。
排查方法: 用示波器或逻辑分析仪看SCL/SDA波形,如果只有低电平没有高电平,就是没上拉。
坑2:地址没左移
数据手册写设备地址是0x68,代码里直接用了0x68,忘了左移1位变成0xD0(写入)或0xD1(读取)。
坑3:时钟频率太高
STM32的I²C外设配置时钟过快,导致波形失真。尤其当总线上挂多个设备、线缆较长或上拉电阻偏大时,降速是最直接的解决办法。遇到通信异常,先降到100kHz试一下,如果通了再逐步往上调。

你在调试I²C时遇到过什么奇葩问题?评论区聊聊,帮大家一起避坑。

607

被折叠的 条评论
为什么被折叠?



