Vai al contenuto
Display Engineer
Risoluzione dei problemi

GT911 touch non funzionante? Indirizzo I2C, timing del reset, configurazione e correzioni delle coordinate

Una checklist passo passo per un controller touch capacitivo GT911 che non viene rilevato, non restituisce touch o riporta coordinate errate: alimentazione e scansione I2C, sequenza di selezione dell'indirizzo via INT/RST, registro di stato 0x814E, fronte dell'interrupt, risoluzione e correzioni degli assi per Linux, ESP-IDF ed ESPHome.

DEDisplay Engineer Applications Team · Display application engineerAggiornato il 19 ott 2026

Iniziate da qui: abbinare il sintomo

Sintomo

Causa più probabile

Andare a

Nulla a 0x5D o 0x14 in una scansione I2C

Il controller non è alimentato, pull-up mancanti o il chip è tenuto in reset

Passo 1

Trovato a 0x14 quando il driver si aspetta 0x5D (o viceversa), oppure l'indirizzo cambia tra un avvio e l'altro

Livello del pin INT durante il reset

Passo 2

Rilevato, l'ID di prodotto viene letto correttamente, ma non arrivano touch

Registro di stato non azzerato, fronte dell'interrupt errato o INT non collegato

Passo 3

I touch arrivano ma cadono nel punto sbagliato, specchiati o ruotati

La risoluzione nella configurazione del GT911 non corrisponde al pannello, oppure gli assi vanno scambiati

Passo 4

Se siete tentati di scrivere un nuovo blocco di configurazione

Leggete prima questo

Passo 5

Procedete con i passi in ordine. Gli indirizzi di registro e i timing indicati di seguito provengono dal driver goodix di Linux, dal componente esp_lcd_touch_gt911 di Espressif e dalla documentazione ESPHome; i link sono nella sezione Fonti.

1. Verificare che il GT911 sia alimentato e risponda su I2C

Alimentazione e pull-up

Il binding device-tree di Linux per i controller Goodix nomina due alimentazioni: AVDD28 (analogica) e VDDIO (la rail di I/O logico). Su un modulo o su una FPC entrambe sono di solito alimentate dal connettore dell'host, quindi misuratele sul connettore prima di sospettare il firmware. Anche SDA e SCL necessitano di resistenze di pull-up da qualche parte sul bus; molti moduli display non le includono.

Scansione del bus

Eseguite uno sketch di scansione I2C oppure i2cdetect. Un GT911 risponde a uno di due indirizzi a 7 bit:

Indirizzo a 7 bit

Byte di scrittura/lettura a 8 bit (come elencati in alcuni datasheet)

0x5D

0xBA / 0xBB

0x14

0x28 / 0x29

Le coppie a 8 bit derivano da un commento nel codice di reset del driver Linux. Se una scheda del fornitore indica "indirizzo 0xBA", si tratta dello stesso dispositivo dell'0x5D a 7 bit; inserite 0x5D in Arduino, ESP-IDF e Linux.

Lettura dell'ID di prodotto

Sul GT911 i registri hanno indirizzi a 16 bit. Il driver Linux legge 6 byte da 0x8140: i primi 4 byte sono l'ID di prodotto come testo ASCII e gli ultimi 2 sono la versione del firmware (little-endian). Un GT911 riporta la stringa 911. Se ottenete 911, bus, alimentazione e indirizzo sono a posto e il problema è più avanti in questo elenco.

Se non risponde nulla a nessuno dei due indirizzi, verificate che la linea di reset non sia tenuta bassa. Su molti moduli RST è un input del GT911 e deve essere portato alto dall'host (o tirato alto sulla scheda) prima che il controller si avvii.

2. Eseguire correttamente la sequenza di reset e selezione dell'indirizzo

Il GT911 sceglie il proprio indirizzo I2C in base al livello del pin INT nel momento in cui il reset viene rilasciato. Con le parole del binding Linux, la linea INT "viene campionata dal dispositivo al rilascio del reset per selezionare l'indirizzo del client I2C".

Livello di INT quando RST va alto

Indirizzo I2C

Basso

0x5D

Alto

0x14

La sequenza che il driver Linux utilizza

  1. Portare RST basso e attendere più di 10 ms (il driver attende 20 ms).
  2. Portare INT al livello corrispondente all'indirizzo desiderato: alto per 0x14, basso per 0x5D.
  3. Attendere più di 100 µs.
  4. Portare RST alto e attendere più di 5 ms (il driver attende 6–10 ms).
  5. Portare INT basso per 50 ms, quindi configurare INT come ingresso.

Se INT rimane flottante durante il passaggio 4, l'indirizzo può variare da un'accensione all'altra. È il classico caso riportato come "funziona dopo il flashing, fallisce dopo un avvio a freddo".

ESP-IDF: esp_lcd_touch_gt911

