3. I2C协议基础:I2C通信时序
I2C(Inter-Integrated Circuit)总线是一种由Philips公司(现NXP)开发的两线式串行总线,广泛应用于触摸屏控制器与主处理器之间的通信。理解其通信时序是分析触摸屏I2C信号波形的核心前提。本节将详细拆解I2C协议的四个关键时序要素:起始条件、停止条件、数据有效性与应答机制。
3.1 总线空闲状态与基本信号线
I2C总线仅由两条双向信号线组成:
- SCL(Serial Clock Line):串行时钟线,由主设备(Master)驱动。
- SDA(Serial Data Line):串行数据线,用于传输地址、数据及控制位。
在总线空闲状态下,SCL和SDA均通过上拉电阻保持高电平。任何设备要开始通信,必须先产生起始条件。
调试提示: 使用逻辑分析仪或示波器抓取I2C波形时,首先观察总线空闲时SCL和SDA是否均为高电平。若其中一线被拉低,说明总线被占用或存在异常锁死。
3.2 起始条件(Start Condition)与停止条件(Stop Condition)
起始条件和停止条件是I2C通信的“帧头”和“帧尾”,由主设备产生。它们的时序定义非常严格:
| 条件类型 | 信号变化顺序 | 关键时序要求 |
|---|---|---|
| 起始条件(S) | SCL保持高电平 → SDA从高电平切换到低电平 | SDA下降沿必须在SCL高电平期间完成 |
| 停止条件(P) | SCL保持高电平 → SDA从低电平切换到高电平 | SDA上升沿必须在SCL高电平期间完成 |
起始条件与停止条件的波形关系如下图所示:
关键点: 起始条件和停止条件都是SDA在SCL高电平期间发生的跳变。在数据传输阶段,SDA只能在SCL低电平时变化,这是区分“条件”与“数据”的核心规则。
3.3 数据有效性(Data Validity)
I2C协议规定,在数据传输过程中,SDA线上的数据必须在SCL时钟的特定相位保持稳定:
- 数据稳定期: 在SCL时钟的高电平期间,SDA上的数据必须保持稳定不变。
- 数据变化期: 在SCL时钟的低电平期间,SDA上的数据允许发生变化(准备下一个bit)。
每个时钟脉冲传输1位数据。数据以MSB(最高有效位)优先的方式传输。一个完整的数据字节(8位)传输完成后,紧接着会有一个时钟周期用于应答位。
常见错误: 如果从设备在SCL高电平时检测到SDA发生跳变,会误判为起始条件或停止条件,导致通信错位。调试时若发现数据帧长度异常,应重点检查SDA在SCL高电平期间的稳定性。
3.4 应答机制(Acknowledge Mechanism)
应答机制是I2C协议保证数据可靠传输的核心。每传输完一个字节(8位数据),接收方必须在第9个时钟周期内产生一个应答位:
- 应答(ACK): 接收方在第9个时钟周期将SDA拉低,表示“已收到,请继续发送”。
- 非应答(NACK): 接收方在第9个时钟周期保持SDA为高电平,表示“未准备好/传输结束/设备不存在”。
完整的I2C数据帧结构(写操作)如下表所示:
| 阶段 | 信号内容 | 位数 | 方向 |
|---|---|---|---|
| 起始条件 | SDA↓ while SCL=H | 1 | 主→从 |
| 从设备地址 | 7位地址 + R/W位 | 8 | 主→从 |
| 应答位 | ACK (SDA=L) 或 NACK (SDA=H) | 1 | 从→主 |
| 数据字节 | 8位数据 | 8 | 主→从 |
| 应答位 | ACK (SDA=L) 或 NACK (SDA=H) | 1 | 从→主 |
| 停止条件 | SDA↑ while SCL=H | 1 | 主→从 |
应答机制的时序细节如下图所示:
调试要点: 在触摸屏I2C通信中,如果主设备发送从设备地址后未收到ACK(SDA保持高电平),通常表示:
- 从设备地址错误(常见于7位地址与8位地址混淆)。
- 从设备未上电或处于复位状态。
- I2C总线存在硬件冲突(如SDA被其他设备拉死)。
3.5 完整I2C通信帧示例
结合上述四个要素,一个完整的I2C写操作帧(主设备向触摸屏控制器写入配置寄存器)的时序流程如下:
- 起始条件: 主设备产生SDA下降沿(SCL高电平)。
- 发送从设备地址: 主设备发送7位地址(例如触摸屏控制器地址0x38) + 写位(R/W=0)。
- 等待应答: 从设备在第9个时钟拉低SDA(ACK)。
- 发送寄存器地址: 主设备发送8位寄存器地址字节。
- 等待应答: 从设备再次发送ACK。
- 发送数据: 主设备发送8位数据字节。
- 等待应答: 从设备发送ACK。
- 停止条件: 主设备产生SDA上升沿(SCL高电平),释放总线。
实战关联: 在调试触摸屏时,使用逻辑分析仪捕获I2C波形,应首先检查起始条件后的第一个字节(地址+方向位)是否正确,以及是否收到ACK。这是判断触摸屏控制器是否正常响应的最快方法。