1. I2C协议基础:物理层特性、总线拓扑结构、开漏输出与上拉电阻
各位同学,咱们今天正式开讲I2C协议。说实话,我做了十几年嵌入式,调试过的通信协议少说也有七八种,但I2C始终是我又爱又恨的一个。爱它简单——两根线就能挂一堆设备;恨它坑多——稍不注意就锁死总线、地址冲突、时序翻车。这一章咱们先把地基打牢,后面实战才不会慌。
1.1 物理层特性:两根线怎么干活?
I2C总线就两条线:SCL(时钟线)和SDA(数据线)。所有设备都挂在这两根线上,主机负责产生时钟,从机响应数据。你想想看,这么多设备共用两根线,怎么区分谁在说话?靠的就是地址和时序。
我习惯把I2C比作一个会议室:SCL是主持人(时钟),SDA是话筒(数据)。主持人喊一句“开始发言”,大家按地址轮流说话。谁抢话,总线就乱套。
| 信号线 | 功能 | 方向 | 关键特性 |
|---|---|---|---|
| SCL | 串行时钟 | 主机→从机 | 由主机驱动,决定通信速率 |
| SDA | 串行数据 | 双向 | 数据/地址/应答都在此线上传输 |
这里有个关键点:I2C是同步通信。数据在SCL的上升沿被采样,下降沿切换。所以SCL的波形质量直接决定通信成败。我在项目中遇到过因为PCB走线过长导致SCL边沿变缓,结果从机采样错位的案例——嗯,后面讲时序时会细说。
1.2 总线拓扑结构:一主多从 vs 多主多从
I2C支持两种拓扑:单主机多从机和多主机多从机。实际项目里90%以上都是单主机模式——一个MCU挂一堆传感器、EEPROM、IO扩展芯片。
标准拓扑参数:
- 标准模式:100 kbps,最大总线电容400 pF
- 快速模式:400 kbps,最大总线电容400 pF
- 高速模式:3.4 Mbps,需要额外电流源
- 每个设备有唯一7位或10位地址
- 理论上最多挂127个设备(7位地址)
为什么实际很少挂满127个?因为总线电容限制。每个设备的引脚都有寄生电容,加上PCB走线电容,总和超过400 pF信号就变形了。我做过一个项目,挂了8个传感器,总线长度30cm,400kHz下波形已经有点圆角了——后来降到了200kHz才稳定。
下面这张图展示了典型的单主机多从机拓扑结构:
1.3 开漏输出:为什么I2C不用推挽?
这是很多新手第一个想不通的问题。为什么I2C要用开漏输出?说白了,就是为了避免多个设备同时驱动总线导致短路。
开漏输出的特点:
- 输出低电平时,内部MOS管导通,将总线拉低
- 输出高电平时,内部MOS管截止,总线由上拉电阻拉高
- 多个设备可以同时拉低总线——谁先拉低谁说了算
你想想看,如果用推挽输出,主机输出高电平、从机输出低电平,两根线直接怼在一起——那就是短路,轻则数据错误,重则烧毁IO口。开漏输出天然解决了这个问题。
调试小技巧:用示波器看SDA波形时,如果发现低电平正常、高电平只有2V左右(3.3V系统),大概率是上拉电阻太小或者总线电容太大。我一般先用4.7kΩ上拉,挂的设备多了再换成2.2kΩ。
1.4 上拉电阻:选大了还是选小了?
上拉电阻的选择直接影响功耗和信号质量。选大了,上升沿变缓,高速通信容易出错;选小了,功耗增加,低电平可能抬升。
| 上拉电阻 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 1kΩ ~ 2.2kΩ | 上升沿陡峭,适合高速 | 功耗大,低电平可能偏高 | 快速模式、长总线、多设备 |
| 4.7kΩ ~ 10kΩ | 功耗低,信号干净 | 上升沿较缓 | 标准模式、短距离、少设备 |
| 10kΩ以上 | 极低功耗 | 上升沿很缓,易受干扰 | 低速、低功耗、板内短距离 |
我个人的经验公式:Rp ≈ tr / (0.847 × Cb),其中tr是期望的上升时间,Cb是总线总电容。但实际项目中我很少算这么细——先上4.7kΩ,示波器看波形,上升沿超过300ns就换小一点的。
曾经踩过的坑:有一次做温湿度采集模块,用了10kΩ上拉,总线挂了3个传感器,距离15cm。标准模式100kHz下跑得好好的,换成400kHz后偶尔通信失败。示波器一看,上升沿都快1μs了——SCL高电平时间不够,从机采样点飘了。换成2.2kΩ后问题解决。
1.5 总线电容:看不见的杀手
每个I2C设备的引脚都有寄生电容,PCB走线也有分布电容。标准规定总线电容不超过400 pF。超过这个值,上升沿会明显变缓,信号完整性下降。
典型电容估算:
- 每个设备引脚:5 ~ 10 pF
- PCB走线:约1 pF/cm(取决于板层和线宽)
- 连接器/排线:10 ~ 30 pF
举个例子:挂8个设备(8×10 pF = 80 pF),PCB走线30cm(30 pF),加上连接器20 pF,总共130 pF——远低于400 pF,很安全。但如果用长排线连接外部模块,排线电容可能达到100 pF/m,加上设备电容,很容易超标。
总线电容超标时的典型现象:
- SCL/SDA上升沿变缓,呈圆弧状
- 高速模式(400kHz以上)通信失败
- 偶尔出现ACK丢失或数据错位
- 用长线缆时波形出现振铃
嗯,这一章的内容就到这里。物理层是I2C的根基,开漏输出和上拉电阻看似简单,但选型不当会引发各种奇怪问题。后面咱们讲时序和地址的时候,你会发现这些基础知识处处都用得上。