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)。若仅需简单的按键点击且环境恶劣(油污、水汽),可考虑电阻式。
电阻式 vs 电容式触摸屏结构对比 电阻式触摸屏 硬质保护层(PET) ITO导电涂层(上层) 透明隔离点(Spacer Dot) ITO导电涂层(下层) 玻璃基板 压力使上下ITO层接触 → 分压检测坐标 电容式触摸屏 强化玻璃盖板 发射电极(Tx) 绝缘层(SiO₂) 接收电极(Rx) 玻璃/PCB基板 手指耦合改变电极间电容 → 扫描检测

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 读取流程步骤

  1. 等待中断:MCU检测INT引脚电平变化(FT6236为低电平有效)
  2. 读取状态寄存器:I2C读取寄存器0x02(触摸点数寄存器),获取当前有效触摸点数
  3. 循环读取触摸数据:根据触摸点数,依次读取每个触摸点的坐标与事件数据
  4. 数据解析:将原始寄存器数据转换为屏幕坐标(X/Y),并判断触摸事件类型(按下/抬起/移动)
  5. 释放中断:读取完成后,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]);
    }
}
I2C触摸数据读取流程(FT6236) 触摸事件发生(手指按下) INT引脚拉低 → 通知MCU MCU进入中断服务程序(ISR) I2C读取0x02(触摸点数) 循环读取触摸点坐标数据 坐标映射 → 上报应用层
开发经验:在读取触摸数据时,建议在ISR中只完成数据读取和坐标转换,将触摸事件上报到消息队列或环形缓冲区,由主循环或任务处理。这样可以避免在中断中执行耗时操作,保证系统实时性。对于CST816S,读取流程类似,但寄存器地址不同(触摸点数在0x02,手势ID在0x01),且支持自动睡眠唤醒,需要在初始化时配置唤醒模式。

4.4 本章小结

  • 电阻式触摸屏依赖压力感应,仅支持单点触控;电容式触摸屏利用电容耦合效应,支持多点触控与手势识别,是TFT LCD项目的首选方案。
  • FT6236和CST816S是两款主流的电容触摸控制器,分别支持2点和5点触控,通过I2C接口与MCU通信,中断引脚驱动数据读取。
  • I2C触摸数据读取流程遵循“中断触发 → 读取触摸点数 → 循环读取坐标 → 数据解析上报”的标准步骤,驱动代码需注意寄存器映射差异和坐标映射计算。