Commencez ici : identifiez le symptôme
Symptôme | Cause la plus probable | Consultez |
|---|---|---|
Rien aux adresses 0x5D ou 0x14 lors d'un scan I2C | Contrôleur non alimenté, résistances de tirage manquantes, ou puce maintenue en reset | Étape 1 |
Détecté à l'adresse 0x14 alors que le pilote attend 0x5D (ou l'inverse), ou l'adresse change d'un démarrage à l'autre | Niveau de la broche INT pendant le reset | Étape 2 |
Détecté, l'ID de produit se lit correctement, mais aucune touche n'arrive | Registre d'état non effacé, front d'interruption incorrect, ou INT non câblée | Étape 3 |
Les touches arrivent mais au mauvais endroit, en miroir ou pivotées | La résolution dans la configuration du GT911 ne correspond pas au panneau, ou les axes doivent être permutés | Étape 4 |
Tenté d'écrire un nouveau bloc de configuration | Lisez ceci d'abord | Étape 5 |
Suivez les étapes dans l'ordre. Les adresses de registres et les temporisations ci-dessous proviennent du pilote goodix de Linux, du composant esp_lcd_touch_gt911 d'Espressif et de la documentation ESPHome ; les liens figurent dans la section Sources.
1. Vérifier que le GT911 est alimenté et répond sur le bus I2C
Alimentation et résistances de tirage
Le binding device-tree Linux pour les contrôleurs Goodix nomme deux alimentations : AVDD28 (analogique) et VDDIO (rail d'E/S logiques). Sur un module ou une FPC, les deux sont généralement alimentées depuis le connecteur hôte ; mesurez-les donc au niveau du connecteur avant de suspecter le firmware. SDA et SCL nécessitent également des résistances de tirage quelque part sur le bus ; de nombreux modules d'affichage n'en intègrent pas.
Scanner le bus
Exécutez un sketch de scan I2C ou i2cdetect. Un GT911 répond à l'une de ces deux adresses 7 bits :
Adresse 7 bits | Octets d'écriture / lecture 8 bits (comme listés dans certaines datasheets) |
|---|---|
| |
| |
Les paires 8 bits proviennent d'un commentaire dans le code de reset du pilote Linux. Si une documentation vendeur indique « adresse 0xBA », il s'agit du même périphérique que 0x5D en 7 bits ; saisissez 0x5D dans Arduino, ESP-IDF et Linux.
Lire l'ID de produit
Sur le GT911, les registres ont des adresses 16 bits. Le pilote Linux lit 6 octets à partir de 0x8140 : les 4 premiers octets sont l'ID de produit en texte ASCII et les 2 derniers sont la version du firmware (petit-boutiste). Un GT911 renvoie la chaîne 911. Si vous obtenez 911, le bus, l'alimentation et l'adresse sont corrects, et le problème se trouve plus bas dans cette liste.
Si rien ne répond à l'une ou l'autre adresse, vérifiez que la ligne de reset n'est pas maintenue à l'état bas. Sur de nombreux modules, RST est une entrée du GT911 et doit être pilotée à l'état haut par l'hôte (ou tirée vers le haut sur la carte) avant que le contrôleur ne fonctionne.
2. Réussir la séquence de reset et de sélection d'adresse
Le GT911 choisit son adresse I2C en fonction du niveau de sa broche INT au moment où le reset est relâché. Selon les termes du binding Linux, la ligne INT « est échantillonnée par le périphérique à la désassertion du reset pour sélectionner l'adresse du client I2C ».
Niveau de INT quand RST passe à l'état haut | Adresse I2C |
|---|---|
Bas | |
Haut | |
La séquence utilisée par le pilote Linux
- Passer RST à l'état bas et attendre plus de 10 ms (le pilote attend 20 ms).
- Amener INT au niveau correspondant à l'adresse souhaitée : haut pour
0x14, bas pour0x5D. - Attendre plus de 100 µs.
- Passer RST à l'état haut et attendre plus de 5 ms (le pilote attend 6–10 ms).
- Maintenir INT à l'état bas pendant 50 ms, puis basculer INT en entrée.
Si INT flotte pendant l'étape 4, l'adresse peut différer d'une mise sous tension à l'autre. C'est le signalement classique du type « ça marche après le flash, ça échoue après un démarrage à froid ».
ESP-IDF : esp_lcd_touch_gt911
Le composant d'Espressif définit ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS comme 0x5D et ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS_BACKUP comme 0x14. Il n'exécute la séquence de sélection d'adresse que si les trois conditions suivantes sont remplies :
rst_gpio_numest un GPIO réel (pasGPIO_NUM_NC),int_gpio_numest un GPIO réel,driver_datapointe vers une structureesp_lcd_touch_io_gt911_config_tdontdev_addrest l'adresse souhaitée.
Sinon, il journalise I2C address initialization procedure skipped - using default GT9xx setup et effectue une simple réinitialisation. Dans ce cas, l'adresse est celle que donne le câblage de la carte, et l'adresse I2C du panel-IO que vous passez doit correspondre au résultat du scan. L'horloge I2C par défaut du composant dans ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG() est de 100 kHz.
Cartes où l'hôte ne commande pas INT
Si INT n'est pas relié à l'hôte, celui-ci ne peut pas choisir l'adresse ; scannez donc les deux adresses et utilisez celle qui répond. Sur la Sunton ESP32-8048S043C, par exemple, l'interruption du GT911 n'est pas câblée par défaut vers un GPIO (voir notre page sur la carte). La page GT911 d'ESPHome indique que lorsque INT passe par un expandeur d'E/S, la broche sert toujours à définir l'adresse au démarrage, mais le tactile est interrogé par polling plutôt que par interruption.
3. Détecté, mais aucun événement tactile
Lire et effacer le registre d'état
Les données tactiles commencent à 0x814E. Le premier octet est un octet d'état :
- Bit 7 (
0x80) : tampon prêt. De nouvelles données ne sont valides que si ce bit est positionné. - Bits 0–3 : nombre de points de contact. Le pilote Linux rejette les valeurs supérieures au maximum configuré.
- Bit 4 : une touche (bouton) est enfoncée.
Chaque point de contact qui suit occupe 8 octets : un track ID, puis X, Y et la taille en valeurs 16 bits little-endian.
Après lecture, le pilote Linux comme esp_lcd_touch_gt911 écrivent 0 dans 0x814E. Si vous écrivez votre propre pilote, faites de même ; omettre cette écriture est une cause fréquente de pilote artisanal qui ne détecte que le premier contact.
Adapter le front d'interruption
Le type de déclenchement est indiqué dans la configuration propre du GT911 : bits 0–1 de l'octet de configuration à 0x804D (décalage de 6 depuis le début de la configuration à 0x8047). Le pilote Linux l'interprète ainsi :
Valeur | Type d'interruption |
|---|---|
0 | Front montant |
1 | Front descendant |
2 | Niveau bas |
3 | Niveau haut |
Configurez votre interruption GPIO en conséquence. Dans esp_lcd_touch_gt911, levels.interrupt = 1 sélectionne une interruption sur front montant et 0 sur front descendant.
Pas de ligne INT ? Scrutez
Le polling fonctionne très bien pour une utilisation HMI. ESPHome scrute toutes les 50 ms par défaut (update_interval) quand aucun interrupt_pin n'est défini. Le pilote Linux, lorsqu'il dispose d'une interruption, attend jusqu'à 20 ms le bit ready avant d'abandonner une trame.
4. Le toucher arrive au mauvais endroit
Vérifiez la résolution enregistrée dans le GT911
Le GT911 rapporte les coordonnées dans la résolution écrite dans sa configuration, et non dans celle de votre écran. D'après le pilote Linux, le maximum X est la valeur 16 bits little-endian à l'adresse 0x8048 et le maximum Y à l'adresse 0x804A. Lisez-les. Si le contrôleur est configuré pour 1024×600 alors que votre dalle est en 800×480, les touchers atterrissent à droite et en dessous du doigt et les bords extrêmes sortent de l'écran. La solution consiste à mettre à l'échelle (ou à régler les limites du pilote sur les valeurs du contrôleur).
D'où chaque pile tire ses limites :
Pile | Source de la résolution | Permutation et miroir |
|---|---|---|
Pilote Linux | Lues dans la configuration du GT911 ; repli sur 4095 × 4095 quand la configuration n'en contient pas | Device-tree |
ESP-IDF | Vos | |
ESPHome | | |
Calibrez à partir des valeurs brutes
La page touchscreen d'ESPHome suggère de logger touch.x_raw et touch.y_raw dans une lambda on_touch, de toucher les coins au niveau des pixels en bordure quelques fois, puis de saisir les valeurs brutes minimales et maximales comme calibration. La même méthode fonctionne sur n'importe quelle plateforme : affichez les X et Y bruts, touchez les quatre coins, puis ramenez la plage sur l'écran.
Corrigez l'orientation dans cet ordre : commencez par placer X et Y sur les bons axes (swap_xy), puis inversez l'axe qui parcourt l'écran à l'envers (mirror_x / mirror_y). Le point logique (0, 0) de l'écran doit être en haut à gauche.
5. Réécrire la configuration du GT911 : en dernier recours
Le bloc de configuration commence à 0x8047. Pour le GT911, le pilote Linux le traite comme 186 octets :
- Octet 0 (
0x8047) : version de la configuration. - Octets 1–4 : résolution X et Y (voir étape 4).
- Octet 5 (
0x804C) : nombre maximal de points de contact, 4 bits de poids faible. - Octet 6 (
0x804D) : type de déclenchement de l'interruption, 2 bits de poids faible. - Octet 184 (
0x80FF) : checksum, complément à deux sur 8 bits de la somme des octets 0 à 183. - Octet 185 (
0x8100) :config_fresh, qui doit valoir1.
Le pilote Linux lui-même n'écrit une configuration que s'il dispose à la fois des GPIO INT et RST et trouve un fichier firmware (nom par défaut goodix_911_cfg.bin, ou le nom indiqué dans une propriété goodix,config-name). Sans ce fichier, il utilise la configuration déjà stockée dans la puce.
Avant d'écrire quoi que ce soit, lisez les 186 octets et sauvegardez-les. Corrigez la résolution et l'orientation par logiciel quand c'est possible. Un bloc de configuration conçu pour un autre panneau tactile peut désactiver le tactile sur le vôtre : procurez-vous donc le fichier auprès du fournisseur du panneau si vous devez vraiment le modifier.
Choisir un module tactile capacitif
Si vous choisissez un écran CTP pour une nouvelle conception, posez trois questions au fournisseur avant de commander des échantillons : quel contrôleur tactile il utilise, à quelle adresse I2C il est livré, et si INT et RST sont raccordées au connecteur. Envoyez-nous votre taille, votre interface et votre processeur hôte via Ask an Engineer, et nous joindrons ces trois réponses aux modules que nous vous suggérons.
Questions fréquentes
Quelle est l'adresse I2C du GT911 ?
Soit 0x5D, soit 0x14 (sur 7 bits). Le contrôleur échantillonne sa broche INT au relâchement du reset : INT à l'état bas sélectionne 0x5D, INT à l'état haut sélectionne 0x14. Les datasheets qui indiquent 0xBA/0xBB ou 0x28/0x29 donnent les mêmes adresses sous forme d'octets d'écriture/lecture sur 8 bits.
Pourquoi mon GT911 change-t-il d'adresse après un redémarrage ?
INT est flottante ou pilotée par autre chose au relâchement du reset, si bien que le contrôleur échantillone un niveau différent à chaque fois. Imposez INT à l'état bas (pour 0x5D) ou haut (pour 0x14) avant de relâcher RST, attendez plus de 5 ms, maintenez INT à l'état bas pendant 50 ms, puis repassez la broche en entrée. Si l'hôte ne peut pas piloter INT, scrutez les deux adresses.
Pourquoi n'obtiens-je qu'un seul toucher du GT911 ?
Après la lecture des données tactiles à 0x814E, écrivez 0 en 0x814E. Le driver goodix Linux et l'esp_lcd_touch_gt911 d'Espressif le font après chaque lecture ; un driver qui l'omet cesse généralement de détecter les nouveaux contacts.
Pourquoi les coordonnées tactiles du GT911 sont-elles mises à l'échelle ou décalées ?
Le GT911 rapporte les coordonnées dans la résolution stockée dans sa propre configuration (X en 0x8048, Y en 0x804A). Si elle diffère de celle de votre panneau, mettez les valeurs à l'échelle ou réglez x_max/y_max de votre driver sur la résolution du contrôleur, puis utilisez swap_xy et mirror_x/mirror_y pour l'orientation.
Le GT911 fonctionne-t-il sans la broche INT ?
Oui. Interrogez le registre d'état 0x814E au lieu d'utiliser une interruption. ESPHome interroge toutes les 50 ms par défaut quand aucun interrupt_pin n'est défini. Sans INT, l'hôte ne peut pas non plus choisir l'adresse : utilisez celle des deux adresses, 0x5D ou 0x14, qui répond.
Dois-je réécrire la configuration du GT911 ?
Uniquement en dernier recours. Lisez et sauvegardez d'abord le bloc existant de 186 octets à partir de 0x8047, privilégiez la correction de la résolution et de l'orientation par logiciel, et utilisez le fichier de configuration du fournisseur du panneau tactile si vous devez absolument en écrire un. Le bloc se termine par une somme de contrôle 8 bits en 0x80FF et un octet config_fresh en 0x8100 qui doit valoir 1.
Sources
- Noyau Linux : drivers/input/touchscreen/goodix.c
- Noyau Linux : drivers/input/touchscreen/goodix.h (adresses des registres)
- Noyau Linux : binding device-tree du tactile Goodix (goodix.yaml)
- Espressif ESP-BSP : code source du driver esp_lcd_touch_gt911
- Espressif ESP-BSP : en-tête esp_lcd_touch_gt911 (adresses I2C)
- ESPHome : écran tactile GT911
- ESPHome : composants écran tactile (transform, calibration)