Zum Inhalt springen
Display Engineer
Fehlersuche

GT911-Touch funktioniert nicht? I2C-Adresse, Reset-Timing, Konfiguration und Koordinaten-Fixes

Eine Schritt-für-Schritt-Checkliste für einen GT911-Kapazitiven-Touch-Controller, der nicht erkannt wird, keine Touch-Ereignisse meldet oder falsche Koordinaten liefert: Versorgung und I2C-Scan, die INT/RST-Adressauswahl-Sequenz, das Statusregister 0x814E, Interrupt-Flanke, Auflösungs- und Achsen-Fixes für Linux, ESP-IDF und ESPHome.

DEDisplay Engineer Applications Team · Display-ApplikationsingenieureAktualisiert am 19. Okt. 2026

Hier starten: Das Symptom zuordnen

Symptom

Wahrscheinlichste Ursache

Weiter bei

Nichts bei 0x5D oder 0x14 beim I2C-Scan

Controller hat keine Versorgung, fehlende Pull-ups oder der Chip wird in Reset gehalten

Schritt 1

Gefunden bei 0x14, während der Treiber 0x5D erwartet (oder umgekehrt), oder die Adresse wechselt zwischen Neustarts

INT-Pin-Pegel während des Reset

Schritt 2

Erkannt, Produkt-ID wird korrekt gelesen, aber es kommen keine Touch-Ereignisse an

Statusregister nicht gelöscht, Interrupt-Flanke falsch oder INT nicht angeschlossen

Schritt 3

Touch-Ereignisse kommen an, landen aber an der falschen Stelle, gespiegelt oder gedreht

Auflösung in der GT911-Konfiguration stimmt nicht mit dem Panel überein, oder die Achsen müssen getauscht werden

Schritt 4

Versuchung, einen neuen Konfigurationsblock zu schreiben

Zuerst das hier lesen

Schritt 5

Gehen Sie die Schritte der Reihe nach durch. Die unten angegebenen Registeradressen und Timings stammen aus dem Linux-goodix-Treiber, der esp_lcd_touch_gt911-Komponente von Espressif und der ESPHome-Dokumentation; die Links finden Sie im Abschnitt Sources.

1. Prüfen, ob der GT911 mit Strom versorgt ist und auf I2C antwortet

Versorgung und Pull-ups

Das Linux-Device-Tree-Binding für Goodix-Controller nennt zwei Versorgungen: AVDD28 (analog) und VDDIO (die Logik-I/O-Schiene). Auf einem Modul oder FPC werden beide in der Regel über den Host-Stecker versorgt, messen Sie sie daher am Stecker, bevor Sie der Firmware die Schuld geben. SDA und SCL benötigen außerdem irgendwo am Bus Pull-up-Widerstände; viele Display-Module enthalten keine.

Den Bus scannen

Führen Sie ein I2C-Scanner-Sketch oder i2cdetect aus. Ein GT911 antwortet auf eine von zwei 7-Bit-Adressen:

7-Bit-Adresse

8-Bit-Write-/Read-Bytes (wie in manchen Datenblättern angegeben)

0x5D

0xBA / 0xBB

0x14

0x28 / 0x29

Die 8-Bit-Paare stammen aus einem Kommentar im Reset-Code des Linux-Treibers. Wenn ein Herstellerblatt „Adresse 0xBA“ angibt, handelt es sich um dasselbe Gerät wie 7-Bit 0x5D; verwenden Sie 0x5D in Arduino, ESP-IDF und Linux.

Die Produkt-ID lesen

Register auf dem GT911 haben 16-Bit-Adressen. Der Linux-Treiber liest 6 Bytes ab 0x8140: Die ersten 4 Bytes sind die Produkt-ID als ASCII-Text, die letzten 2 sind die Firmware-Version (Little-Endian). Ein GT911 meldet den String 911. Wenn Sie 911 erhalten, sind Bus, Versorgung und Adresse in Ordnung, und das Problem liegt weiter unten in dieser Liste.

Wenn keine der beiden Adressen antwortet, prüfen Sie, ob die Reset-Leitung nicht auf Low gehalten wird. Bei vielen Modulen ist RST ein Eingang des GT911 und muss vom Host auf High gezogen (oder auf dem Board nach oben gepullt) werden, bevor der Controller läuft.

2. Die Reset- und Adressauswahl-Sequenz korrekt ausführen

