Langsung ke konten
Display Engineer
Troubleshooting

Touch GT911 Tidak Berfungsi? Perbaikan Alamat I2C, Timing Reset, Config, dan Koordinat

Checklist langkah demi langkah untuk controller touch kapasitif GT911 yang tidak terdeteksi, tidak menghasilkan sentuhan, atau melaporkan koordinat yang salah: daya dan scan I2C, urutan pemilihan alamat INT/RST, register status 0x814E, tepi interrupt, resolusi, dan perbaikan sumbu untuk Linux, ESP-IDF, dan ESPHome.

DEDisplay Engineer Applications Team · Display application engineerDiperbarui 19 Okt 2026

Mulai dari sini: cocokkan gejalanya

Gejala

Kemungkinan penyebab utama

Buka di

Tidak ada apa pun di 0x5D atau 0x14 pada scan I2C

Controller tidak mendapat daya, pull-up tidak ada, atau chip tertahan dalam kondisi reset

Langkah 1

Terdeteksi di 0x14 padahal driver mengharapkan 0x5D (atau sebaliknya), atau alamatnya berubah antar booting

Level pin INT saat reset

Langkah 2

Terdeteksi, product ID terbaca dengan benar, tetapi tidak ada sentuhan yang masuk

Register status tidak di-clear, tepi interrupt salah, atau INT tidak terhubung

Langkah 3

Sentuhan masuk tetapi berada di posisi yang salah, tercerminkan atau terotasi

Resolusi di config GT911 tidak sesuai dengan panel, atau sumbunya perlu ditukar

Langkah 4

Tergoda untuk menulis blok config baru

Baca ini dulu

Langkah 5

Kerjakan langkah-langkahnya secara berurutan. Alamat register dan timing di bawah ini bersumber dari driver goodix Linux, komponen esp_lcd_touch_gt911 dari Espressif, dan dokumentasi ESPHome; tautannya ada di bagian Sources.

1. Pastikan GT911 mendapat daya dan merespons di I2C

Daya dan pull-up

Device-tree binding Linux untuk controller Goodix menyebutkan dua supply: AVDD28 (analog) dan VDDIO (rail I/O logika). Pada modul atau FPC, keduanya biasanya disuplai dari konektor host, jadi ukur terlebih dahulu di konektor sebelum mencurigai firmware. SDA dan SCL juga membutuhkan resistor pull-up di suatu tempat pada bus; banyak modul display tidak menyertakannya.

Scan bus

Jalankan sketch I2C scanner atau i2cdetect. GT911 merespons pada salah satu dari dua alamat 7-bit berikut:

Alamat 7-bit

Byte write / read 8-bit (seperti yang tercantum di sebagian datasheet)

0x5D

0xBA / 0xBB

0x14

0x28 / 0x29

Pasangan 8-bit berasal dari sebuah komentar di kode reset driver Linux. Jika lembar data vendor menyebut "alamat 0xBA", itu adalah perangkat yang sama dengan 0x5D 7-bit; masukkan 0x5D di Arduino, ESP-IDF, dan Linux.

Baca product ID

Register pada GT911 menggunakan alamat 16-bit. Driver Linux membaca 6 byte dari 0x8140: 4 byte pertama adalah product ID dalam teks ASCII dan 2 byte terakhir adalah versi firmware (little-endian). GT911 melaporkan string 911. Jika Anda mendapatkan 911, berarti bus, daya, dan alamat semuanya baik, dan masalahnya ada lebih jauh di daftar ini.

Jika tidak ada yang merespons di kedua alamat, periksa apakah jalur reset tidak ditahan low. Pada banyak modul, RST adalah input bagi GT911 dan harus didorong high oleh host (atau di-pull-up di board) sebelum controller dapat berjalan.

2. Pastikan urutan reset dan pemilihan alamat benar

GT911 memilih alamat I2C-nya berdasarkan level pada pin INT pada saat reset dilepaskan. Dengan kata-kata binding Linux, jalur INT "disampling oleh perangkat saat reset dilepaskan untuk memilih alamat klien I2C".

