CTP 触摸屏驱动说明
源码:
components/BSP/TDO_CTP/drv/esp32/esp32_ctp.c/esp32_ctp.h/tdo_ctp_conf.h
1. 驱动架构
LVGL read_cb → touchpad_read()
├─ touchpad_is_pressed() → tdo_ctp_get_point()
└─ touchpad_get_xy() → point.x / point.y
↑
tdo_ctp.c (通用 CTP 框架)
↑
g_ctp_iic_drv (接口表, 在 esp32_ctp.c 注册)
├─ .iic_write ──→ I2C or LCD SPI (取决于 TR230S_EN)
├─ .iic_read ──→ 同上
├─ .gpio_control → INT/RST 引脚控制
└─ .mdelay → vTaskDelay2. 芯片选择
c
// ── 文件: tdo_ctp_conf.h ──
#define TDO_CTP_ONCE TDO_CTP_GT911 // 当前: GT911
// 可改为:
// #define TDO_CTP_ONCE TDO_CTP_TR230S → 使能 TR230S (复用 LCD SPI/QSPI 通信)3. 通信接口 (I2C vs LCD SPI)
c
// ── 文件: esp32_ctp.c ──
tdo_ctp_iic_drv_t g_ctp_iic_drv = {
#if TR230S_EN
// TR230S 模式: 复用 LCD 的 SPI3_HOST 句柄通信
.iic_write = lcd_reg_write, // → qspilcd.c: lcd_ctp_write_cmd()
.iic_read = lcd_reg_read, // → qspilcd.c: lcd_ctp_read_cmd()
#else
// 标准 I2C 模式: 独立 I2C_NUM_1 总线
.iic_write = iic_reg_write,
.iic_read = iic_reg_read,
#endif
.gpio_control = ctp_gpio_control,
.mdelay = ctp_mdelay,
};关键点:
lcd_ctp_write_cmd()/lcd_ctp_read_cmd()定义在qspilcd.c中,通过spi_device_acquire_bus()获取 LCD SPI 总线使用权后,用 QSPI 帧协议读写触摸寄存器。详见 SPI/QSPI 驱动文档。
4. 硬件初始化
c
uint8_t esp32_ctp_init(void)
{
#if TR230S_EN == 0
// ── I2C 模式: 配置 SDA/SCL, 初始化 I2C_NUM_1 ──
gpio_config(&gpio_tp_int); // INT: GPIO 45
gpio_config(&gpio_tp_rst); // RST: GPIO 48
i2c_config_t ic = {
.mode = I2C_MODE_MASTER,
.sda_io_num = CTP_IIC_SDA, // GPIO 39
.scl_io_num = CTP_IIC_CLK, // GPIO 38
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = CTP_IIC_FREQ, // 400000
};
i2c_param_config(I2C_NUM_1, &ic);
i2c_driver_install(I2C_NUM_1, I2C_MODE_MASTER,
I2C_MASTER_RX_BUF_DISABLE,
I2C_MASTER_TX_BUF_DISABLE, 0);
// TR230S 模式: 跳过 I2C 初始化, 直接用 LCD SPI
#endif
tdo_ctp_init(); // 自动匹配 TDO_CTP_ONCE 芯片
return 0;
}触摸引脚
| 信号 | GPIO | 说明 |
|---|---|---|
| CTP SDA | 39 | I2C 数据 |
| CTP SCL | 38 | I2C 时钟 |
| CTP INT | 45 | 中断 |
| CTP RST | 48 | 复位 |
5. 触摸读取接口
c
// ── LVGL 定期调用 ──
bool touchpad_is_pressed(void)
{
tdo_ctp_point_t point;
tdo_ctp_get_point(&point); // 调用通用 CTP 驱动
return (point.event == TDO_CTP_EVENT_DOWN ||
point.event == TDO_CTP_EVENT_MOVE);
}
void touchpad_get_xy(uint16_t *x, uint16_t *y)
{
*x = point.x;
*y = point.y;
}6. 支持芯片列表
| 驱动文件 | 芯片 | 通信 |
|---|---|---|
tdo_gt911.c | GT911 | I2C |
tdo_ft6336.c | FT6336 | I2C |
tdo_cst328.c | CST328 | I2C |
tdo_gt5688.c | GT5688 | I2C |
tdo_ilitek_v3.c | ILITEK V3 | I2C |
tdo_ilitek_v6.c | ILITEK V6 | I2C |
tdo_st7102.c | ST7102 | I2C |
tdo_icnt8952.c | ICNT8952 | I2C |
tdo_cf1124.c | CF1124 | I2C |
tdo_jd9366tc.c | JD9366TC | I2C |
tdo_tr230s.c | TR230S | LCD SPI (复用) |
7. 移植检查清单
- [ ] 在
tdo_ctp_conf.h中设置TDO_CTP_ONCE为目标芯片宏 - [ ] 在
esp32_ctp.h中修改CTP_SDA/SCL/INT/RST引脚宏 - [ ] TR230S 模式下确保
qspilcd.c的lcd_ctp_write_cmd/read_cmd已实现 - [ ] 在
lv_port_indev_init()中调用esp32_ctp_init()+ 注册touchpad_read
8. 常见问题
| 现象 | 检查项 |
|---|---|
| 触摸无响应 | I2C 扫描确认地址? 上拉电阻? TDO_CTP_ONCE 匹配? |
| TR230S 不通 | LCD 已初始化? QSPI 帧格式正确? spi_device_acquire_bus() 竞争? |
| 坐标偏移 | 屏幕方向 lcd_display_dir() 与触摸映射一致? |