4. 触摸屏原理:电阻式与电容式触摸屏区别、触摸控制器(FT6236/CST816S)工作原理、I2C触摸数据读取流程
在嵌入式HMI(人机界面)开发中,触摸屏是实现用户交互的核心组件。本章将深入剖析电阻式与电容式触摸屏的工作原理与差异,详细解读主流触摸控制器FT6236与CST816S的工作机制,并完整梳理通过I2C总线读取触摸数据的标准流程。
4.1 电阻式与电容式触摸屏原理与区别
触摸屏根据感应原理主要分为电阻式和电容式两大类。在TFT LCD驱动开发中,电容式触摸屏因其支持多点触控、透光率高、耐用性强等优势,已成为主流选择。电阻式触摸屏则因其成本低、可用任何物体触控的特点,仍在部分工业场景中使用。
核心差异速览:电阻式依赖物理压力使上下两层导电膜接触,仅支持单点触控;电容式利用人体电场与ITO(氧化铟锡)电极之间的电容耦合效应,支持多点触控与手势识别。
| 对比维度 | 电阻式触摸屏 | 电容式触摸屏 |
|---|---|---|
| 感应原理 | 压力使上下导电层接触,形成分压 | 人体电场与ITO电极耦合,改变电容 |
| 触控方式 | 手指、触笔、手套、任何硬物 | 手指(导电体),不支持普通手套/触笔 |
| 多点触控 | 不支持(仅单点) | 支持(2~10点,取决于控制器) |
| 透光率 | 约70%~80% | 约90%以上 |
| 耐用性 | 易磨损,寿命约100万次点击 | 表面覆盖玻璃,寿命可达数亿次 |
| 环境适应性 | 不受水、油污影响 | 水滴、汗液可能导致误触 |
| 成本 | 低 | 中高 |
| 典型应用 | 工业HMI、收银机、医疗设备 | 智能手机、平板、消费电子 |
开发选型建议:对于基于MCU的TFT LCD项目,若需要手势滑动、多点缩放等交互,必须选用电容式触摸屏+电容触摸控制器(如FT6236/CST816S)。若仅需简单的按键点击且环境恶劣(油污、水汽),可考虑电阻式。
4.2 触摸控制器工作原理:FT6236与CST816S
电容触摸控制器是连接触摸传感器与主控MCU的桥梁。它负责驱动Tx/Rx电极、采集电容变化信号、进行数字滤波与坐标计算,最终通过I2C接口将触摸数据输出。FT6236(FocalTech)和CST816S(Hynitron)是两款在嵌入式TFT LCD项目中广泛使用的单芯片电容触摸控制器。
4.2.1 FT6236 核心特性与工作原理
- 通道数:支持最多18个Tx通道 + 10个Rx通道,覆盖2.8~5.0英寸触摸屏
- 触控点数:最多同时检测2点触摸
- I2C地址:0x38(7位地址,写操作0x70,读操作0x71)
- 工作流程:内部DSP对每个交叉点进行电容扫描 → 基线校准 → 噪声滤波 → 坐标插值 → 存入寄存器
- 中断输出:当检测到有效触摸时,INT引脚拉低,通知MCU读取数据
4.2.2 CST816S 核心特性与工作原理
- 通道数:支持最多20个Tx通道 + 12个Rx通道,覆盖3.0~6.0英寸触摸屏
- 触控点数:最多同时检测5点触摸
- I2C地址:0x15(7位地址,写操作0x2A,读操作0x2B)
- 工作流程:自电容+互电容混合扫描 → 自动基线跟踪 → 手势识别(上滑/下滑/单击/双击) → 数据打包
- 中断输出:INT引脚下降沿触发,支持低电平保持模式
| 参数 | FT6236 | CST816S |
|---|---|---|
| 最大触控点数 | 2点 | 5点 |
| I2C地址(7位) | 0x38 | 0x15 |
| 扫描方式 | 互电容扫描 | 自电容+互电容混合 |
| 手势识别 | 不支持(需MCU计算) | 内置(滑动/单击/双击) |
| 中断触发 | 低电平有效 | 下降沿/低电平可选 |
| 寄存器数据格式 | 触摸点数+坐标+事件标志 | 触摸点数+坐标+手势ID+事件标志 |
| 典型应用尺寸 | 2.8~5.0英寸 | 3.0~6.0英寸 |
驱动开发注意:FT6236和CST816S的I2C地址不同,且寄存器映射结构差异较大。在编写驱动时,务必查阅对应芯片的数据手册,不要混用寄存器地址。CST816S支持手势识别,但手势ID寄存器(0x01)的解析需要参考芯片规格书中的手势码表。
4.3 I2C触摸数据读取流程
触摸数据的读取采用中断驱动方式:当触摸控制器检测到有效触摸时,通过INT引脚通知MCU,MCU在中断服务程序中通过I2C读取触摸寄存器。以下以FT6236为例,展示标准读取流程。
4.3.1 读取流程步骤
- 等待中断:MCU检测INT引脚电平变化(FT6236为低电平有效)
- 读取状态寄存器:I2C读取寄存器0x02(触摸点数寄存器),获取当前有效触摸点数
- 循环读取触摸数据:根据触摸点数,依次读取每个触摸点的坐标与事件数据
- 数据解析:将原始寄存器数据转换为屏幕坐标(X/Y),并判断触摸事件类型(按下/抬起/移动)
- 释放中断:读取完成后,MCU通过I2C写操作清除中断标志(部分芯片需要)
4.3.2 FT6236 寄存器映射与数据格式
| 寄存器地址 | 名称 | 描述 |
|---|---|---|
| 0x00 | Device Mode | 设备模式(0x00=正常模式) |
| 0x01 | Gesture ID | 手势ID(FT6236未使用) |
| 0x02 | Touch Points | 当前触摸点数(0~2) |
| 0x03 | Event Flag + X High | Bit7~6: 事件标志(0=按下,1=抬起,2=移动,3=保留);Bit5~0: X坐标高6位 |
| 0x04 | X Low | X坐标低8位 |
| 0x05 | Y High | Bit7~6: 保留;Bit5~0: Y坐标高6位 |
| 0x06 | Y Low | Y坐标低8位 |
| 0x07~0x0B | Touch 2 Data | 第二个触摸点的数据(格式同0x03~0x06) |
4.3.3 驱动代码示例(FT6236读取)
/* FT6236 I2C触摸数据读取示例 */
#define FT6236_ADDR 0x38
#define FT6236_REG_POINTS 0x02
#define FT6236_REG_TOUCH1 0x03
typedef struct {
uint8_t event; /* 0:按下 1:抬起 2:移动 */
uint16_t x;
uint16_t y;
} touch_point_t;
/* 读取单个触摸点数据 */
static int ft6236_read_point(uint8_t reg_base, touch_point_t *pt) {
uint8_t buf[4];
if (i2c_read(FT6236_ADDR, reg_base, buf, 4) != 0) {
return -1;
}
pt->event = (buf[0] >> 6) & 0x03;
pt->x = ((uint16_t)(buf[0] & 0x0F) << 8) | buf[1];
pt->y = ((uint16_t)(buf[2] & 0x0F) << 8) | buf[3];
return 0;
}
/* 中断服务函数:读取所有触摸点 */
void ft6236_isr_handler(void) {
uint8_t touch_count;
touch_point_t points[2];
int i;
/* 步骤1: 读取触摸点数 */
if (i2c_read(FT6236_ADDR, FT6236_REG_POINTS, &touch_count, 1) != 0) {
return;
}
touch_count &= 0x0F;
if (touch_count > 2) touch_count = 0;
/* 步骤2: 循环读取每个触摸点 */
for (i = 0; i < touch_count; i++) {
if (ft6236_read_point(FT6236_REG_TOUCH1 + i * 6, &points[i]) != 0) {
break;
}
/* 将坐标映射到LCD分辨率(例如320x240) */
points[i].x = (uint16_t)((uint32_t)points[i].x * 320 / 1024);
points[i].y = (uint16_t)((uint32_t)points[i].y * 240 / 1024);
/* 上报触摸事件到上层应用 */
touch_event_report(i, &points[i]);
}
}
开发经验:在读取触摸数据时,建议在ISR中只完成数据读取和坐标转换,将触摸事件上报到消息队列或环形缓冲区,由主循环或任务处理。这样可以避免在中断中执行耗时操作,保证系统实时性。对于CST816S,读取流程类似,但寄存器地址不同(触摸点数在0x02,手势ID在0x01),且支持自动睡眠唤醒,需要在初始化时配置唤醒模式。
4.4 本章小结
- 电阻式触摸屏依赖压力感应,仅支持单点触控;电容式触摸屏利用电容耦合效应,支持多点触控与手势识别,是TFT LCD项目的首选方案。
- FT6236和CST816S是两款主流的电容触摸控制器,分别支持2点和5点触控,通过I2C接口与MCU通信,中断引脚驱动数据读取。
- I2C触摸数据读取流程遵循“中断触发 → 读取触摸点数 → 循环读取坐标 → 数据解析上报”的标准步骤,驱动代码需注意寄存器映射差异和坐标映射计算。