Il componente di Espressif definisce ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS come 0x5D e ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS_BACKUP come 0x14. Esegue la sequenza di selezione dell'indirizzo solo quando tutte e tre queste condizioni sono soddisfatte:

  • rst_gpio_num è un GPIO reale (non GPIO_NUM_NC),
  • int_gpio_num è un GPIO reale,
  • driver_data punta a una struttura esp_lcd_touch_io_gt911_config_t il cui dev_addr è l'indirizzo desiderato.

In caso contrario, registra il messaggio I2C address initialization procedure skipped - using default GT9xx setup ed esegue un semplice reset. In tal caso l'indirizzo è quello determinato dal cablaggio della scheda, e l'indirizzo I2C del panel-IO passato deve corrispondere al risultato della scansione. Il clock I2C predefinito del componente in ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG() è 100 kHz.

Schede in cui l'host non controlla INT

Se INT non è collegato all'host, l'host non può scegliere l'indirizzo: eseguire quindi la scansione di entrambi gli indirizzi e usare quello che risponde. Sulla Sunton ESP32-8048S043C, ad esempio, l'interrupt del GT911 non è cablato di default su un GPIO (vedere la pagina della nostra scheda). La pagina GT911 di ESPHome osserva che quando INT passa attraverso un IO expander, il pin viene comunque usato per impostare l'indirizzo all'avvio, ma il touch viene interrogato via polling invece che gestito a interrupt.

3. Rilevato, ma nessun evento di touch

Leggere e azzerare il registro di stato

I dati di touch iniziano a 0x814E. Il primo byte è un byte di stato:

  • Bit 7 (0x80): buffer pronto. I nuovi dati sono validi solo quando questo bit è impostato.
  • Bit 0–3: numero di punti di touch. Il driver Linux scarta conteggi superiori al massimo configurato.
  • Bit 4: un tasto (pulsante) è premuto.

Ogni punto di touch successivo occupa 8 byte: un track ID, quindi X, Y e dimensione come valori a 16 bit little-endian.

Dopo la lettura, sia il driver Linux sia esp_lcd_touch_gt911 scrivono 0 in 0x814E. Se si scrive un driver proprio, fare lo stesso; omettere tale scrittura è un motivo frequente per cui un driver scritto a mano rileva solo il primo tocco.

Configurare il fronte dell'interrupt

Il tipo di trigger è indicato nella configurazione interna del GT911: bit 0–1 del byte di configurazione all'indirizzo 0x804D (offset 6 dall'inizio della configurazione a 0x8047). Il driver Linux lo mappa così:

Valore

Tipo di interrupt

0

Fronte di salita

1

Fronte di discesa

2

Livello basso

3

Livello alto

Imposta l'interrupt GPIO di conseguenza. In esp_lcd_touch_gt911, levels.interrupt = 1 seleziona un interrupt sul fronte di salita e 0 un fronte di discesa.

Nessuna linea INT? Fai polling

Il polling funziona benissimo per un uso HMI. ESPHome effettua il polling ogni 50 ms per impostazione predefinita (update_interval) quando non è impostato interrupt_pin. Il driver Linux, quando dispone dell'interrupt, attende fino a 20 ms il bit di ready prima di rinunciare a un frame.

4. Il tocco arriva nel punto sbagliato

Verifica la risoluzione memorizzata nel GT911

Il GT911 riporta le coordinate nella risoluzione scritta nella sua configurazione, non nella risoluzione del tuo display. Secondo il driver Linux, il valore massimo di X è il valore a 16 bit little-endian all'indirizzo 0x8048 e il massimo di Y all'indirizzo 0x804A. Leggili. Se il controller è configurato per 1024×600 e il tuo pannello è 800×480, i tocchi arrivano a destra e sotto rispetto al dito e i bordi estremi cadono fuori schermo. La soluzione è riscalare (oppure impostare i limiti del driver sui valori del controller).

Da dove ogni stack ricava i limiti:

Stack

Fonte della risoluzione

Scambio e specchiamento

Linux goodix

Letti dalla configurazione del GT911; ricade su 4095 × 4095 quando la configurazione non li contiene

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

ESP-IDF esp_lcd_touch_gt911

I tuoi x_max / y_max in esp_lcd_touch_config_t (il driver non legge la risoluzione del chip)

flags.swap_xy, flags.mirror_x, flags.mirror_y

ESPHome gt911

calibration del touchscreen (x_min, x_max, y_min, y_max)

transform: swap_xy / mirror_x / mirror_y

Calibra a partire dai valori grezzi

La pagina touchscreen di ESPHome suggerisce di registrare touch.x_raw e touch.y_raw in una lambda on_touch, toccare gli angoli in corrispondenza dei pixel al bordo alcune volte e inserire i valori grezzi minimi e massimi come calibrazione. Lo stesso metodo funziona su qualsiasi piattaforma: stampa X e Y grezzi, tocca i quattro angoli e mappa l'intervallo sullo schermo.

Sistema l'orientamento in quest'ordine: prima porta X e Y sugli assi giusti (swap_xy), poi inverti l'asse che procede al contrario (mirror_x / mirror_y). Lo (0, 0) logico del display deve essere in alto a sinistra.

