2. I2C数据传输格式:7位与10位地址模式、读写操作位、ACK/NACK机制、数据帧格式

I2C总线上的数据传输遵循严格定义的帧格式。理解地址模式、读写控制、应答机制以及数据帧结构,是进行寄存器配置和故障排查的基础。本章将逐一拆解这些核心概念,并结合ARM平台的实际应用场景进行说明。

2.1 7位地址模式与10位地址模式

I2C总线使用唯一地址来标识从设备。标准模式支持7位地址,最多可挂载112个节点(保留16个地址)。扩展模式支持10位地址,允许连接多达1024个设备。

特性 7位地址模式 10位地址模式
地址位宽 7 bits 10 bits
最大设备数 112(理论) 1024(理论)
首字节格式 AAAAAAA R/W 11110AA R/W(前5位固定为11110)
兼容性 所有设备支持 需从设备支持
ARM平台常见场景 EEPROM、传感器、RTC 高密度存储、复杂PMIC
实战提示:在ARM Linux内核中,通过设备树(Device Tree)的 reg 属性指定从设备地址。若使用10位地址,需在驱动中设置 I2C_CLIENT_TEN 标志。

下图展示了7位地址与10位地址在总线上的帧起始结构差异:

7位地址 vs 10位地址 起始帧结构 7位地址模式: S 7位地址 (A6-A0) R/W A 10位地址模式(写): S 11110 A9 A8 W A A7 - A0 A 图例: 起始条件 (S) 地址字节 读写位 应答位 (A) 10位地址头

2.2 读写操作位(R/W)

在地址字节之后,紧接着的是1位读写控制位(R/W)。该位决定了数据传输的方向:

  • R/W = 0(写操作):主设备向从设备发送数据。主设备充当发送器,从设备充当接收器。
  • R/W = 1(读操作):主设备从从设备接收数据。主设备充当接收器,从设备充当发送器。
关键点:在ARM I2C控制器驱动中,读写位由硬件自动根据操作类型设置。驱动开发者只需调用 i2c_master_send() 或 i2c_master_recv() 接口,无需手动拼接R/W位。

2.3 ACK/NACK机制

I2C总线使用应答(ACK)和非应答(NACK)机制来确保数据传输的可靠性。每传输一个字节(8位),接收方必须在第9个SCL时钟周期内拉低SDA线(ACK)或保持高电平(NACK)。

信号 SDA电平(第9时钟) 含义 典型触发场景
ACK 低电平 字节接收成功,可以继续传输 正常数据传输、地址匹配
NACK 高电平 字节接收失败或传输结束 地址未匹配、从设备忙、读操作结束
故障排查要点:在ARM平台调试I2C时,若示波器捕获到NACK,常见原因包括:从设备地址错误、从设备未上电、总线被拉死、SCL时钟频率不匹配。驱动日志中的 -ENXIO 错误通常对应NACK。

下图展示了ACK/NACK在字节传输中的时序位置:

I2C字节传输与ACK/NACK时序 SCL SDA D7 D6 D5 D4 D3 D2 D1 D0 ACK D7 D6 D5 D4 D3 D2 D1 D0 NACK 说明: • 前8个SCL时钟传输数据字节(D7-D0),第9个时钟为应答位。 • 接收方在第9时钟拉低SDA = ACK;保持高电平 = NACK。 • 主设备在读取最后一个字节后发送NACK,通知从设备停止发送。

2.4 数据帧格式

一个完整的I2C数据传输帧由起始条件、地址字节、若干数据字节和停止条件组成。根据读写方向的不同,帧结构略有差异。

2.4.1 写操作帧格式

| S | 7位/10位地址 | W | A | 数据字节1 | A | 数据字节2 | A | ... | 数据字节N | A | P |
  • S:起始条件(SCL高电平时SDA下降沿)
  • W:写位(0)
  • A:应答位(从设备拉低SDA)
  • 数据字节:8位数据,MSB先行
  • P:停止条件(SCL高电平时SDA上升沿)

2.4.2 读操作帧格式

| S | 7位/10位地址 | R | A | 数据字节1 | A | 数据字节2 | A | ... | 数据字节N | N | P |
  • R:读位(1)
  • N:非应答位(主设备在最后一个字节后发送NACK)

2.4.3 复合操作帧格式(结合写地址+读数据)

ARM平台驱动中常见的操作模式,例如读取传感器寄存器值:

| S | 从设备地址 | W | A | 寄存器地址 | A | Sr | 从设备地址 | R | A | 数据字节 | N | P |
  • Sr:重复起始条件(Restart),无需先发停止条件即可切换方向
驱动实现参考:在Linux内核中,复合操作通过 i2c_msg 结构体数组实现。第一个msg为写方向(flags=0),第二个msg为读方向(flags=I2C_M_RD)。控制器驱动会自动处理重复起始条件。

下图展示了复合操作帧的完整流程:

I2C复合操作帧格式(写地址 + 读数据) S 从设备地址 W A 寄存器地址 A Sr 从设备地址 R A 数据字节 N P 关键说明: • Sr = 重复起始条件,无需先发P再发S。 • 从设备地址在写和读阶段相同。 • 最后一个数据字节主设备发送NACK,然后发P。

2.5 数据帧格式总结

帧类型 起始 地址 R/W 数据 结束 应答特点
写操作 S 7/10位 W (0) 1~N字节 P 每个字节后从设备ACK
读操作 S 7/10位 R (1) 1~N字节 P 主设备在最后字节发NACK
复合操作 S + Sr 7/10位(两次) W + R 写地址 + 读数据 P 写阶段从设备ACK,读阶段主设备NACK
ARM平台调试技巧:使用逻辑分析仪抓取I2C总线时,重点关注:起始条件后的第一个字节是否与设备树中配置的地址匹配(左移1位后加上R/W位);数据字节后的第9个时钟是否出现ACK;停止条件前是否出现NACK。这些是判断通信是否正常的黄金指标。