Der GT911 wählt seine I2C-Adresse anhand des Pegels an seinem INT-Pin im Moment, in dem der Reset freigegeben wird. In den Worten des Linux-Bindings wird die INT-Leitung „vom Gerät bei der Reset-Freigabe abgetastet, um die I2C-Client-Adresse auszuwählen“.

INT-Pegel, wenn RST auf High geht

I2C-Adresse

Low

0x5D

High

0x14

Die Sequenz, die der Linux-Treiber verwendet

  1. RST auf Low ziehen und mehr als 10 ms warten (der Treiber wartet 20 ms).
  2. INT auf den Pegel der gewünschten Adresse ziehen: High für 0x14, Low für 0x5D.
  3. Mehr als 100 µs warten.
  4. RST auf High ziehen und mehr als 5 ms warten (der Treiber wartet 6–10 ms).
  5. INT für 50 ms auf Low ziehen und INT anschließend auf Eingang schalten.

Wenn INT in Schritt 4 in der Schwebe bleibt, kann sich die Adresse von einem Einschaltvorgang zum nächsten unterscheiden. Das ist der klassische Bericht: „funktioniert nach dem Flashen, versagt nach einem Kaltstart“.

ESP-IDF: esp_lcd_touch_gt911

Die Komponente von Espressif definiert ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS als 0x5D und ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS_BACKUP als 0x14. Die Sequenz zur Adressauswahl wird nur ausgeführt, wenn alle drei folgenden Bedingungen erfüllt sind:

  • rst_gpio_num ist ein echtes GPIO (nicht GPIO_NUM_NC),
  • int_gpio_num ist ein echtes GPIO,
  • driver_data zeigt auf eine esp_lcd_touch_io_gt911_config_t, deren dev_addr die gewünschte Adresse ist.

Andernfalls gibt sie I2C address initialization procedure skipped - using default GT9xx setup aus und führt einen einfachen Reset durch. In diesem Fall ergibt sich die Adresse aus der Verdrahtung des Boards, und die I2C-Adresse des Panel-IO, die Sie übergeben, muss zum Scan-Ergebnis passen. Der Standard-I2C-Takt der Komponente in ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG() beträgt 100 kHz.

Boards, bei denen der Host INT nicht steuert

Wenn INT nicht mit dem Host verbunden ist, kann der Host die Adresse nicht wählen; scannen Sie daher beide Adressen und verwenden Sie die, die antwortet. Beim Sunton ESP32-8048S043C ist der GT911-Interrupt beispielsweise nicht standardmäßig mit einem GPIO verbunden (siehe unsere Board-Seite). ESPHome GT911-Seite weist darauf hin, dass INT auch bei einem IO-Expander weiterhin zum Festlegen der Adresse beim Booten verwendet wird, aber Touch-Daten per Polling statt interruptgesteuert abgefragt werden.

3. Erkannt, aber keine Touch-Events

Statusregister lesen und löschen

Die Touch-Daten beginnen bei 0x814E. Das erste Byte ist ein Statusbyte:

  • Bit 7 (0x80): Puffer bereit. Neue Daten sind nur gültig, wenn dieses Bit gesetzt ist.
  • Bits 0–3: Anzahl der Touch-Punkte. Der Linux-Treiber verwirft Zählwerte oberhalb des konfigurierten Maximums.
  • Bit 4: Eine Taste ist gedrückt.

Jeder folgende Touch-Punkt umfasst 8 Bytes: eine Track-ID, dann X, Y und Größe als Little-Endian-16-Bit-Werte.

Nach dem Lesen schreiben sowohl der Linux-Treiber als auch esp_lcd_touch_gt911 0 nach 0x814E. Wenn Sie einen eigenen Treiber schreiben, tun Sie dasselbe; das Auslassen dieses Schreibvorgangs ist ein häufiger Grund, warum ein handgeschriebener Treiber nur den ersten Touch sieht.

Passende Interrupt-Flanke

Der Triggertyp steht in der eigenen Konfiguration des GT911: Bits 0–1 des Config-Bytes bei 0x804D (Offset 6 vom Konfigurationsstart bei 0x8047). Der Linux-Treiber bildet das wie folgt ab:

Wert

Interrupt-Typ

0

Steigende Flanke

1

Fallende Flanke

2

Low-Pegel

3

High-Pegel

