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 实际项目中的注意事项

聊了这么多理论,我给大家总结几个实际项目中容易踩的坑:

  1. 上拉电阻别乱选:我见过有人用10kΩ上拉,结果400kHz下信号根本拉不起来。建议按表格选。
  2. 地址冲突:两个从设备地址一样,那就没法用了。选器件时注意地址引脚能不能改。
  3. 电平匹配:不同电压的器件挂一起,上拉电阻的电压要选对。我习惯用最高电压。
  4. 总线电容:设备多了,总线电容就大了。超过400pF,信号就废了。

小技巧:调试I2C时,我习惯用逻辑分析仪抓波形。看SCL和SDA的时序对不对,地址对不对,ACK有没有。比用示波器方便多了。

好了,I2C总线基础就聊到这儿。下一节咱们讲I2C在设备树里的配置方法,到时候我会带大家手把手写设备树节点。记住,I2C看似简单,但细节决定成败。嗯,今天就到这里。