Saltar al contenido
Display Engineer
Resolución de problemas

¿El touch GT911 no funciona? Dirección I2C, temporización de reset, configuración y correcciones de coordenadas

Una lista de verificación paso a paso para un controlador touch capacitivo GT911 que no se detecta, no registra toques o reporta coordenadas incorrectas: alimentación y escaneo I2C, secuencia de selección de dirección por INT/RST, el registro de estado 0x814E, flanco de interrupción, resolución y correcciones de ejes para Linux, ESP-IDF y ESPHome.

DEDisplay Engineer Applications Team · Ingenieros de aplicaciones de pantallasActualizado el 19 oct 2026

Empieza aquí: identifica el síntoma

Síntoma

Causa más probable

Ir a

Nada en 0x5D ni 0x14 en un escaneo I2C

El controlador no está alimentado, faltan resistencias pull-up, o el chip está retenido en reset

Paso 1

Aparece en 0x14 cuando el driver espera 0x5D (o al revés), o la dirección cambia entre arranques

Nivel del pin INT durante el reset

Paso 2

Se detecta, el ID de producto se lee correctamente, pero no llegan toques

Registro de estado sin limpiar, flanco de interrupción incorrecto, o INT sin cablear

Paso 3

Los toques llegan pero caen en el lugar equivocado, reflejados o rotados

La resolución en la configuración del GT911 no coincide con el panel, o hay que intercambiar los ejes

Paso 4

Si tienes pensado escribir un nuevo bloque de configuración

Lee esto primero

Paso 5

Sigue los pasos en orden. Las direcciones de registro y las temporizaciones que aparecen abajo provienen del driver goodix de Linux, del componente esp_lcd_touch_gt911 de Espressif y de la documentación de ESPHome; los enlaces están en la sección de Fuentes.

1. Comprueba que el GT911 esté alimentado y responda por I2C

Alimentación y pull-ups

El binding de device-tree de Linux para controladores Goodix nombra dos alimentaciones: AVDD28 (analógica) y VDDIO (la raila de E/S lógica). En un módulo o FPC ambas suelen alimentarse desde el conector del host, así que mídelas en el conector antes de sospechar del firmware. SDA y SCL también necesitan resistencias pull-up en algún punto del bus; muchos módulos de display no las incluyen.

Escanea el bus

Ejecuta un sketch de escaneo I2C o i2cdetect. Un GT911 responde en una de dos direcciones de 7 bits:

Dirección de 7 bits

Bytes de escritura/lectura de 8 bits (como los listan algunos datasheets)

0x5D

0xBA / 0xBB

0x14

0x28 / 0x29

Los pares de 8 bits provienen de un comentario en el código de reset del driver de Linux. Si una hoja del fabricante dice "dirección 0xBA", se trata del mismo dispositivo que 0x5D en 7 bits; introduce 0x5D en Arduino, ESP-IDF y Linux.

Lee el ID de producto

Los registros del GT911 tienen direcciones de 16 bits. El driver de Linux lee 6 bytes desde 0x8140: los primeros 4 bytes son el ID de producto en texto ASCII y los últimos 2 son la versión de firmware (little-endian). Un GT911 reporta la cadena 911. Si obtienes 911, el bus, la alimentación y la dirección están correctos y el problema está más adelante en esta lista.

Si nada responde en ninguna de las dos direcciones, comprueba que la línea de reset no esté retenida en bajo. En muchos módulos RST es una entrada del GT911 y debe ser llevada a alto por el host (o tener pull-up en la placa) antes de que el controlador funcione.

2. Ajusta correctamente la secuencia de reset y selección de dirección

El GT911 elige su dirección I2C según el nivel de su pin INT en el momento en que se libera el reset. En palabras del binding de Linux, la línea INT "es muestreada por el dispositivo al desasertarse el reset para seleccionar la dirección del cliente I2C".

Nivel de INT cuando RST va a alto

Dirección I2C

Bajo

0x5D

Alto

0x14

La secuencia que utiliza el driver de Linux

  1. Llevar RST a nivel bajo y esperar más de 10 ms (el driver espera 20 ms).
  2. Llevar INT al nivel correspondiente a la dirección deseada: alto para 0x14, bajo para 0x5D.
  3. Esperar más de 100 µs.
  4. Llevar RST a nivel alto y esperar más de 5 ms (el driver espera 6–10 ms).
  5. Mantener INT a nivel bajo durante 50 ms y, a continuación, cambiar INT a entrada.

Si INT queda flotante durante el paso 4, la dirección puede variar de un encendido a otro. Ese es el clásico informe de «funciona tras flashear, falla tras un arranque en frío».

ESP-IDF: esp_lcd_touch_gt911