Passen Sie Ihren GPIO-Interrupt entsprechend an. In esp_lcd_touch_gt911 wählt levels.interrupt = 1 einen Interrupt auf steigende Flanke und 0 einen Interrupt auf fallende Flanke.

Kein INT-Pin? Pollen

Polling funktioniert für HMI-Anwendungen problemlos. ESPHome pollt standardmäßig alle 50 ms (update_interval), wenn kein interrupt_pin gesetzt ist. Der Linux-Treiber wartet, wenn ein Interrupt vorhanden ist, bis zu 20 ms auf das Ready-Bit, bevor er einen Frame aufgibt.

4. Touch landet an der falschen Stelle

Im GT911 gespeicherte Auflösung prüfen

Der GT911 meldet Koordinaten in der Auflösung, die in seiner Konfiguration hinterlegt ist, nicht in der Auflösung Ihres Displays. Laut Linux-Treiber ist das X-Maximum der Little-Endian-16-Bit-Wert an 0x8048 und das Y-Maximum an 0x804A. Lesen Sie beide aus. Ist der Controller auf 1024×600 konfiguriert, Ihr Panel aber 800×480, landen Touchpunkte rechts von und unterhalb Ihres Fingers, und die äußeren Ränder fallen aus dem Bildschirm. Die Lösung ist, zu skalieren (oder die Grenzwerte des Treibers auf die Werte des Controllers zu setzen).

Woher jeder Stack seine Grenzwerte bezieht:

Stack

Quelle der Auflösung

Vertauschen und Spiegeln

Linux goodix

Wird aus der GT911-Konfiguration gelesen; fällt auf 4095 × 4095 zurück, wenn die Konfiguration keine enthält

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

ESP-IDF esp_lcd_touch_gt911

Ihre x_max- / y_max-Werte in esp_lcd_touch_config_t (der Treiber liest die Auflösung des Chips nicht aus)

flags.swap_xy, flags.mirror_x, flags.mirror_y

ESPHome gt911

Touchscreen-calibration (x_min, x_max, y_min, y_max)

transform: swap_xy / mirror_x / mirror_y

Aus Rohwerten kalibrieren

Die ESPHome-Touchscreen-Seite schlägt vor, touch.x_raw und touch.y_raw in einer on_touch-Lambda zu loggen, die Ecken mehrfach an den Randpixeln zu berühren und die minimalen und maximalen Rohwerte als Kalibrierung einzutragen. Dieselbe Methode funktioniert auf jeder Plattform: X und Y als Rohwerte ausgeben, die vier Ecken berühren und den Bereich auf den Bildschirm abbilden.

Gehen Sie bei der Ausrichtung in dieser Reihenfolge vor: Bringen Sie zuerst X und Y auf die richtigen Achsen (swap_xy), und spiegeln Sie dann die Achse, die in die falsche Richtung läuft (mirror_x / mirror_y). Der logische Punkt (0, 0) des Displays muss oben links liegen.

5. Neuschreiben der GT911-Konfiguration: letzte Option

Der Konfigurationsblock beginnt an 0x8047. Beim GT911 behandelt der Linux-Treiber ihn als 186 Bytes:

  • Byte 0 (0x8047): Konfigurationsversion.
  • Bytes 1–4: X- und Y-Auflösung (siehe Schritt 4).
  • Byte 5 (0x804C): maximale Anzahl Touchpunkte, untere 4 Bits.
  • Byte 6 (0x804D): Interrupt-Trigger-Typ, untere 2 Bits.
  • Byte 184 (0x80FF): Prüfsumme, das 8-Bit-Zweierkomplement der Summe der Bytes 0–183.
  • Byte 185 (0x8100): config_fresh, muss 1 sein.

Der Linux-Treiber selbst schreibt eine Konfiguration nur, wenn er sowohl die INT- als auch die RST-GPIOs hat und eine Firmware-Datei findet (Standardname goodix_911_cfg.bin oder der Name aus einer goodix,config-name-Property). Ohne diese Datei verwendet er die bereits im Chip gespeicherte Konfiguration.

Bevor Sie irgendetwas schreiben, lesen Sie alle 186 Bytes aus und sichern Sie sie. Beheben Sie Auflösung und Ausrichtung so weit wie möglich in Software. Ein Konfigurationsblock, der für ein anderes Touch-Panel erstellt wurde, kann den Touch Ihres Panels lahmlegen – holen Sie die Datei daher beim Lieferanten des Panels, wenn Sie sie wirklich ändern müssen.

