I2C总线通信全解析:从原理到实战

1. 简述 I2C 总线特点

I2C(Inter-Integrated Circuit)是一种同步、半双工、串行通信总线,核心特点如下:

  • 物理线少 :仅需 2 根信号线 ------SDA(串行数据线)SCL(串行时钟线),即可实现多设备通信。

  • 多主多从架构:支持多个主机和多个从机挂载在同一条总线上,每个从机拥有唯一的 7 位 / 10 位设备地址。

  • 开漏输出 + 上拉电阻:总线引脚为开漏输出结构,必须外接上拉电阻才能输出高电平,天然支持线与逻辑与总线仲裁。

  • 同步通信:由主机提供时钟信号 SCL,数据收发与时钟同步,接收方按时钟节拍采样数据。

  • 应答机制:每传输 1 字节数据后,接收方必须回复应答位,确保通信可靠。

  • 总线仲裁:多主机同时发送数据时,通过总线仲裁机制避免冲突,保证数据不损坏。

2. 设计 I2C 时需要注意什么

硬件层面
  • 上拉电阻选型:SDA、SCL 必须接上拉电阻,常用阻值 4.7kΩ 或 10kΩ;通信速率越高、总线负载越大,电阻取值应越小。

  • 电平匹配:总线上所有设备的 I/O 电平需兼容,不同电压域设备需加电平转换芯片。

  • 总线负载:总线寄生电容不能超过规范上限(标准模式最大 400pF),否则会导致信号畸变、通信失败。

  • 硬件地址配置:同型号多从机挂载时,需通过硬件引脚设置不同地址,避免地址冲突。

  • 共地处理:总线上所有设备必须共地,否则会出现电平偏移。

软件层面
  • 时序合规:严格遵守起始 / 停止信号、数据建立 / 保持时间的时序要求,确保 SCL 高电平时 SDA 稳定。

  • 超时机制:读写操作必须添加超时判断,防止从机无应答时程序死等、总线挂死。

  • 总线恢复:添加总线异常复位逻辑(如模拟时钟脉冲、重新发送起始信号),应对总线锁死场景。

  • 多主机场景:需实现总线仲裁与冲突检测,避免多主机同时抢占总线。

3. 描述 I2C 通信的时序

一次完整的 I2C 写传输时序流程如下:

  1. 起始信号(START):SCL 保持高电平时,SDA 由高电平跳变为低电平,标志一次通信开始。

  2. 数据传输:SCL 为低电平时,发送方修改 SDA 电平;SCL 为高电平时,接收方采样 SDA 电平(此时 SDA 必须稳定)。每 8 个时钟脉冲传输 1 字节数据,高位在前(MSB)。

  3. 应答信号(ACK/NACK):每传输完 1 字节(8 位)后,第 9 个时钟周期由接收方驱动 SDA:拉低为应答(ACK),保持高为非应答(NACK)。

  4. 停止信号(STOP):SCL 保持高电平时,SDA 由低电平跳变为高电平,标志一次通信结束,释放总线。

读传输流程:起始 + 从机地址(写方向)+ 应答 + 寄存器地址 + 应答 + 重复起始 + 从机地址(读方向)+ 应答 + 读取数据 + NACK + 停止。

4. I2C 常见的通信速率

|------------------------|----------|--------------|
| 模式 | 速率 | 说明 |
| 标准模式(Standard-mode) | 100 kbps | 最基础、兼容性最好的速率 |
| 快速模式(Fast-mode) | 400 kbps | 嵌入式开发最常用 |
| 快速模式增强(Fast-mode Plus) | 1 Mbps | 增强型快速模式 |
| 高速模式(High-speed mode) | 3.4 Mbps | 高速传输,需额外协议支持 |

常用的 AT24C02 等存储芯片,通常支持 100 kbps 和 400 kbps 两种速率。

5. 起始信号后的 7 位、第 8 位、第 9 位含义

  • 前 7 位从机设备地址,用于主机选中总线上对应的从机设备。

  • 第 8 位读写控制位(R/W)0 表示主机向从机执行写操作1 表示主机向从机执行读操作

  • 第 9 位应答位(ACK/NACK),由从机驱动;从机拉低 SDA 表示应答(ACK,确认收到数据),保持高电平表示非应答(NACK)。

6. AT24C02 的容量大小

AT24C02 的总容量为 2 Kbit(2048 比特) ,换算为字节是 256 字节(Byte),地址范围 0x00 ~ 0xFF。

7. AT24C02 的设备地址

AT24C02 使用 7 位设备地址

  • 高 4 位固定为 1010(二进制),即十六进制 0xA

  • 低 3 位由芯片的 A2、A1、A0 三个硬件引脚的电平决定,接地为 0,接 VCC 为 1。

当 A2、A1、A0 全部接地(最常用接法)时:

  • 7 位地址为 0101000,即 0x50

  • 加上读写位后,8 位写地址为 0xA0,8 位读地址为 0xA1

总线上最多可同时挂载 8 片 AT24C02,通过 A2/A1/A0 引脚区分地址。

相关推荐
愈心凌2 小时前
SSI 绝对值编码器通信 - 单片机TM32Cubemax配置教程
单片机·嵌入式硬件
科芯创展2 小时前
1.5A,5.5VIN,单灯,XZ4059A/D,4.2V/4.34V
单片机
江哥工作室2 小时前
几分钱的 LM358 采集心电
单片机·lm358·心电·小信号
迷茫不知归路2 小时前
简单认识一种外设硬件:温度传感器ds18b20
嵌入式硬件
z20348315202 小时前
CLion开发STM32——文件管理
stm32·单片机·嵌入式硬件·clion
weixin_452077643 小时前
STM32 烧录程序后上电不工作问题集合
stm32·单片机·嵌入式硬件
姜小二3 小时前
QAxObject实现读写excel
嵌入式硬件·excel
沸速存储3 小时前
内存技术的未来:DDR6、CAMM2与CXL将如何改变计算架构
科技·嵌入式硬件·架构·计算机外设·电脑
LCG元4 小时前
STM32多传感器数据采集系统设计:I2C+ADC+UART+低功耗工程实战
stm32·单片机·嵌入式硬件