3. I2C协议详解

I2C(Inter-Integrated Circuit)总线是一种由Philips公司(现NXP)开发的同步、多主从、串行通信总线。在TFT触摸屏驱动中,I2C通常用于连接触摸控制器(如FT5x06、GT911)与主控MCU,传输触摸坐标和配置数据。理解I2C协议的物理层与数据链路层是实现稳定驱动的基础。

3.1 I2C总线物理层

I2C总线仅使用两条双向开漏线:

  • SCL(Serial Clock):串行时钟线,由主设备产生。
  • SDA(Serial Data):串行数据线,用于传输地址和数据。

两条线均通过上拉电阻(典型值4.7kΩ)连接到VDD(通常为3.3V或1.8V)。开漏结构允许多个设备共享总线,通过线与逻辑实现仲裁。

参数 标准模式(100kHz) 快速模式(400kHz) 高速模式(3.4MHz)
最大时钟频率 100 kHz 400 kHz 3.4 MHz
总线电容 ≤ 400 pF ≤ 400 pF ≤ 100 pF
上拉电阻(典型) 4.7kΩ 2.2kΩ 1.0kΩ
最大从设备数量 127(7位地址) 127 127
驱动开发提示: 触摸控制器通常工作在快速模式(400kHz)。如果总线过长或电容过大,应降低时钟频率或使用更小的上拉电阻,避免信号上升沿过缓导致通信错误。

3.2 起始与停止条件

I2C总线的数据帧由起始条件(START)开始,由停止条件(STOP)结束。这两个条件是SCL高电平时SDA的跳变:

  • 起始条件(S):SCL为高电平时,SDA从高电平切换到低电平。
  • 停止条件(P):SCL为高电平时,SDA从低电平切换到高电平。
I2C 起始与停止条件时序 SCL SDA S 起始条件 P 停止条件 数据有效

3.3 数据帧格式

I2C数据帧以字节为单位传输,每个字节后跟一个应答位(ACK/NACK)。数据在SCL低电平时变化,高电平时采样。

标准7位地址数据帧:

| S | 7位从机地址 | R/W | ACK | 8位数据 | ACK | ... | 8位数据 | ACK/NACK | P |
  • S:起始条件
  • 7位从机地址:主设备发送要通信的从设备地址
  • R/W:读写位(0=写,1=读)
  • ACK:从设备应答(低电平=应答,高电平=非应答)
  • 8位数据:数据字节,MSB先传
  • P:停止条件
触摸驱动典型写操作: 主设备先发送触摸芯片的7位地址(如0x38)加写位(0),然后发送寄存器地址字节,再发送配置数据字节。每次传输后等待从设备ACK。

3.4 7位地址与10位地址

特性 7位地址 10位地址
地址范围 0x00 ~ 0x7F(保留0x00~0x07) 0x000 ~ 0x3FF
最大从设备数 112(可用) 1024
帧头字节数 1字节(地址+R/W) 2字节(11110xx + R/W + 剩余8位)
触摸控制器常见 是(如FT5x06: 0x38) 极少

10位地址格式:第一个字节高5位为11110,接着是地址的高2位,然后是R/W位;第二个字节为地址的低8位。

3.5 时钟拉伸(Clock Stretching)

时钟拉伸是从设备控制SCL线的机制。当从设备需要时间处理数据时,会在SCL低电平期间主动拉低SCL,强制主设备进入等待状态,直到从设备释放SCL。

  • 典型场景:触摸控制器在接收到读命令后,需要时间采集触摸坐标,会拉伸时钟。
  • 驱动影响:主设备必须支持时钟拉伸,否则会导致通信超时。大多数MCU的硬件I2C外设自动处理此机制。
  • 超时处理:建议在驱动中设置SCL低电平超时(如10ms),防止从设备死锁导致总线挂死。
时钟拉伸时序示例 SCL 时钟拉伸 从设备拉低SCL 从设备释放SCL

3.6 多主机仲裁

I2C支持多个主设备共享同一总线。仲裁机制基于开漏总线的线与特性:

  1. 仲裁过程:多个主设备同时发送起始条件,在SDA上逐位比较。如果某个主设备试图输出高电平但检测到低电平,则判定仲裁失败,立即释放SDA和SCL。
  2. 仲裁原则:发送数据中低电平的设备获胜(因为开漏输出低电平会强制拉低总线)。
  3. 无数据丢失:仲裁失败的设备不会破坏总线上的数据,可以在总线空闲后重试。
  4. 触摸驱动场景:通常触摸控制器为从设备,MCU为唯一主设备,不涉及多主机仲裁。但在多MCU共享触摸数据的系统中需要关注。
驱动开发避坑: 如果MCU的I2C外设不支持多主机仲裁,且总线上存在其他主设备,必须确保MCU不会在非预期时刻发起起始条件。建议在触摸驱动初始化时检查总线空闲状态。

3.7 I2C协议总结

协议要素 关键点 触摸驱动影响
物理层 开漏、上拉电阻、SCL/SDA 上拉电阻选择影响信号质量
起始/停止 SCL高时SDA跳变 必须严格时序,否则总线锁死
数据帧 地址+R/W+数据+ACK 寄存器读写遵循此格式
地址模式 7位为主,10位兼容 触摸芯片多为7位地址
时钟拉伸 从设备拉低SCL 必须支持,否则读坐标失败
多主机仲裁 低电平获胜 单主系统无需关注