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) |
|---|---|
| |
| |
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 | |
High | |
Die Sequenz, die der Linux-Treiber verwendet
- RST auf Low ziehen und mehr als 10 ms warten (der Treiber wartet 20 ms).
- INT auf den Pegel der gewünschten Adresse ziehen: High für
0x14, Low für0x5D. - Mehr als 100 µs warten.
- RST auf High ziehen und mehr als 5 ms warten (der Treiber wartet 6–10 ms).
- 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_numist ein echtes GPIO (nichtGPIO_NUM_NC),int_gpio_numist ein echtes GPIO,driver_datazeigt auf eineesp_lcd_touch_io_gt911_config_t, derendev_addrdie 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 | Wird aus der GT911-Konfiguration gelesen; fällt auf 4095 × 4095 zurück, wenn die Konfiguration keine enthält | Device-Tree: |
ESP-IDF | Ihre | |
ESPHome | Touchscreen- | |
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, muss1sein.
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
- Linux-Kernel: drivers/input/touchscreen/goodix.c
- Linux-Kernel: drivers/input/touchscreen/goodix.h (Registeradressen)
- Linux-Kernel: Goodix-Touchscreen-Device-Tree-Binding (goodix.yaml)
- Espressif ESP-BSP: esp_lcd_touch_gt911 Treiberquelle
- Espressif ESP-BSP: esp_lcd_touch_gt911 Header (I2C-Adressen)
- ESPHome: GT911-Touchscreen
- ESPHome: Touchscreen-Komponenten (Transformation, Kalibrierung)