4、I2C通信协议详解

各位工程师朋友,今天我们来聊聊I2C通信协议。说实话,I2C是我在压传感器调试中用得最多的接口之一。它只有两根线,却能挂载多个设备,调试起来非常方便。但方便归方便,坑也不少。我刚开始做项目时,就因为在I2C上拉电阻上栽过跟头,导致整个传感器阵列数据全乱套了。

好,咱们从最基础的开始,一步步把I2C吃透。

4.1 I2C总线物理层

I2C总线物理上就两条线:SCL(时钟线)SDA(数据线)。这两条线都是开漏输出,需要外接上拉电阻才能工作。

为什么用开漏结构?说白了,就是为了实现“线与”功能。多个设备可以同时挂在总线上,任何一个设备都可以把总线拉低,但谁都不能主动拉高。这样就不会出现两个设备同时输出高低电平导致短路的情况。

我见过不少新手问:能不能用推挽输出代替?千万别!我曾经试过一次,结果两个从机同时响应时,总线直接冒烟了。嗯,那味道至今难忘。

总线电容与上拉电阻的关系

I2C总线上每个设备都会贡献一定的引脚电容,加上PCB走线的寄生电容,总电容通常在10pF~100pF之间。这个电容直接影响上拉电阻的选择。

4.2 I2C协议帧格式

I2C的通信帧格式其实很规整。我把它拆成几个关键部分来讲:

  • 起始条件(START):SCL高电平时,SDA从高变低
  • 从机地址:7位或10位地址,后面跟读写位(0=写,1=读)
  • 应答位(ACK):每个字节后接收方必须拉低SDA表示收到
  • 数据字节:每次8位,MSB先传
  • 停止条件(STOP):SCL高电平时,SDA从低变高

你想想看,整个通信过程就像一场精心编排的舞蹈。主机负责发号施令,从机负责回应。谁该说话、谁该闭嘴,都靠这些信号来协调。

我的调试小技巧

用逻辑分析仪抓I2C波形时,我习惯先看START和STOP条件是否完整。很多通信失败的原因,就是起始或停止条件被噪声破坏了。

4.3 I2C时序与速率

I2C有几种标准速率模式:

模式 最高速率 典型应用场景
标准模式 100 kbit/s 大多数传感器、EEPROM
快速模式 400 kbit/s 高速传感器、ADC/DAC
快速模式+ 1 Mbit/s 大容量存储器
高速模式 3.4 Mbit/s 视频、图像传感器

压传感器通常工作在标准模式或快速模式。我个人习惯用400kHz,既能保证速度,又不容易出问题。

时序上要注意几个关键参数:

  • t_HD_STA:起始条件保持时间,至少4.7μs(标准模式)
  • t_SU_STA:起始条件建立时间,至少4.7μs
  • t_HD_DAT:数据保持时间,至少0ns
  • t_SU_DAT:数据建立时间,至少250ns
  • t_SU_STO:停止条件建立时间,至少4.7μs

为什么会强调这些时间?因为MCU的I2C外设通常会自动处理,但如果你用GPIO模拟I2C,这些参数就得自己把控了。我曾经在STM32上用GPIO模拟I2C读压传感器,就是因为t_HD_STA没满足,导致从机一直不响应。

4.4 I2C上拉电阻计算

上拉电阻的选择,说白了就是在功耗和信号完整性之间找平衡。

计算公式其实很简单:

R_pu(min) = V_cc / I_ol(max)
R_pu(max) = t_r(max) / (0.8473 × C_bus)

其中:

  • V_cc:总线电压(通常是3.3V或5V)
  • I_ol(max):输出低电平时的最大灌电流(通常3mA~20mA)
  • t_r(max):允许的最大上升时间(标准模式1μs,快速模式300ns)
  • C_bus:总线总电容

举个例子,3.3V系统,总线电容50pF,标准模式:

R_pu(min) = 3.3V / 3mA = 1.1kΩ
R_pu(max) = 1μs / (0.8473 × 50pF) ≈ 23.6kΩ

所以上拉电阻应该在1.1kΩ~23.6kΩ之间。我一般取中间值4.7kΩ或10kΩ。

避坑指南:我曾经踩过的坑

有一次我为了省功耗,把上拉电阻换成了100kΩ。结果总线上升时间太长,400kHz模式下数据完全错乱。后来用示波器一看,SCL的上升沿都快变成正弦波了。所以记住:高速率配小电阻,低速率配大电阻

另外,如果总线上挂的设备很多,总线电容会增大,这时候就得适当减小上拉电阻。我一般按每增加一个设备,上拉电阻减小10%来估算。

我的推荐值

对于大多数压传感器应用(3.3V,标准模式,2~4个设备),我推荐使用4.7kΩ上拉电阻。如果总线长度超过20cm,建议降到2.2kΩ。

好了,I2C协议的基础知识就讲到这里。这些内容看起来简单,但实际调试中每个细节都可能成为瓶颈。下次遇到I2C通信问题,不妨先从波形和上拉电阻查起。


公众号:蓝海资料掘金营,微信deep3321