Level INT saat RST menjadi high

Alamat I2C

Rendah

0x5D

Tinggi

0x14

Urutan yang digunakan driver Linux

  1. Turunkan RST ke low dan tunggu lebih dari 10 ms (driver menunggu 20 ms).
  2. Bawa INT ke level untuk alamat yang Anda inginkan: high untuk 0x14, low untuk 0x5D.
  3. Tunggu lebih dari 100 µs.
  4. Bawa RST ke high dan tunggu lebih dari 5 ms (driver menunggu 6–10 ms).
  5. Bawa INT ke low selama 50 ms, lalu ubah INT menjadi input.

Jika INT melayang (floating) selama langkah 4, alamatnya bisa berbeda antara satu penyalaan daya dengan yang berikutnya. Itulah laporan klasik "berhasil setelah flashing, gagal setelah cold boot".

ESP-IDF: esp_lcd_touch_gt911

Komponen dari Espressif mendefinisikan ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS sebagai 0x5D dan ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS_BACKUP sebagai 0x14. Komponen ini hanya menjalankan urutan pemilihan alamat jika ketiga hal berikut terpenuhi:

  • rst_gpio_num adalah GPIO sungguhan (bukan GPIO_NUM_NC),
  • int_gpio_num adalah GPIO sungguhan,
  • driver_data menunjuk ke sebuah esp_lcd_touch_io_gt911_config_t yang dev_addr-nya adalah alamat yang Anda inginkan.

Jika tidak, ia mencatat log I2C address initialization procedure skipped - using default GT9xx setup dan hanya melakukan reset biasa. Dalam kasus tersebut, alamatnya ditentukan oleh pengkabelan papan, dan alamat I2C panel-IO yang Anda berikan harus cocok dengan hasil pemindaian. Clock I2C bawaan komponen ini di ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG() adalah 100 kHz.

Papan-papan di mana host tidak mengendalikan INT

Jika INT tidak terhubung ke host, host tidak dapat memilih alamat, jadi pindai kedua alamat dan gunakan yang merespons. Sebagai contoh, pada Sunton ESP32-8048S043C, interrupt GT911 secara bawaan tidak disambungkan ke GPIO mana pun (lihat halaman papan kami). Halaman GT911 milik ESPHome mencatat bahwa ketika INT melewati IO expander, pin tersebut tetap digunakan untuk mengatur alamat saat boot, tetapi sentuhan dibaca dengan polling alih-alih berbasis interrupt.

3. Terdeteksi, tetapi tidak ada event sentuhan

Baca dan bersihkan register status

Data sentuhan dimulai pada 0x814E. Byte pertama adalah byte status:

  • Bit 7 (0x80): buffer siap. Data baru hanya valid ketika bit ini ter-set.
  • Bit 0–3: jumlah titik sentuhan. Driver Linux menolak jumlah yang melebihi maksimum yang dikonfigurasi.
  • Bit 4: sebuah tombol (key) ditekan.

Setiap titik sentuhan berikutnya berukuran 8 byte: sebuah track ID, lalu X, Y, dan ukuran sebagai nilai 16-bit little-endian.

Setelah membaca, baik driver Linux maupun esp_lcd_touch_gt911 menulis 0 ke 0x814E. Jika Anda menulis driver sendiri, lakukan hal yang sama; melewatkan penulisan tersebut adalah penyebab umum driver buatan tangan hanya melihat sentuhan pertama.

Sesuaikan tepi interrupt

Jenis trigger berada di konfigurasi milik GT911 sendiri: bit 0–1 dari byte konfigurasi di 0x804D (offset 6 dari awal konfigurasi di 0x8047). Driver Linux memetakannya seperti ini:

Nilai

Jenis interrupt

0

Tepi naik (rising edge)

1

Tepi turun (falling edge)

2

Level rendah

3

Level tinggi