5. Riscrivere la configurazione del GT911: ultima risorsa

Il blocco di configurazione inizia all'indirizzo 0x8047. Per il GT911 il driver Linux lo considera 186 byte:

  • Byte 0 (0x8047): versione della configurazione.
  • Byte 1–4: risoluzione X e Y (vedi punto 4).
  • Byte 5 (0x804C): numero massimo di punti di tocco, 4 bit bassi.
  • Byte 6 (0x804D): tipo di trigger dell'interrupt, 2 bit bassi.
  • Byte 184 (0x80FF): checksum, il complemento a due a 8 bit della somma dei byte 0–183.
  • Byte 185 (0x8100): config_fresh, che deve essere 1.

Il driver Linux stesso scrive una configurazione solo quando dispone sia dei GPIO INT sia di RST e trova un file firmware (nome predefinito goodix_911_cfg.bin, oppure il nome indicato in una proprietà goodix,config-name). Senza quel file, usa la configurazione già memorizzata nel chip.

Prima di scrivere qualsiasi cosa, leggi tutti i 186 byte e salvali. Sistema risoluzione e orientamento via software dove puoi. Un blocco di configurazione creato per un pannello touch diverso può bloccare il funzionamento del touch sul tuo, quindi procuraati il file dal fornitore del pannello se davvero devi modificarlo.

Scelta di un modulo touch capacitivo

Se stai scegliendo un display CTP per un nuovo progetto, poni al fornitore tre domande prima di ordinare i campioni: quale controller touch utilizza, a quale indirizzo I2C viene spedito e se i segnali INT e RST arrivano fino al connettore. Invia dimensioni, interfaccia e processore host tramite Ask an Engineer, e includeremo queste tre risposte nei moduli che ti suggeriremo.

Domande frequenti

Qual è l'indirizzo I2C del GT911?

0x5D oppure 0x14 (a 7 bit). Il controller campiona il pin INT al rilascio del reset: INT basso seleziona 0x5D, INT alto seleziona 0x14. I datasheet che riportano 0xBA/0xBB o 0x28/0x29 indicano gli stessi indirizzi espressi come byte di scrittura/lettura a 8 bit.

Perché il mio GT911 cambia indirizzo dopo un riavvio?

INT è lasciato flottante o pilotato da altro dispositivo al rilascio del reset, quindi il controller campiona un livello diverso ogni volta. Pilotare INT basso (per 0x5D) o alto (per 0x14) prima di rilasciare RST, attendere più di 5 ms, tenere INT basso per 50 ms, quindi impostarlo come ingresso. Se l'host non può controllare INT, eseguire la scansione di entrambi gli indirizzi.

Perché dal GT911 ricevo un solo tocco?

Dopo aver letto i dati di touch all'indirizzo 0x814E, scrivere 0 in 0x814E. Sia il driver goodix di Linux che esp_lcd_touch_gt911 di Espressif lo fanno dopo ogni lettura; un driver che lo omette in genere smette di rilevare nuovi tocchi.

Perché le coordinate touch del GT911 risultano scalate o traslate?

Il GT911 riporta le coordinate nella risoluzione memorizzata nella propria configurazione (X a 0x8048, Y a 0x804A). Se differisce da quella del pannello, scalare i valori o impostare x_max/y_max del driver sulla risoluzione del controller, quindi usare swap_xy e mirror_x/mirror_y per l'orientamento.

Il GT911 funziona senza il pin INT?

Sì. Interrogare (polling) il registro di stato 0x814E invece di usare un interrupt. ESPHome esegue il polling ogni 50 ms per impostazione predefinita quando interrupt_pin non è impostato. Senza INT l'host inoltre non può scegliere l'indirizzo: usare quello tra 0x5D e 0x14 che risponde.

Vale la pena riscrivere la configurazione del GT911?

Solo come ultima risorsa. Prima leggere e salvare il blocco esistente di 186 byte da 0x8047, preferire la correzione di risoluzione e orientamento via software e, se si deve scrivere una configurazione, usare il file di configurazione del fornitore del touch panel. Il blocco termina con un checksum a 8 bit a 0x80FF e un byte config_fresh a 0x8100 che deve valere 1.

Fonti

  1. Kernel Linux: drivers/input/touchscreen/goodix.c
  2. Kernel Linux: drivers/input/touchscreen/goodix.h (indirizzi dei registri)
  3. Kernel Linux: binding device-tree del touchscreen Goodix (goodix.yaml)
  4. Espressif ESP-BSP: sorgente del driver esp_lcd_touch_gt911
  5. Espressif ESP-BSP: header di esp_lcd_touch_gt911 (indirizzi I2C)
  6. ESPHome: touchscreen GT911
  7. ESPHome: componenti touchscreen (trasformazione, calibrazione)

Non sai quale display è adatto al tuo progetto?

Inviaci dimensione, interfaccia e processore host. Un display engineer risponde entro 12 ore con 2–3 opzioni, datasheet e codice di inizializzazione. Campioni da 1 pz.