2. I2C总线协议基础:物理层、时序与地址

I2C(Inter-Integrated Circuit)总线是嵌入式系统中使用最广泛的板级通信协议之一。FT5x06触摸屏控制器正是通过I2C接口与主控CPU交换触摸坐标数据。理解I2C的物理层特性、时序信号和数据帧格式,是编写正确驱动和排查硬件故障的前提。

学习目标:掌握I2C总线物理层电气特性;能够识别起始条件、停止条件、数据有效窗口;理解7位地址与10位地址的帧结构差异;能够使用逻辑分析仪解析I2C波形。

2.1 I2C物理层:双线与开漏

I2C总线仅使用两根信号线:SCL(串行时钟线)和SDA(串行数据线)。所有设备都挂接在这两根线上,采用开漏(Open-Drain)输出结构,配合外部上拉电阻实现线与逻辑。

信号线 方向 电气特性 空闲状态
SCL 主设备输出,从设备可选时钟拉伸 开漏 + 上拉电阻 高电平
SDA 双向(主→从或从→主) 开漏 + 上拉电阻 高电平
调试要点:用示波器测量SCL和SDA空闲电平。如果空闲时不是高电平(通常3.3V或1.8V),说明上拉电阻缺失或焊接短路。FT5x06的I2C引脚通常需要4.7kΩ上拉电阻到VDDIO。

开漏结构的核心优势:多主设备仲裁。当两个主设备同时尝试驱动总线时,谁先输出低电平谁就赢得仲裁,输的一方自动释放总线。这种机制不需要额外的片选线。

I2C总线物理连接拓扑 主设备(CPU) FT5x06 其他从设备 SDA SCL Rp VDD Rp VDD 物理层关键约束 所有设备SDA/SCL引脚必须为开漏或开集电极;总线电容不超过400pF;上拉电阻值根据总线速度和负载选择

2.2 起始条件与停止条件

I2C总线的数据传输由两个特殊的信号序列界定:起始条件(START)和停止条件(STOP)。这两个条件由主设备产生,且SCL和SDA的时序关系有严格定义。

  • 起始条件(S):SCL为高电平时,SDA从高电平切换到低电平。
  • 停止条件(P):SCL为高电平时,SDA从低电平切换到高电平。
  • 重复起始条件(Sr):在未产生停止条件的情况下,再次产生起始条件。用于改变数据传输方向或切换从设备。
起始条件与停止条件时序 SCL SDA 起始条件 SCL高→SDA下降 停止条件 SCL高→SDA上升
常见硬件错误:如果SDA在SCL高电平时发生非预期的电平变化(毛刺或抖动),从设备会误判为起始或停止条件,导致总线状态机紊乱。调试时检查SCL和SDA的上升/下降时间是否超过I2C规范(标准模式1000ns,快速模式300ns)。

2.3 数据帧格式与有效窗口

I2C的数据传输以字节(8位)为单位,每个字节后跟随一个应答位(ACK/NACK)。数据在SCL的上升沿被采样,因此SDA必须在SCL低电平时变化,在SCL高电平时保持稳定。

  • 数据有效窗口:SCL高电平期间,SDA必须保持稳定;SCL低电平期间,SDA允许变化。
  • 字节传输顺序:MSB(最高位)先传输,LSB(最低位)最后传输。
  • 应答位:第9个SCL时钟周期,接收方将SDA拉低表示ACK,保持高电平表示NACK。
I2C数据帧格式(单字节写操作) SCL SDA D7 D6 D5 D4 D3 D2 D1 D0 ACK 数据有效窗口(SCL高电平期间SDA稳定) 每个字节8位 + 1位应答,MSB先传;SCL高电平时SDA变化视为起始/停止条件

2.4 7位地址与10位地址

I2C总线上的每个从设备都有一个唯一的地址。标准模式使用7位地址,最多支持112个设备(保留16个地址)。扩展模式使用10位地址,最多支持1024个设备。

2.4.1 7位地址帧结构

主设备发送起始条件后,首先发送7位从设备地址 + 1位读写位(R/W)。读写位为0表示写操作,为1表示读操作。这8位数据构成地址字节。

位序号 7 6 5 4 3 2 1 0
含义 A6 A5 A4 A3 A2 A1 A0 R/W
FT5x06示例 0 1 1 1 0 0 0 0(写)

FT5x06的7位I2C地址为0x38(二进制0111000)。写操作的地址字节为0x70,读操作的地址字节为0x71。

2.4.2 10位地址帧结构

10位地址使用两个字节传输。第一个字节的前5位固定为11110,后2位是地址的高2位(A9和A8),第8位是R/W。第二个字节是地址的低8位(A7~A0)。

字节 位7 位6 位5 位4 位3 位2 位1 位0
第1字节 1 1 1 1 0 A9 A8 R/W
第2字节 A7 A6 A5 A4 A3 A2 A1 A0
驱动编写提示:Linux内核I2C子系统通过i2c_client.addr字段存储7位地址。如果使用10位地址,需要设置I2C_CLIENT_TEN标志。FT5x06仅支持7位地址,驱动中直接使用0x38即可。

2.5 完整读写时序流程

结合上述知识点,一个完整的I2C写操作时序如下:

  1. 主设备产生起始条件(S)。
  2. 主设备发送7位地址 + 写位(0),等待从设备ACK。
  3. 主设备发送寄存器地址字节(如FT5x06的触摸点数据寄存器),等待ACK。
  4. 主设备发送数据字节(写操作时),每字节后等待ACK。
  5. 主设备产生停止条件(P)。

读操作在发送寄存器地址后,需要产生重复起始条件(Sr),然后发送7位地址 + 读位(1),之后主设备转为接收模式,每接收一个字节后发送ACK(最后一个字节发送NACK),最后产生停止条件。

FT5x06 I2C读操作完整时序 起始条件 0x70 (地址+写) 等待ACK 寄存器地址 等待ACK 重复起始 0x71 (地址+读) 等待ACK 读取数据 发送NACK 停止条件 FT5x06读操作关键点 1. 先写寄存器地址,再重复起始后读数据 2. 最后一个字节主设备必须发送NACK,然后产生停止条件

2.6 常见I2C调试问题速查

现象 可能原因 排查方法
SCL/SDA空闲电平为0V 上拉电阻缺失或损坏 用万用表测量电阻两端,确认上拉到VDDIO
起始条件后无ACK 地址错误、从设备未上电、SCL/SDA短路 用逻辑分析仪抓取地址字节,核对FT5x06地址0x38
数据读取全为0xFF 从设备未响应、时钟拉伸超时 检查FT5x06复位引脚和中断引脚电平
总线死锁(SCL被拉低) 从设备时钟拉伸超时、主设备未释放总线 连续发送9个SCL时钟脉冲复位从设备状态机
数据错位或丢失 SCL频率过高、总线电容过大 降低I2C时钟频率至100kHz测试
实战建议:在调试FT5x06驱动时,先用逻辑分析仪抓取完整的I2C读写时序,对照本章的帧格式逐字节分析。确认起始条件、地址字节、ACK/NACK、数据字节和停止条件都符合规范。这是定位硬件问题最有效的方法。