Atur interupsi GPIO Anda agar sesuai. Pada esp_lcd_touch_gt911, levels.interrupt = 1 memilih interupsi tepi naik dan 0 tepi turun.

Tidak ada jalur INT? Gunakan polling

Polling bekerja dengan baik untuk keperluan HMI. ESPHome melakukan polling setiap 50 ms secara default (update_interval) ketika interrupt_pin tidak diatur. Driver Linux, ketika memiliki interupsi, menunggu hingga 20 ms untuk bit ready sebelum menyerah pada satu frame.

4. Sentuhan muncul di posisi yang salah

Periksa resolusi yang tersimpan di GT911

GT911 melaporkan koordinat dalam resolusi yang tertulis di konfigurasinya, bukan resolusi display Anda. Menurut driver Linux, X maksimum adalah nilai 16-bit little-endian di 0x8048 dan Y maksimum di 0x804A. Baca nilainya. Jika controller dikonfigurasi untuk 1024×600 sedangkan panel Anda 800×480, sentuhan akan muncul di kanan dan di bawah jari Anda serta tepi terjauhnya keluar dari layar. Solusinya adalah melakukan penskalaan (atau mengatur batas driver sesuai nilai controller).

Sumber batas tiap stack:

Stack

Sumber resolusi

Swap dan mirror

Linux goodix

Dibaca dari konfigurasi GT911; kembali ke 4095 × 4095 jika konfigurasi tidak memilikinya

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

ESP-IDF esp_lcd_touch_gt911

x_max / y_max Anda di esp_lcd_touch_config_t (driver tidak membaca resolusi chip)

flags.swap_xy, flags.mirror_x, flags.mirror_y

ESPHome gt911

calibration layar sentuh (x_min, x_max, y_min, y_max)

transform: swap_xy / mirror_x / mirror_y

Kalibrasi dari nilai mentah

Halaman touchscreen ESPHome menyarankan mencatat touch.x_raw dan touch.y_raw dalam lambda on_touch, menyentuh sudut-sudut di piksel tepi beberapa kali, lalu memasukkan nilai mentah minimum dan maksimum sebagai kalibrasi. Metode yang sama berlaku di platform mana pun: cetak X dan Y mentah, sentuh keempat sudut, lalu petakan rentangnya ke layar.

Perbaiki orientasi dengan urutan ini: pertama pastikan X dan Y berada pada sumbu yang benar (swap_xy), lalu balik sumbu yang berjalan terbalik (mirror_x / mirror_y). Titik (0, 0) logis display harus berada di kiri atas.

5. Menulis ulang konfigurasi GT911: jalan terakhir

Blok konfigurasi dimulai pada 0x8047. Untuk GT911, driver Linux menganggapnya sebesar 186 byte:

  • Byte 0 (0x8047): versi konfigurasi.
  • Byte 1–4: resolusi X dan Y (lihat langkah 4).
  • Byte 5 (0x804C): jumlah titik sentuh maksimum, 4 bit rendah.
  • Byte 6 (0x804D): jenis pemicu interupsi, 2 bit rendah.
  • Byte 184 (0x80FF): checksum, komplemen dua 8-bit dari jumlah byte 0–183.
  • Byte 185 (0x8100): config_fresh, yang harus bernilai 1.

Driver Linux sendiri hanya menulis konfigurasi jika ia memiliki GPIO INT dan RST sekaligus serta menemukan file firmware (nama default goodix_911_cfg.bin, atau nama pada properti goodix,config-name). Tanpa file tersebut, ia menggunakan konfigurasi yang sudah tersimpan di chip.

Sebelum menulis apa pun, baca seluruh 186 byte dan simpan. Perbaiki resolusi dan orientasi di perangkat lunak bila memungkinkan. Blok konfigurasi yang dibuat untuk panel sentuh lain dapat membuat sentuhan di panel Anda berhenti bekerja, jadi dapatkan file dari pemasok panel jika Anda benar-benar perlu mengubahnya.

Memilih modul capacitive-touch