Auswahl eines kapazitiven Touch-Moduls

Wenn Sie ein CTP-Display für einen neuen Entwurf auswählen, fragen Sie den Lieferanten vor der Musterbestellung drei Dinge: welcher Touch-Controller verbaut ist, mit welcher I2C-Adresse er ausgeliefert wird und ob INT und RST bis zum Connector herausgeführt sind. Senden Sie uns Größe, Interface und Host-Prozessor über Ask an Engineer, und wir liefern diese drei Antworten gleich mit den von uns vorgeschlagenen Modulen mit.

Häufige Fragen

Wie lautet die I2C-Adresse des GT911?

Entweder 0x5D oder 0x14 (7-Bit). Der Controller samplet seinen INT-Pin beim Loslassen des Reset: INT low wählt 0x5D, INT high wählt 0x14. Datenblätter, die 0xBA/0xBB oder 0x28/0x29 angeben, nennen dieselben Adressen als 8-Bit-Schreib-/Lesebytes.

Warum ändert mein GT911 nach einem Neustart die Adresse?

INT ist in der Schwebe oder wird von etwas anderem getrieben, wenn der Reset freigegeben wird, sodass der Controller jedes Mal einen anderen Pegel samplet. Treiben Sie INT low (für 0x5D) oder high (für 0x14), bevor Sie RST freigeben, warten Sie mehr als 5 ms, halten Sie INT für 50 ms low, und schalten Sie ihn dann auf Eingang. Wenn der Host INT nicht steuern kann, scannen Sie beide Adressen.

Warum liefert der GT911 nur einen einzigen Touch?

Nach dem Lesen der Touch-Daten bei 0x814E schreiben Sie 0 nach 0x814E. Der Linux-goodix-Treiber und Espressifs esp_lcd_touch_gt911 tun dies nach jedem Lesevorgang; ein Treiber, der dies überspringt, sieht typischerweise keine neuen Touch-Ereignisse mehr.

Warum sind die Touch-Koordinaten des GT911 skaliert oder versetzt?

Der GT911 meldet Werte in der Auflösung, die in seiner eigenen Konfiguration gespeichert ist (X bei 0x8048, Y bei 0x804A). Weicht diese von Ihrem Panel ab, skalieren Sie die Werte oder setzen Sie x_max/y_max Ihres Treibers auf die Auflösung des Controllers, und verwenden Sie dann swap_xy sowie mirror_x/mirror_y für die Ausrichtung.

Funktioniert der GT911 ohne den INT-Pin?

Ja. Pollen Sie stattdessen das Statusregister 0x814E, statt einen Interrupt zu verwenden. ESPHome pollt standardmäßig alle 50 ms, wenn kein interrupt_pin gesetzt ist. Ohne INT kann der Host auch die Adresse nicht wählen, verwenden Sie also diejenige von 0x5D oder 0x14, die antwortet.

Sollte ich die GT911-Konfiguration neu schreiben?

Nur als letzte Möglichkeit. Lesen und sichern Sie zuerst den vorhandenen 186-Byte-Block ab 0x8047, bevorzugen Sie die Korrektur von Auflösung und Ausrichtung per Software und verwenden Sie die Konfigurationsdatei des Touch-Panel-Lieferanten, falls Sie eine schreiben müssen. Der Block endet mit einer 8-Bit-Prüfsumme bei 0x80FF und einem config_fresh-Byte bei 0x8100, das 1 sein muss.

Quellen

  1. Linux-Kernel: drivers/input/touchscreen/goodix.c
  2. Linux-Kernel: drivers/input/touchscreen/goodix.h (Registeradressen)
  3. Linux-Kernel: Goodix-Touchscreen-Device-Tree-Binding (goodix.yaml)
  4. Espressif ESP-BSP: esp_lcd_touch_gt911 Treiberquelle
  5. Espressif ESP-BSP: esp_lcd_touch_gt911 Header (I2C-Adressen)
  6. ESPHome: GT911-Touchscreen
  7. ESPHome: Touchscreen-Komponenten (Transformation, Kalibrierung)

Unsicher, welches Display zu Ihrem Design passt?

Nennen Sie uns Größe, Schnittstelle und Host-Prozessor. Ein Display-Ingenieur antwortet innerhalb von 12 Stunden mit 2–3 Optionen, Datenblättern und Init-Code. Muster ab 1 Stk.