1. I2C协议概述:嵌入式世界的"电话线"
I2C(Inter-Integrated Circuit)是飞利浦半导体(现NXP)在1982年推出的两线制串行通信协议,就像嵌入式设备之间的电话系统。它用两根线(SDA数据线和SCL时钟线)就能连接多个设备,这种简洁性使其成为传感器、EEPROM、RTC等低速外设的首选接口。我在实际项目中遇到过I2C地址冲突导致系统异常的情况——两个0x3C地址的OLED屏和气压计同时响应主机,这让我深刻理解了地址分配的重要性。
典型应用场景包括:
- 传感器数据采集(温度、湿度、加速度等)
- 小容量存储设备访问(24C02等EEPROM)
- 实时时钟模块(DS1307等)
- 数字电位器、IO扩展器等外设控制
与SPI相比,I2C节省引脚但速度较慢(标准模式100kHz,快速模式400kHz);与UART相比,它有时钟同步机制且支持多主机。现代变种如I3C在保持兼容性的同时提升了速率(可达12.5MHz)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 物理层与电气特性解析
2.1 总线拓扑结构
I2C采用开漏输出设计,必须外接上拉电阻(通常4.7kΩ)。我在PCB设计中曾因忘记加上拉电阻导致通信失败——SDA线始终为低电平。正确的连接方式应该是:
code复制VCC
|
[R] 4.7kΩ
|
+---- SDA/SCL
|
Device1 Device2 ... DeviceN
2.2 信号电平规范
- 逻辑低电平:VOL ≤ 0.3VDD
- 逻辑高电平:VIH ≥ 0.7VDD
- 总线电容限制:≤400pF(标准模式)
注意:上拉电阻值需根据总线电容计算,公式为 Rp < (VDD - VOL)/(3mA)。例如5V系统最小电阻为(5-0.4)/0.003≈1.53kΩ
3. 协议时序深度拆解
3.1 起始与停止条件
起始条件(START)的精确时序是:
- SCL高电平期间
- SDA从高到低跳变
- 保持时间tHD;STA ≥ 4μs(标准模式)
停止条件(STOP)则是:
- SCL高电平期间
- SDA从低到高跳变
- 建立时间tSU;STO ≥ 4μs
我在调试STM32硬件I2C时发现,某些MCU对起始条件建立时间特别敏感,需要微调时序配置寄存器。