Jika Anda memilih display CTP untuk desain baru, tanyakan tiga hal kepada pemasok sebelum memesan sampel: controller sentuh apa yang digunakan, alamat I2C berapa saat dikirim, dan apakah INT dan RST tersambung ke konektor. Kirimkan ukuran, antarmuka, dan prosesor host Anda melalui Ask an Engineer, dan kami akan menyertakan ketiga jawaban tersebut pada modul yang kami sarankan.

Pertanyaan yang sering diajukan

Berapa alamat I2C GT911?

Baik 0x5D maupun 0x14 (7-bit). Controller melakukan sampling pada pin INT-nya saat reset dilepaskan: INT low memilih 0x5D, INT high memilih 0x14. Datasheet yang mencantumkan 0xBA/0xBB atau 0x28/0x29 sebenarnya memberikan alamat yang sama dalam bentuk byte write/read 8-bit.

Mengapa alamat GT911 saya berubah setelah reboot?

INT mengambang (floating) atau digerakkan oleh sesuatu yang lain saat reset dilepaskan, sehingga controller membaca level yang berbeda setiap kali. Tarik INT ke low (untuk 0x5D) atau high (untuk 0x14) sebelum melepas RST, tunggu lebih dari 5 ms, tahan INT low selama 50 ms, lalu jadikan sebagai input. Jika host tidak dapat mengontrol INT, lakukan scan pada kedua alamat.

Mengapa saya hanya mendapatkan satu sentuhan dari GT911?

Setelah membaca data sentuhan di 0x814E, tulis 0 ke 0x814E. Driver goodix di Linux dan esp_lcd_touch_gt911 milik Espressif keduanya melakukan ini setelah setiap pembacaan; driver yang melewatkannya biasanya berhenti mendeteksi sentuhan baru.

Mengapa koordinat sentuh GT911 ter-skala atau bergeser?

GT911 melaporkan koordinat sesuai resolusi yang tersimpan di config-nya sendiri (X di 0x8048, Y di 0x804A). Jika nilai tersebut berbeda dengan panel Anda, lakukan scaling pada nilai-nilainya atau set x_max/y_max driver Anda sesuai resolusi controller, lalu gunakan swap_xy dan mirror_x/mirror_y untuk orientasinya.

Apakah GT911 berfungsi tanpa pin INT?

Ya. Lakukan polling pada register status 0x814E alih-alih menggunakan interrupt. ESPHome melakukan polling setiap 50 ms secara default ketika interrupt_pin tidak diatur. Tanpa INT, host juga tidak dapat memilih alamat, jadi gunakan salah satu dari 0x5D atau 0x14 yang merespons.

Apakah saya perlu menulis ulang konfigurasi GT911?

Hanya sebagai pilihan terakhir. Baca dan simpan dulu blok 186 byte yang ada dari 0x8047, utamakan perbaikan resolusi dan orientasi melalui software, dan gunakan file config dari pemasok touch panel jika Anda harus menulis satu. Blok tersebut diakhiri dengan checksum 8-bit di 0x80FF dan byte config_fresh di 0x8100 yang harus bernilai 1.

Sumber

  1. Kernel Linux: drivers/input/touchscreen/goodix.c
  2. Kernel Linux: drivers/input/touchscreen/goodix.h (alamat register)
  3. Kernel Linux: device-tree binding touchscreen Goodix (goodix.yaml)
  4. Espressif ESP-BSP: source code driver esp_lcd_touch_gt911
  5. Espressif ESP-BSP: header esp_lcd_touch_gt911 (alamat I2C)
  6. ESPHome: touchscreen GT911
  7. ESPHome: komponen Touchscreen (transform, calibration)

Belum yakin display mana yang cocok untuk desain Anda?

Kirimkan ukuran, antarmuka, dan prosesor host Anda. Display engineer akan membalas dalam 12 jam dengan 2–3 opsi, datasheet, dan kode inisialisasi. Sampel mulai 1 pcs.