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