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从低电平切换到高电平。
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),防止从设备死锁导致总线挂死。
3.6 多主机仲裁
I2C支持多个主设备共享同一总线。仲裁机制基于开漏总线的线与特性:
- 仲裁过程:多个主设备同时发送起始条件,在SDA上逐位比较。如果某个主设备试图输出高电平但检测到低电平,则判定仲裁失败,立即释放SDA和SCL。
- 仲裁原则:发送数据中低电平的设备获胜(因为开漏输出低电平会强制拉低总线)。
- 无数据丢失:仲裁失败的设备不会破坏总线上的数据,可以在总线空闲后重试。
- 触摸驱动场景:通常触摸控制器为从设备,MCU为唯一主设备,不涉及多主机仲裁。但在多MCU共享触摸数据的系统中需要关注。
驱动开发避坑: 如果MCU的I2C外设不支持多主机仲裁,且总线上存在其他主设备,必须确保MCU不会在非预期时刻发起起始条件。建议在触摸驱动初始化时检查总线空闲状态。
3.7 I2C协议总结
| 协议要素 | 关键点 | 触摸驱动影响 |
|---|---|---|
| 物理层 | 开漏、上拉电阻、SCL/SDA | 上拉电阻选择影响信号质量 |
| 起始/停止 | SCL高时SDA跳变 | 必须严格时序,否则总线锁死 |
| 数据帧 | 地址+R/W+数据+ACK | 寄存器读写遵循此格式 |
| 地址模式 | 7位为主,10位兼容 | 触摸芯片多为7位地址 |
| 时钟拉伸 | 从设备拉低SCL | 必须支持,否则读坐标失败 |
| 多主机仲裁 | 低电平获胜 | 单主系统无需关注 |