4. 触摸控制器硬件接口
触摸采样率,说白了就是触摸控制器每秒报告触摸位置的次数。单位是 Hz。你想想看,如果采样率只有 60Hz,那每秒只报告 60 次位置,而你的屏幕刷新率可能是 60fps 甚至 120fps。手指滑过去,中间的位置信息丢了一大半,触摸交互自然就不跟手了。
我个人习惯,做 TouchGFX 项目时,采样率至少得是屏幕刷新率的 1.5 到 2 倍。比如屏幕跑 60fps,触摸采样率最好能到 90Hz 以上。但实际做起来,你会发现很多硬件默认配置根本达不到这个数。嗯,这里要注意,不是换个寄存器值就完事了,得从硬件到驱动一层层排查。
4.1 采样率为什么上不去?
我在项目中遇到过好几次,明明芯片手册说触摸控制器支持 200Hz,实际测出来只有 80Hz。问题出在哪?我总结了几条常见瓶颈:
- I²C 总线速度太低:很多触摸控制器通过 I²C 上报数据。如果 I²C 时钟只有 100kHz,每次传输要花 1-2ms,再加上协议开销,采样率自然上不去。
- 触摸控制器内部转换时间太长:有些芯片为了省电,默认把 ADC 采样周期设得很长。你得手动把转换速度提上去。
- MCU 端轮询或中断处理不及时:就算触摸 IC 能跑 200Hz,MCU 这边如果中断优先级低,或者轮询间隔太大,数据也会被丢掉。
- 滤波算法引入延迟:有些驱动里加了滑动平均或卡尔曼滤波,滤波窗口越大,延迟越高,等效采样率就降下来了。
核心原则:采样率优化的本质是缩短「触摸事件 → MCU 收到数据」这条链路上的每一环耗时。不要只盯着触摸 IC 的寄存器改,要全链路排查。
4.2 硬件配置技巧:从触摸 IC 到 MCU
下面我按实际调试顺序,把每个环节的配置方法列出来。这些技巧我在好几个量产项目里验证过,效果很稳定。
4.2.1 触摸 IC 端配置
大多数触摸控制器(比如 FT5x06、GT911、CST8xx 系列)都有采样率相关的寄存器。以我常用的 FT5x06 为例:
// FT5x06 采样率配置示例
// 寄存器 0x88: 工作模式,默认 0x00(普通模式)
// 寄存器 0x89: 采样周期,单位 1ms,默认 0x0A(10ms → 100Hz)
#define FT5X06_MODE_REG 0x88
#define FT5X06_PERIOD_REG 0x89
void ft5x06_set_sample_rate(uint16_t rate_hz) {
uint8_t period_ms = 1000 / rate_hz;
if (period_ms < 3) period_ms = 3; // 硬件限制,最低 3ms
if (period_ms > 20) period_ms = 20;
i2c_write_reg(FT5X06_ADDR, FT5X06_PERIOD_REG, period_ms);
// 同时切换到高速模式
i2c_write_reg(FT5X06_ADDR, FT5X06_MODE_REG, 0x01);
}
注意,不是所有触摸 IC 都允许你随便改。有些芯片的采样周期和扫描通道数挂钩,通道越多,周期越长。我建议你仔细看数据手册里的「Scan Time」表格。
| 触摸 IC 型号 | 默认采样率 | 可配置范围 | 配置寄存器 |
|---|---|---|---|
| FT5x06 | 100 Hz | 50 ~ 333 Hz | 0x89 (Period) |
| GT911 | 100 Hz | 50 ~ 200 Hz | 0x8040 (Refresh Rate) |
| CST8xx | 80 Hz | 60 ~ 160 Hz | 0x80 (Scan Period) |
4.2.2 I²C 总线提速
触摸 IC 和 MCU 之间最常用的就是 I²C。默认 100kHz 标准模式太慢了,我一般直接拉到 400kHz 快速模式。如果硬件支持,甚至可以上 1MHz 高速模式。
但提速有个前提:上拉电阻要匹配。我曾经在一个项目里把 I²C 从 100kHz 改到 400kHz,结果通信频繁出错。查了半天,发现上拉电阻用的是 10kΩ,对于 400kHz 来说太大了,信号上升沿太慢。换成 2.2kΩ 后问题解决。
经验值:400kHz I²C 建议用 2.2kΩ ~ 4.7kΩ 上拉;1MHz 建议用 1kΩ ~ 2.2kΩ。具体值根据总线电容算一下,别凭感觉选。
4.2.3 MCU 端中断与 DMA
触摸数据来了,MCU 得赶紧去读。我见过太多人用轮询方式读触摸,主循环里每隔几毫秒去查一次。这种方式采样率完全不可控,主循环一卡,触摸就丢数据。
我的做法是:
- 用触摸 IC 的 INT 引脚触发中断,边沿触发,优先级设高一点。
- 中断服务函数里只做一件事:通过 DMA 把触摸数据从 I²C 搬进内存。不要在 ISR 里做滤波、坐标转换这些事。
- 在主循环或 RTOS 任务里处理数据,这样中断占用时间极短,不会影响采样率。
// 伪代码:中断 + DMA 读取触摸数据
void touch_irq_handler(void) {
// 触发 DMA 传输,从 I²C 读取 6 字节触摸数据
dma_start(I2C_PERIPH, touch_buffer, 6, DMA_COMPLETE_CALLBACK);
// ISR 立即返回,不阻塞
}
void dma_complete_callback(void) {
// DMA 传输完成,在主上下文处理触摸数据
osMessageQueuePut(touch_queue, touch_buffer, 0, 0);
}
4.3 采样率与功耗的权衡
采样率不是越高越好。你想想看,采样率 200Hz 意味着触摸 IC 每 5ms 就要做一次完整的扫描和转换,功耗比 100Hz 时翻一倍。对于电池供电的设备,这是个不小的代价。
我一般这样权衡:
- 插电设备:直接拉到触摸 IC 支持的最高采样率,不用考虑功耗。
- 电池设备,屏幕常亮:采样率设到屏幕刷新率的 1.5 倍,比如 60fps 屏幕配 90Hz 触摸。
- 电池设备,屏幕休眠:采样率降到 20-30Hz,或者干脆关闭触摸,等用户唤醒再恢复。
注意:有些触摸 IC 在低采样率模式下会自动进入省电状态,从省电状态恢复到正常工作需要额外时间(几毫秒到十几毫秒)。如果你需要快速响应,建议不要用芯片自带的省电模式,而是自己在 MCU 端控制触摸 IC 的供电。
4.4 验证采样率是否真的提升了
改完寄存器、调完 I²C 速度,怎么知道采样率到底有没有上去?我习惯用逻辑分析仪抓 INT 引脚的电平变化。每次触摸数据准备好,INT 引脚会拉低(或拉高),两个 INT 边沿之间的时间间隔就是采样周期。
具体做法:
- 用逻辑分析仪抓 INT 引脚,采样率设到 1MHz 以上。
- 手指按住触摸屏不动,INT 引脚应该以固定频率输出脉冲。
- 测量相邻两个脉冲的间隔,取 10 次平均值,换算成 Hz。
如果测出来的值远低于你配置的目标值,那就说明链路中还有瓶颈。我遇到过最坑的一次,是触摸 IC 的固件版本太老,不支持高速模式,改寄存器根本没反应。换了新固件版本才解决。
4.5 本章知识体系
下面这张图把采样率优化的核心链路和关键配置点串起来了,你可以对照着排查自己的项目。
从这张图可以看得很清楚:采样率优化不是改一个寄存器就完事,而是从触摸 IC 到 TouchGFX 的全链路优化。每一环都可能成为瓶颈,每一环都需要你亲手去验证。