拓冰建站拓冰建站
首页 / 资讯中心 / 正文

ESP IoT Solution 触摸组件实战:基于 esp_lcd_touch_ili2118 驱动 ILI2118A 电容触摸屏

ESP IoT Solution 触摸组件实战基于 esp_lcd_touch_ili2118 驱动 ILI2118A 电容触摸屏【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution本文聚焦 ESP IoT Solution 仓库中 esp_lcd_touch_ili2118 组件系统讲解如何在 ESP-IDF 工程中通过标准esp_lcd_touch抽象层驱动 ILI2118A 触摸控制器覆盖组件引入、I2C 初始化、轮询/中断读取坐标、数据格式解析与源码级原理分析。读完本文你将能够独立完成一块基于 ILI2118A 的触摸屏从接线初始化到坐标输出的完整接入并掌握结合源码排查触摸异常的方法。组件定位ILITEK ILI2118A 触摸控制器的标准化接入ILI2118A 是 ILITEK奕力推出的电容式触摸控制器广泛用于中低分辨率 TFT-LCD 触摸屏模组。esp_lcd_touch_ili2118是 ESP IoT Solution 为其实现的驱动组件其核心设计是接入 Espressif 的esp_lcd_touch触摸抽象层——应用代码只面对统一接口底层是哪种触摸芯片对上层透明。触摸控制器通信接口组件名ILI2118I2Cesp_lcd_touch_ili2118从组件描述文件 idf_component.yml 可以看到该组件的依赖与版本约束idf: 5.0要求 ESP-IDF 5.0 及以上版本esp_lcd_touch: ^1public依赖触摸抽象层且作为公共依赖向上层暴露头文件cmake_utilities: 0.*用于组件版本管理。其构建入口 CMakeLists.txt 仅注册一个源文件esp_lcd_touch_ili2118.c并公开include目录依赖esp_lcd结构非常轻量适合直接阅读与移植。将组件加入工程本仓库的组件已发布到 Espressif 组件服务推荐使用组件管理器引入idf.py add-dependency espressif/esp_lcd_touch_ili2118*也可以直接在当前工程的main/idf_component.yml或工程根idf_component.yml中声明依赖效果相同dependencies: espressif/esp_lcd_touch_ili2118: ^0.1.2注意该组件内部还依赖esp_lcd_touch抽象层组件组件管理器会自动解析并拉取无需手动添加。若要在不联网环境下使用可将 esp_lcd_touch_ili2118 目录整体复制进工程的components/目录并同步引入其依赖的esp_lcd_touch组件。初始化流程从 I2C IO 到触摸句柄与esp_lcd_touch系列组件一致ILI2118 驱动的初始化分为三步配置面板 IO → 配置触摸参数 → 创建驱动实例。1. 配置 I2C 面板 IO头文件 esp_lcd_touch_ili2118.h 提供现成的 IO 配置宏esp_lcd_panel_io_i2c_config_t io_config ESP_LCD_TOUCH_IO_I2C_ILI2118A_CONFIG();该宏展开后的关键字段如下字段值说明scl_speed_hz100000I2C 时钟频率 100 kHz标准模式v0.1.2 起在宏中提供默认值dev_addr0x4C 1 0x26ILI2118A 的 7 位 I2C 从机地址control_phase_bytes1命令阶段字节数lcd_cmd_bits16命令位宽 16 位flags.disable_control_phase1关闭控制阶段数据直接按命令/寄存器读写随后通过esp_lcd_new_panel_io_i2c创建面板 IO 句柄。参考测试代码 test_esp_lcd_touch_ili2118.c 中的用法esp_lcd_panel_io_handle_t io_handle NULL; TEST_ESP_OK(esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)I2C_NUM_0, tp_io_config, io_handle));2. 配置触摸参数esp_lcd_touch_config_t结构体用于描述触摸面板与 LCD 的对应关系esp_lcd_touch_config_t tp_cfg { .x_max CONFIG_LCD_HRES, /* LCD 水平分辨率决定坐标归一化范围 */ .y_max CONFIG_LCD_VRES, /* LCD 垂直分辨率 */ .rst_gpio_num -1, /* 复位引脚-1 表示未使用 */ .int_gpio_num -1, /* 中断引脚-1 表示未使用纯轮询 */ .levels { .reset 0, /* 复位有效电平0 为低电平复位 */ .interrupt 0, /* 中断有效电平0 为低电平触发 */ }, .flags { .swap_xy 0, /* 是否交换 X/Y 坐标 */ .mirror_x 0, /* 是否水平镜像 */ .mirror_y 0, /* 是否垂直镜像 */ }, };x_max/y_max必须与所配 LCD 面板分辨率一致驱动会据此将触摸原始坐标等比缩放到 LCD 坐标系若使用中断方式读取需配置int_gpio_num与levels.interrupt并可通过interrupt_callback注册中断回调具体见下文“中断模式”swap_xy/mirror_x/mirror_y用于屏幕安装方向与触摸坐标系不一致时的修正0/1 为关闭/开启。3. 创建触摸驱动实例esp_lcd_touch_handle_t tp; esp_lcd_touch_new_i2c_ili2118(io_handle, tp_cfg, tp);在驱动创建函数 esp_lcd_touch_ili2118.c 内部会依次完成参数合法性检查io、config、tp均不可为空分配esp_lcd_touch_t句柄内存注册read_data、get_xy、del三个内部函数指针若配置了中断引脚初始化 GPIO 输入并注册中断回调调用内部函数read_info()与芯片通信读取固件版本、协议版本与分辨率并打印日志I (xxx) ili2118: Touch info: 480x480, protocol v0.x, firmware v1.0.xx I (xxx) ili2118: Touch panel create success, version: ...若该阶段 I2C 通信失败接线错误、地址不符、上电时序异常创建会直接返回错误并释放资源。I2C 总线初始化前置步骤IO 配置宏只描述了触摸芯片侧的通信参数I2C 总线本身仍需按 ESP-IDF 标准流程初始化。测试用例中给出的参考配置test_esp_lcd_touch_ili2118.cconst i2c_config_t i2c_conf { .mode I2C_MODE_MASTER, .sda_io_num GPIO_NUM_8, .sda_pullup_en GPIO_PULLUP_DISABLE, .scl_io_num GPIO_NUM_18, .scl_pullup_en GPIO_PULLUP_DISABLE, .master.clk_speed 90 * 1000, /* 90 kHz测试环境取值可在 100 kHz 附近调整 */ }; i2c_param_config(I2C_NUM_0, i2c_conf); i2c_driver_install(I2C_NUM_0, i2c_conf.mode, 0, 0, 0);实际项目中应结合板级原理图分配 SDA/SCL 引脚通常需要开启上拉GPIO_PULLUP_ENABLE或外接上拉电阻。读取触摸坐标轮询方式初始化完成后读取坐标采用“先读后取”的两阶段模型。阶段一定时读取原始数据esp_lcd_touch_read_data(tp);该函数应在主循环或专用任务中周期性调用轮询其底层通过esp_lcd_panel_io_rx_param向芯片发送读数据命令ILITEK_TP_CMD_READ_SUB_DATA (0x11)一次性读取 53 字节ILI2118_BUF_SIZE触摸数据包。阶段二获取归一化坐标uint16_t touch_x[1]; uint16_t touch_y[1]; uint16_t touch_strength[1]; uint8_t touch_cnt 0; esp_lcd_touch_point_data_t points[1] {0}; esp_lcd_touch_get_data(tp, points, touch_cnt, 1); if (touch_cnt 0) { ESP_LOGI(TAG, Touch position: [%d, %d], strength %d, count %d, points[0].x, points[0].y, points[0].strength, touch_cnt); }esp_lcd_touch_get_data返回esp_lcd_touch_point_data_t数组每个元素包含x、y坐标与strength触摸强度touch_cnt返回有效触点数该芯片单点上报实际最多 1 点。组件从 v0.1.1 起改用esp_lcd_touch_get_data取代了已废弃的esp_lcd_touch_get_coordinates。数据包格式与坐标转换原理深入 read_data 实现 可以看到 ILI2118A 的数据帧设计数据包首字节为帧头魔数0x5A或0x99两种帧格式无效坐标标记为0xFFILI2118_INVALID_COORD12 位原始坐标以“高位半字节 低位整字节”的紧凑方式编码uint16_t raw_x ((buf[1] 0xF0) 4) | buf[2]; uint16_t raw_y ((buf[1] 0x0F) 8) | buf[3];原始坐标按芯片最大量程 2048×2048TOUCH_MAX_WIDTH/HEIGHT等比缩放到配置的 LCD 分辨率tp-data.coords[0].x (raw_x * tp-config.x_max) / TOUCH_MAX_WIDTH; tp-data.coords[0].y (raw_y * tp-config.y_max) / TOUCH_MAX_HEIGHT; tp-data.coords[0].strength 1;数据读写与坐标取用均处于临界区保护portENTER_CRITICAL内确保与中断上下文安全交互。这也解释了为何x_max/y_max必须与 LCD 分辨率匹配缩放比例错误会导致触摸坐标偏移或越界。读取触摸坐标中断方式对于需要低延迟或低功耗唤醒的场景可启用中断模式配置int_gpio_num为实际中断引脚、levels.interrupt为有效电平0 为低电平触发在esp_lcd_touch_config_t中注册interrupt_callback创建驱动时源码 会自动配置 GPIO 中断上升沿/下降沿由levels.interrupt决定并注册 ISR 回调在应用层中断回调或经信号量唤醒的任务中调用esp_lcd_touch_read_data与esp_lcd_touch_get_data。测试用例 test_esp_lcd_touch_ili2118.c 演示了完整范式中断回调中xSemaphoreGiveFromISR释放二值信号量主任务以 30 ms 超时等待信号量获取到后读取并打印坐标if (xSemaphoreTake(touch_mux, pdMS_TO_TICKS(30))) { esp_lcd_touch_read_data(tp_handle); esp_lcd_touch_get_data(tp_handle, tp_data, tp_cnt, 1); if (tp_cnt 0) { ESP_LOGI(TAG, Touch IRQ: (% PRIu16 , % PRIu16 ), tp_data[0].x, tp_data[0].y); } }此外del()实现源码 L155-L166在销毁句柄时会自动复位中断引脚、卸载 ISR 处理器并释放内存无需手动清理。测试用例与验证手段仓库为组件提供了完整的 Unity 测试工程test_apps可作为板级验证与移植参考轮询测试[ili2118a][poll]每 30 ms 调用一次esp_lcd_touch_read_dataesp_lcd_touch_get_data持续 3 s 打印坐标中断测试[ili2118a][intr]验证中断回调 → 信号量 → 读取的完整链路内存泄漏检测每个用例前后比对MALLOC_CAP_8BIT与MALLOC_CAP_32BIT堆余量阈值 -300 字节确保驱动创建/销毁不泄漏内存。测试硬件配置480×480 面板、I2C_NUM_0、90 kHz、SDAGPIO8、SCLGPIO18、INTGPIO1、RSTGPIO0可在 test_esp_lcd_touch_ili2118.c 顶部宏中查看按实际板卡修改后即可编译运行。与显示方案组合的典型应用esp_lcd_touch_ili2118输出的是标准esp_lcd_touch_handle_t因此可以无缝接入本仓库的显示生态与 LVGL 适配层 esp_lvgl_adapter 结合将触摸句柄注册为 LVGL 输入设备参考 esp_lv_adapter_input_touch.c 的接入方式与本仓库 LCD 驱动components/display/lcd同总线复用触摸与显示共用 I2C/并口资源参考同目录下其他触摸组件如 esp_lcd_touch_ft6336u的工程组织方式便于对比不同触摸芯片的接入差异。版本演进与兼容性提示根据 CHANGELOG.mdv0.1.22026-04-21在ESP_LCD_TOUCH_IO_I2C_ILI2118A_CONFIG()宏中增加默认 I2C 频率v0.1.12025-12-09文档与测试改用esp_lcd_touch_get_data替代废弃的esp_lcd_touch_get_coordinatesv0.0.12025-01-07首个实现版本。建议使用较新版本以获得 API 一致性若旧工程仍在调用esp_lcd_touch_get_coordinates应迁移至esp_lcd_touch_get_data。常见问题排查要点现象排查方向创建驱动返回错误检查 I2C 接线/上拉、从机地址 0x26、供电与复位时序日志无Touch info输出确认 16 位命令模式与disable_control_phase标志生效坐标偏移或反向核对x_max/y_max与 LCD 分辨率一致调整swap_xy/mirror_x/mirror_y轮询频繁读 I2C 占用总线适当加大轮询周期或改中断模式减少无效读取触摸偶发丢点检查 I2C 速率是否过高建议 100 kHz 附近、电源纹波与走线干扰【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门