El componente de Espressif define ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS como 0x5D y ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS_BACKUP como 0x14. Solo ejecuta la secuencia de selección de dirección cuando se cumplen estas tres condiciones:

  • rst_gpio_num es un GPIO real (no GPIO_NUM_NC),
  • int_gpio_num es un GPIO real,
  • driver_data apunta a una estructura esp_lcd_touch_io_gt911_config_t cuyo dev_addr es la dirección que se desea.

En caso contrario, registra I2C address initialization procedure skipped - using default GT9xx setup y realiza un reset simple. En ese caso, la dirección es la que determina el cableado de la placa, y la dirección del panel-IO I2C que se pase debe coincidir con el resultado del escaneo. El reloj I2C por defecto del componente en ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG() es de 100 kHz.

Placas en las que el host no controla INT

Si INT no está conectado al host, este no puede elegir la dirección, así que hay que escanear ambas direcciones y usar la que responda. En la Sunton ESP32-8048S043C, por ejemplo, la interrupción del GT911 no está cableada a un GPIO por defecto (véase nuestra página de la placa). La página del GT911 de ESPHome señala que, cuando INT pasa por un expansor de E/S, el pin se sigue usando para fijar la dirección en el arranque, pero el tacto se consulta por sondeo en lugar de por interrupción.

3. Detectado, pero sin eventos de tacto

Leer y borrar el registro de estado

Los datos de tacto empiezan en 0x814E. El primer byte es un byte de estado:

  • Bit 7 (0x80): búfer listo. Los datos nuevos solo son válidos cuando este bit está activo.
  • Bits 0–3: número de puntos de contacto. El driver de Linux rechaza recuentos superiores al máximo configurado.
  • Bit 4: hay una tecla (botón) pulsada.

Cada punto de contacto que sigue ocupa 8 bytes: un track ID y, a continuación, X, Y y tamaño como valores little-endian de 16 bits.

Después de leer, tanto el driver de Linux como esp_lcd_touch_gt911 escriben 0 en 0x814E. Si escribes tu propio driver, haz lo mismo; omitir esa escritura es un motivo habitual por el que un driver hecho a mano solo detecta el primer toque.

Ajustar el flanco de la interrupción

El tipo de disparo está en la propia configuración del GT911: bits 0–1 del byte de configuración en 0x804D (desplazamiento 6 desde el inicio de la configuración en 0x8047). El driver de Linux lo interpreta así:

Valor

Tipo de interrupción

0

Flanco de subida

1

Flanco de bajada

2

Nivel bajo

3

Nivel alto

Configura la interrupción GPIO en consecuencia. En esp_lcd_touch_gt911, levels.interrupt = 1 selecciona una interrupción por flanco ascendente y 0 por flanco descendente.

¿No hay línea INT? Sondeo

El sondeo funciona perfectamente para usos HMI. ESPHome sondea cada 50 ms por defecto (update_interval) cuando no se define interrupt_pin. El controlador de Linux, cuando sí dispone de interrupción, espera hasta 20 ms el bit de listo antes de abandonar una trama.

4. El toque aparece en el lugar equivocado

Comprueba la resolución almacenada en el GT911

El GT911 informa las coordenadas según la resolución escrita en su configuración, no según la resolución de tu pantalla. Según el controlador de Linux, el X máximo es el valor little-endian de 16 bits en 0x8048 y el Y máximo en 0x804A. Léelos. Si el controlador está configurado para 1024×600 y tu panel es de 800×480, los toques quedan a la derecha y por debajo del dedo, y los bordes extremos se salen de la pantalla. La solución es escalar (o ajustar los límites del controlador a los valores del propio chip).

De dónde toma los límites cada stack:

Stack

Fuente de la resolución

Intercambio y espejo

Linux goodix

Se lee de la configuración del GT911; recurre a 4095 × 4095 cuando la configuración no define ninguno

Device tree: touchscreen-swapped-x-y, touchscreen-inverted-x, touchscreen-inverted-y, touchscreen-size-x/y

ESP-IDF esp_lcd_touch_gt911

Tus x_max / y_max en esp_lcd_touch_config_t (el controlador no lee la resolución del chip)

flags.swap_xy, flags.mirror_x, flags.mirror_y

ESPHome gt911

calibration de la pantalla táctil (x_min, x_max, y_min, y_max)

transform: swap_xy / mirror_x / mirror_y

Calibra a partir de los valores en bruto

La página de pantallas táctiles de ESPHome sugiere registrar touch.x_raw y touch.y_raw en una lambda de on_touch, tocar las esquinas en los píxeles del borde varias veces e introducir los valores mínimos y máximos en bruto como calibración. El mismo método funciona en cualquier plataforma: imprime la X y la Y en bruto, toca las cuatro esquinas y mapea el rango sobre la pantalla.

Corrige la orientación en este orden: primero coloca X e Y en los ejes correctos (swap_xy) y luego invierte el eje que funcione al revés (mirror_x / mirror_y). El (0, 0) lógico de la pantalla debe estar en la esquina superior izquierda.

