4、触摸屏硬件接口:I2C与SPI协议对比、触摸控制器(FT5x06/GT911)数据手册解读、硬件连接与原理图分析
好,咱们进入第四章。这一章,说白了就是硬功夫——你得搞清楚触摸屏到底怎么跟单片机“说话”的。我见过不少新手,软件写得飞起,结果板子一焊上去,触摸没反应,查半天发现是I2C地址搞错了,或者SPI的极性配反了。嗯,这种坑,咱们今天一次性填平。
4.1 I2C vs SPI:触摸屏该选谁?
触摸屏和主控之间的通信,主流就两种:I2C和SPI。你可能会问,为什么不用UART?其实也有,但很少。触摸屏对实时性要求高,但数据量不大,所以I2C和SPI是最合适的。
先说说I2C。 我个人习惯,能用I2C就用I2C。为什么?省引脚啊!就两根线:SCL和SDA。在嵌入式里,引脚就是命根子。尤其是做小尺寸产品,主控引脚紧张,I2C简直是救星。而且I2C支持多设备挂载,一条总线上可以挂触摸、挂传感器、挂EEPROM,只要地址不冲突就行。
但I2C也有短板。速度上限一般就400kHz(快速模式),有些能到1MHz。对于触摸屏来说,这速度够用吗?我实测过,FT5x06在400kHz下,读取一次触摸数据大概需要1-2ms,完全够用。但如果你要做高报点率(比如200Hz以上),I2C可能会成为瓶颈。
再来看SPI。 SPI就一个字:快。全双工,速度轻松上10MHz甚至更高。而且没有地址概念,主从一对一(或者一对多但靠片选),通信协议简单。我曾在项目中用过SPI接口的触摸屏,报点率能做到300Hz,适合游戏手柄或者绘图板这类应用。
但SPI的代价是引脚多:至少4根线(SCK、MOSI、MISO、CS)。如果你主控引脚富裕,那没问题。否则,就得掂量掂量了。
我做个表格,方便你对比:
| 特性 | I2C | SPI |
|---|---|---|
| 引脚数量 | 2(SCL, SDA) | 4+(SCK, MOSI, MISO, CS) |
| 速度 | 100kHz~1MHz | 10MHz~50MHz |
| 多设备支持 | 天然支持(地址寻址) | 需片选(CS) |
| 通信方式 | 半双工 | 全双工 |
| 典型触摸芯片 | FT5x06, GT911 | 部分工业级触摸芯片 |
| 适用场景 | 消费电子、低功耗 | 高报点率、工业控制 |
我的建议: 如果你做的是普通消费电子(智能家居、手持设备),无脑选I2C。省引脚、易调试。如果你做的是高性能交互设备(游戏外设、专业绘图板),或者主控SPI接口闲置,那就用SPI。
4.2 触摸控制器数据手册解读:FT5x06与GT911
拿到一份数据手册,别急着从头读到尾。我教你一个“三看”法:一看地址,二看寄存器,三看时序。咱们以FT5x06和GT911为例,逐个拆解。
4.2.1 FT5x06:电容触摸的常青树
FT5x06系列(包括FT5206、FT5306等)是FocalTech公司的产品,在4.3寸以下小屏里非常常见。我最早接触它是在一个智能手表项目上,当时被它的低功耗惊艳到了——休眠电流才几微安。
关键信息解读:
- I2C地址: 0x38(7位地址)。注意,有些数据手册写的是0x70(8位地址),其实就是左移了一位。驱动里一定要确认清楚。我曾经在这里翻过车,调了两天才发现是地址搞错了。
- 寄存器映射: 核心寄存器就几个:
- 0x00:设备模式(读出来是0x01表示正常模式)
- 0x02:触摸点数(低4位表示有效触摸点数)
- 0x03~0x08:第一个触摸点的坐标数据(每2字节一个轴)
- 0x09~0x0E:第二个触摸点的坐标数据
- 读取流程: 先读0x02寄存器,判断是否有触摸。如果有,再读对应的坐标寄存器。每次读取后,需要写0x00到0x00寄存器来清除中断。
// FT5x06 读取触摸点示例(伪代码)
uint8_t touch_count = i2c_read(0x02);
if (touch_count & 0x0F) {
uint8_t buf[4];
i2c_read_bytes(0x03, buf, 4); // 读取第一个点坐标
uint16_t x = (buf[0] & 0x0F) << 8 | buf[1];
uint16_t y = (buf[2] & 0x0F) << 8 | buf[3];
i2c_write(0x00, 0x00); // 清除中断
}
4.2.2 GT911:大屏触摸的优选
GT911是Goodix(汇顶科技)的产品,支持最大5点触摸,常用于7寸到10寸的屏幕。它的配置方式跟FT5x06不太一样——需要通过I2C写入配置表。
关键信息解读:
- I2C地址: 0x5D(7位地址)或0xBA(8位地址)。GT911有个特点,它的地址可以通过外部电阻配置。如果INT引脚拉低,地址是0x14(7位)。嗯,这里容易混淆,建议直接看原理图确认。
- 寄存器映射:
- 0x8040:设备状态(BIT7表示有触摸)
- 0x8140~0x8149:触摸点数据(最多5点)
- 0x8047:配置版本号
- 配置表: GT911上电后需要从主控写入一份配置表(通常由厂商提供),包括灵敏度、扫描周期等参数。如果不写,触摸可能不工作或者反应迟钝。
// GT911 配置表写入示例(伪代码)
uint8_t config[] = { 0x00, 0x01, 0x02, ... }; // 厂商提供的配置数据
i2c_write_bytes(0x8047, config, sizeof(config));
i2c_write(0x8040, 0x00); // 软复位
delay_ms(10);
4.3 硬件连接与原理图分析
好了,协议和芯片都聊完了,咱们看看实际电路怎么连。我拿一个典型的FT5x06电路来举例。
4.3.1 典型原理图分析
一个标准的触摸屏接口电路,通常包含以下几部分:
- 电源: VDD(3.3V)和VDDIO(I/O电压,通常也是3.3V)。注意,有些触摸芯片支持1.8V的I/O电压,跟主控匹配时要确认。
- 复位: RESET引脚,低电平复位。通常接一个10kΩ上拉电阻到VDD,然后由主控GPIO控制。
- 中断: INT引脚,开漏输出,低电平有效。主控配置为下降沿触发中断。
- I2C总线: SCL和SDA,各接一个4.7kΩ上拉电阻到VDDIO。
- 地址选择: ADDR引脚,接GND或VDD来选择I2C地址。
// 原理图连接示意(文字描述)
// FT5x06 MCU
// VDD ---> 3.3V
// GND ---> GND
// SCL ---> PB6 (I2C1_SCL) + 4.7kΩ 上拉到3.3V
// SDA ---> PB7 (I2C1_SDA) + 4.7kΩ 上拉到3.3V
// INT ---> PA0 (EXTI0) + 10kΩ 上拉到3.3V
// RESET ---> PA1 (GPIO) + 10kΩ 上拉到3.3V
// ADDR ---> GND (I2C地址 = 0x38)
4.3.2 布局布线注意事项
原理图画好了,PCB布局也不能马虎。我吃过亏,说几个要点:
- 上拉电阻靠近触摸芯片: I2C的上拉电阻要尽量靠近触摸芯片的SCL和SDA引脚,减少走线长度,避免信号反射。
- 电源滤波: VDD引脚旁边放一个0.1μF的陶瓷电容,再并一个10μF的钽电容。触摸芯片工作时会有瞬间电流波动,滤波不好会导致触摸抖动。
- 走线保护: SCL和SDA走线要远离高频信号(比如LCD的MIPI线、SDIO线)。如果实在避不开,加一个GND包地。
- FPC连接器: 触摸屏通常通过FPC排线连接。FPC上的GND引脚要足够多,最好每两根信号线之间夹一根GND,减少串扰。
4.4 本章小结
这一章的内容比较硬核,但都是实战中必须掌握的。咱们捋一下重点:
- I2C省引脚,适合大多数场景;SPI速度快,适合高性能需求。
- FT5x06和GT911是两种主流触摸芯片,寄存器映射和初始化流程不同,但核心思路一致:读状态、读坐标、清中断。
- 硬件连接要关注电源滤波、上拉电阻、中断配置和走线隔离。
下一章,咱们就要开始写驱动了。我会带着你从零开始,把FT5x06的驱动在LVGL上跑起来。到时候你会发现,硬件搞扎实了,软件就是水到渠成的事。