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位地址在总线上的帧起始结构差异:
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在字节传输中的时序位置:
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)。控制器驱动会自动处理重复起始条件。
下图展示了复合操作帧的完整流程:
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。这些是判断通信是否正常的黄金指标。