5. Reescribir la configuración del GT911: último recurso

El bloque de configuración empieza en 0x8047. En el GT911, el controlador de Linux lo trata como 186 bytes:

  • Byte 0 (0x8047): versión de la configuración.
  • Bytes 1–4: resolución X e Y (ver paso 4).
  • Byte 5 (0x804C): máximo de puntos táctiles, 4 bits bajos.
  • Byte 6 (0x804D): tipo de disparo de la interrupción, 2 bits bajos.
  • Byte 184 (0x80FF): checksum, el complemento a dos de 8 bits de la suma de los bytes 0–183.
  • Byte 185 (0x8100): config_fresh, que debe ser 1.

El propio controlador de Linux solo escribe una configuración cuando dispone de ambos GPIO (INT y RST) y encuentra un archivo de firmware (nombre por defecto goodix_911_cfg.bin, o el nombre indicado en una propiedad goodix,config-name). Sin ese archivo, usa la configuración ya almacenada en el chip.

Antes de escribir nada, lee los 186 bytes y guárdalos. Corrige la resolución y la orientación por software siempre que puedas. Un bloque de configuración creado para otro panel táctil puede dejar sin funcionamiento el táctil del tuyo, así que solicita el archivo al proveedor del panel si de verdad necesitas cambiarlo.

Cómo elegir un módulo táctil capacitivo

Si estás eligiendo una pantalla con CTP para un nuevo diseño, pregunta al proveedor tres cosas antes de solicitar muestras: qué controlador táctil usa, con qué dirección I2C se envía y si INT y RST llegan al conector. Envíanos tu tamaño, interfaz y procesador host a través de Ask an Engineer, e incluiremos esas tres respuestas con los módulos que te propongamos.

Preguntas frecuentes

¿Cuál es la dirección I2C del GT911?

0x5D o 0x14 (7 bits). El controlador muestrea su pin INT cuando se libera el reset: INT en bajo selecciona 0x5D, INT en alto selecciona 0x14. Las hojas de datos que indican 0xBA/0xBB o 0x28/0x29 dan las mismas direcciones como bytes de escritura/lectura de 8 bits.

¿Por qué mi GT911 cambia de dirección tras un reinicio?

INT está flotando o lo está controlando otro elemento cuando se libera el reset, por lo que el controlador muestrea un nivel distinto cada vez. Fuerce INT en bajo (para 0x5D) o en alto (para 0x14) antes de liberar RST, espere más de 5 ms, mantenga INT en bajo durante 50 ms y después configúrelo como entrada. Si el host no puede controlar INT, sondee ambas direcciones.

¿Por qué solo recibo un toque del GT911?

Después de leer los datos de tacto en 0x814E, escriba 0 en 0x814E. El driver goodix de Linux y el esp_lcd_touch_gt911 de Espressif lo hacen tras cada lectura; un driver que omita este paso normalmente deja de detectar nuevos toques.

¿Por qué las coordenadas táctiles del GT911 están escaladas o desplazadas?

El GT911 informa en la resolución almacenada en su propia configuración (X en 0x8048, Y en 0x804A). Si difiere de la de su panel, escale los valores o ajuste x_max/y_max de su driver a la resolución del controlador y, a continuación, use swap_xy y mirror_x/mirror_y para la orientación.

¿Funciona el GT911 sin el pin INT?

Sí. Sondee el registro de estado 0x814E en lugar de usar una interrupción. ESPHome sondea cada 50 ms por defecto cuando no se establece interrupt_pin. Sin INT, el host tampoco puede elegir la dirección, así que use la que responda de las dos, 0x5D o 0x14.

¿Debería reescribir la configuración del GT911?

Solo como último recurso. Primero lea y guarde el bloque existente de 186 bytes desde 0x8047, priorice corregir la resolución y la orientación por software y, si tiene que escribir una configuración, use el archivo de configuración del proveedor del panel táctil. El bloque termina con una suma de verificación de 8 bits en 0x80FF y un byte config_fresh en 0x8100 que debe ser 1.

Fuentes

  1. Kernel de Linux: drivers/input/touchscreen/goodix.c
  2. Kernel de Linux: drivers/input/touchscreen/goodix.h (direcciones de registros)
  3. Kernel de Linux: device-tree binding del táctil Goodix (goodix.yaml)
  4. Espressif ESP-BSP: código fuente del driver esp_lcd_touch_gt911
  5. Espressif ESP-BSP: cabecera de esp_lcd_touch_gt911 (direcciones I2C)
  6. ESPHome: pantalla táctil GT911
  7. ESPHome: componentes de pantalla táctil (transform, calibration)

¿No sabe qué pantalla encaja en su diseño?

Envíenos el tamaño, la interfaz y el procesador host. Un ingeniero de pantallas responde en 12 horas con 2–3 opciones, datasheets y código de inicialización. Muestras desde 1 ud.