1. I2C总线基础
各位同学好,我是你们的硬件工程师老张。今天咱们聊聊I2C总线,这东西在嵌入式开发里太常见了。说实话,我刚开始接触I2C时也踩过不少坑,今天就把这些经验分享给大家。
1.1 I2C协议概述
I2C,全称Inter-Integrated Circuit,是飞利浦公司(现在的NXP)在1980年代搞出来的。说白了,就是用来让芯片之间聊天的。你想想看,一个板子上可能有CPU、传感器、存储器、IO扩展芯片,它们之间怎么传数据?I2C就是干这个的。
I2C协议有几个核心特点:
- 两线制:只需要两根线——SCL(时钟线)和SDA(数据线)
- 主从架构:一个主设备可以带多个从设备
- 多主支持:多个主设备可以共享总线(但实际项目中很少这么用)
- 地址寻址:每个从设备有唯一地址,7位或10位
我记得刚入行那会儿,总觉得I2C协议挺简单的,不就是两根线嘛。后来做项目才发现,越简单的东西,坑越多。嗯,咱们慢慢聊。
1.2 物理层特性
I2C的物理层,说白了就是两根线怎么接、怎么拉。这里有几个关键点:
关键特性:
- SCL和SDA都是开漏输出(Open-Drain)
- 需要外部上拉电阻
- 高电平由上拉电阻决定,低电平由器件拉低
- 支持线与(Wired-AND)逻辑
为什么会用开漏输出?我给大家解释一下。开漏输出允许不同电压的器件挂在同一总线上。比如你的主控是3.3V,传感器是5V,只要上拉电阻接到5V,大家都能正常工作。我在项目中遇到过这种情况,当时用3.3V的STM32去控制5V的OLED屏,就是靠这个特性搞定的。
1.3 电气规范
电气规范这块,我建议大家重点关注几个参数:
| 参数 | 标准模式(100kHz) | 快速模式(400kHz) | 高速模式(3.4MHz) |
|---|---|---|---|
| 最大时钟频率 | 100 kHz | 400 kHz | 3.4 MHz |
| 最大总线电容 | 400 pF | 400 pF | 100 pF |
| 上拉电阻范围 | 1kΩ ~ 10kΩ | 1kΩ ~ 4.7kΩ | 0.5kΩ ~ 2kΩ |
| 输入低电平 | 0.3 × VDD | 0.3 × VDD | 0.3 × VDD |
| 输入高电平 | 0.7 × VDD | 0.7 × VDD | 0.7 × VDD |
个人经验:上拉电阻的选择很关键。阻值太小,功耗大;阻值太大,信号上升沿变慢。我一般习惯用4.7kΩ,400kHz以下基本没问题。如果总线长度超过20cm,建议用2.2kΩ。
1.4 总线拓扑结构
I2C的总线拓扑,说白了就是怎么把多个设备连在一起。常见的拓扑有:
1.4.1 单主多从
这是最常见的结构。一个主设备(通常是MCU)带多个从设备。每个从设备有不同地址,主设备通过地址来选择跟谁通信。
// 典型的I2C总线连接
MCU (主) ---- SCL ---- 传感器A (从, 地址0x48)
| └── 传感器B (从, 地址0x49)
| └── EEPROM (从, 地址0x50)
|
└---- SDA ---- 同上
1.4.2 多主多从
多个主设备共享总线。这需要总线仲裁机制。说实话,我在实际项目中很少用这种结构,太复杂了。除非是像双MCU通信这种特殊场景。
避坑指南:我曾经在一个项目里,把5个I2C设备挂在一根总线上,结果通信老是出错。后来发现总线电容太大了,信号都变形了。解决办法是:要么降低速率,要么用I2C总线扩展器(如PCA9548)分路。
1.4.3 总线长度限制
I2C总线长度受限于总线电容。标准模式下,总线电容不能超过400pF。我给大家一个经验值:
- 100kHz:最长约2米(用屏蔽线)
- 400kHz:最长约0.5米
- 超过1米:建议用I2C总线驱动器(如P82B715)
1.5 实际项目中的注意事项
聊了这么多理论,我给大家总结几个实际项目中容易踩的坑:
- 上拉电阻别乱选:我见过有人用10kΩ上拉,结果400kHz下信号根本拉不起来。建议按表格选。
- 地址冲突:两个从设备地址一样,那就没法用了。选器件时注意地址引脚能不能改。
- 电平匹配:不同电压的器件挂一起,上拉电阻的电压要选对。我习惯用最高电压。
- 总线电容:设备多了,总线电容就大了。超过400pF,信号就废了。
小技巧:调试I2C时,我习惯用逻辑分析仪抓波形。看SCL和SDA的时序对不对,地址对不对,ACK有没有。比用示波器方便多了。
好了,I2C总线基础就聊到这儿。下一节咱们讲I2C在设备树里的配置方法,到时候我会带大家手把手写设备树节点。记住,I2C看似简单,但细节决定成败。嗯,今天就到这里。