Начните отсюда: найдите симптом
Симптом | Наиболее вероятная причина | Перейти к |
|---|---|---|
По адресу 0x5D или 0x14 при сканировании шины I2C ничего не отвечает | Нет питания на контроллере, отсутствуют подтягивающие резисторы или чип удерживается в сбросе | Шаг 1 |
Обнаружен по адресу 0x14, тогда как драйвер ожидает 0x5D (или наоборот), либо адрес меняется между перезагрузками | Уровень на выводе INT во время сброса | Шаг 2 |
Контроллер определяется, product ID читается корректно, но касания не приходят | Регистр состояния не сброшен, неверный фронт прерывания или вывод INT не подключён | Шаг 3 |
Касания приходят, но попадают не туда — зеркально или с поворотом | Разрешение в конфигурации GT911 не соответствует панели или требуется перестановка осей | Шаг 4 |
Собираетесь записать новый блок конфигурации | Сначала прочтите это | Шаг 5 |
Пройдите шаги по порядку. Указанные ниже адреса регистров и тайминги взяты из драйвера goodix ядра Linux, компонента esp_lcd_touch_gt911 от Espressif и документации ESPHome; ссылки приведены в разделе «Источники».
1. Убедитесь, что GT911 запитан и отвечает по шине I2C
Питание и подтягивающие резисторы
Привязка device tree в Linux для контроллеров Goodix указывает две линии питания: AVDD28 (аналоговая) и VDDIO (питание цифровой логики). На модуле или шлейфе FPC обе обычно подводятся от разъёма хоста, поэтому измерьте их прямо на разъёме, прежде чем подозревать прошивку. Линиям SDA и SCL также нужны подтягивающие резисторы где-то на шине; во многих дисплейных модулях их нет.
Сканируйте шину
Запустите скетч-сканер I2C или утилиту i2cdetect. GT911 отвечает по одному из двух 7-битных адресов:
7-битный адрес | 8-битные байты записи / чтения (как указано в некоторых даташитах) |
|---|---|
| |
| |
8-битные пары взяты из комментария в коде сброса драйвера Linux. Если в спецификации производителя указано «адрес 0xBA», это то же устройство, что и 7-битный 0x5D; в Arduino, ESP-IDF и Linux указывайте 0x5D.
Считайте product ID
Регистры GT911 имеют 16-битные адреса. Драйвер Linux считывает 6 байтов из 0x8140: первые 4 байта — это product ID в виде ASCII-текста, последние 2 — версия прошивки (little-endian). GT911 возвращает строку 911. Если вы получили 911, шина, питание и адрес в порядке, а проблема — дальше по этому списку.
Если по обоим адресам ничего не отвечает, проверьте, не удерживается ли линия сброса в низком уровне. Во многих модулях RST — это вход GT911, и хост должен подать на него высокий уровень (или он должен быть подтянут на плате), прежде чем контроллер заработает.
2. Правильно выполните последовательность сброса и выбора адреса
GT911 выбирает адрес I2C по уровню на выводе INT в момент снятия сброса. По словам привязки device tree в Linux, линия INT «опрашивается устройством при снятии сброса для выбора адреса I2C-клиента».
Уровень INT при переходе RST в высокий уровень | Адрес I2C |
|---|---|
Низкий уровень | |
Высокий уровень | |
Последовательность, которую использует драйвер Linux
- Установите низкий уровень на RST и выждите более 10 мс (драйвер ждёт 20 мс).
- Подайте на INT уровень, соответствующий нужному адресу: высокий для
0x14, низкий для0x5D. - Подождите более 100 мкс.
- Установите высокий уровень на RST и выждите более 5 мс (драйвер ждёт 6–10 мс).
- Удерживайте низкий уровень на INT в течение 50 мс, затем переведите INT в режим входа.
Если на шаге 4 INT «висит в воздухе», адрес может отличаться от одного включения к другому. Это классическое сообщение в духе «после прошивки работает, после холодного старта — нет».
ESP-IDF: esp_lcd_touch_gt911
Компонент Espressif определяет ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS как 0x5D, а ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS_BACKUP — как 0x14. Последовательность выбора адреса выполняется только при выполнении всех трёх условий:
rst_gpio_num— реальный GPIO (неGPIO_NUM_NC),int_gpio_num— реальный GPIO,driver_dataуказывает на структуруesp_lcd_touch_io_gt911_config_t, у которойdev_addrравен нужному адресу.
В противном случае в лог выводится I2C address initialization procedure skipped - using default GT9xx setup и выполняется обычный сброс. В этом случае адрес определяется разводкой платы, и адрес I2C panel-IO, который вы передаёте, должен совпадать с результатом сканирования. Частота I2C по умолчанию в ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG() этого компонента — 100 kHz.
Платы, где хост не управляет линией INT
Если INT не подключён к хосту, хост не может выбрать адрес, поэтому опросите оба адреса и используйте тот, который отвечает. Например, на плате Sunton ESP32-8048S043C прерывание GT911 по умолчанию не подключено к GPIO (см. страницу платы на нашем сайте). На странице GT911 в документации ESPHome отмечено, что когда INT идёт через IO-расширитель, вывод по-прежнему используется для задания адреса при загрузке, но данные касания опрашиваются, а не поступают по прерыванию.
3. Контроллер обнаружен, но события касания отсутствуют
Чтение и сброс регистра состояния
Данные касания начинаются с регистра 0x814E. Первый байт — байт состояния:
- Бит 7 (
0x80): буфер готов. Новые данные действительны только когда этот бит установлен. - Биты 0–3: число точек касания. Драйвер Linux отбрасывает значения, превышающие настроенный максимум.
- Бит 4: нажата клавиша (кнопка).
Каждая следующая точка касания занимает 8 байт: track ID, затем X, Y и размер как 16-битные значения в формате little-endian.
После чтения и драйвер Linux, и esp_lcd_touch_gt911 записывают 0 в 0x814E. Если вы пишете собственный драйвер, делайте то же самое; пропуск этой записи — распространённая причина того, что самописный драйвер видит только первое касание.
Согласуйте фронт прерывания
Тип срабатывания задаётся в собственной конфигурации GT911: биты 0–1 байта конфигурации по адресу 0x804D (смещение 6 от начала конфигурации по адресу 0x8047). Драйвер Linux интерпретирует его так:
Значение | Тип прерывания |
|---|---|
0 | Передний фронт |
1 | Задний фронт |
2 | Низкий уровень |
3 | Высокий уровень |
Настройте прерывание GPIO соответствующим образом. В esp_lcd_touch_gt911 значение levels.interrupt = 1 выбирает прерывание по нарастающему фронту, а 0 — по спаду.
Нет линии INT? Опрашивайте
Для HMI опрос вполне подходит. ESPHome по умолчанию опрашивает каждые 50 мс (update_interval), если interrupt_pin не задан. Драйвер Linux, когда прерывание всё же есть, ждёт бит готовности до 20 мс, прежде чем отказаться от очередного кадра.
4. Касание регистрируется не в том месте
Проверьте разрешение, записанное в GT911
GT911 передаёт координаты в разрешении, записанном в его конфигурации, а не в разрешении вашего дисплея. Согласно драйверу Linux, максимум по X — это 16-битное значение в порядке little-endian по адресу 0x8048, максимум по Y — по адресу 0x804A. Считайте их. Если контроллер настроен на 1024×600, а ваша панель — 800×480, точки касания смещаются вправо и вниз от пальца, а дальние края уходят за экран. Решение — масштабировать координаты (или задать драйверу пределы, соответствующие значениям контроллера).
Откуда каждый стек берёт пределы:
Стек | Источник разрешения | Перестановка и зеркалирование |
|---|---|---|
Linux | Читается из конфигурации GT911; если её там нет, используется 4095 × 4095 | Свойства device-tree |
ESP-IDF | Ваши | |
ESPHome | | |
Калибруйте по сырым значениям
На странице тачскрина ESPHome предлагается логировать touch.x_raw и touch.y_raw в лямбде on_touch, несколько раз коснуться углов у крайних пикселей и ввести минимальные и максимальные сырые значения в качестве калибровки. Тот же метод работает на любой платформе: выводите сырые X и Y, касайтесь четырёх углов и отображайте полученный диапазон на экран.
Ориентацию исправляйте в таком порядке: сначала добейтесь, чтобы X и Y оказались на нужных осях (swap_xy), затем отзеркальте ту ось, которая направлена в обратную сторону (mirror_x / mirror_y). Логическая точка (0, 0) дисплея должна находиться в левом верхнем углу.
5. Перезапись конфигурации GT911: крайняя мера
Блок конфигурации начинается с адреса 0x8047. Для GT911 драйвер Linux считает его длиной 186 байтов:
- Байт 0 (
0x8047): версия конфигурации. - Байты 1–4: разрешение по X и Y (см. шаг 4).
- Байт 5 (
0x804C): максимальное число точек касания, младшие 4 бита. - Байт 6 (
0x804D): тип срабатывания прерывания, младшие 2 бита. - Байт 184 (
0x80FF): контрольная сумма — дополнительный код до двух 8-битной суммы байтов 0–183. - Байт 185 (
0x8100):config_fresh, должно быть равно1.
Сам драйвер Linux записывает конфигурацию только тогда, когда у него есть оба GPIO — INT и RST — и найден файл прошивки (имя по умолчанию goodix_911_cfg.bin либо имя из свойства goodix,config-name). Без этого файла используется конфигурация, уже записанная в чипе.
Прежде чем что-либо записывать, прочитайте все 186 байтов и сохраните их. Разрешение и ориентацию исправляйте программно, где это возможно. Блок конфигурации, подготовленный для другой сенсорной панели, может полностью отключить тач на вашей, поэтому если файл действительно нужно менять, получите его у поставщика панели.
Выбор модуля с ёмкостным тачем
Если вы подбираете CTP-дисплей для нового проекта, задайте поставщику три вопроса до заказа образцов: какой в нём контроллер тача, с каким I2C-адресом он поставляется и выведены ли INT и RST на разъём. Пришлите ваши размеры, интерфейс и хост-процессор через форму Ask an Engineer — и мы приложим ответы на эти три вопроса к рекомендуемым модулям.
Частые вопросы
Какой I2C-адрес у GT911?
0x5D или 0x14 (7-битные). Контроллер опрашивает вывод INT в момент снятия сброса: низкий уровень на INT выбирает 0x5D, высокий — 0x14. Адреса 0xBA/0xBB или 0x28/0x29 в даташитах — это те же адреса в виде 8-битных байтов записи/чтения.
Почему GT911 меняет адрес после перезагрузки?
Вывод INT находится в плавающем состоянии или управляется чем-то другим в момент снятия сброса, поэтому контроллер каждый раз фиксирует разный уровень. Установите INT в низкий уровень (для 0x5D) или в высокий (для 0x14) перед снятием RST, подождите более 5 мс, удерживайте INT низким 50 мс, затем переведите вывод в режим входа. Если хост не может управлять INT, опрашивайте оба адреса.
Почему GT911 распознаёт только одно касание?
После чтения данных касания по адресу 0x814E запишите 0 в 0x814E. Драйвер goodix в Linux и esp_lcd_touch_gt911 от Espressif делают это после каждого чтения; драйвер, который этого не делает, обычно перестаёт видеть новые касания.
Почему координаты касаний GT911 масштабируются или смещаются?
GT911 выдаёт координаты в разрешении, записанном в его собственной конфигурации (X — 0x8048, Y — 0x804A). Если оно отличается от разрешения вашей панели, масштабируйте значения либо задайте в драйвере x_max/y_max равными разрешению контроллера, а для ориентации используйте swap_xy и mirror_x/mirror_y.
Работает ли GT911 без вывода INT?
Да. Опрашивайте регистр состояния 0x814E вместо использования прерывания. ESPHome по умолчанию опрашивает каждые 50 мс, если interrupt_pin не задан. Без INT хост также не может выбрать адрес, поэтому используйте тот из адресов 0x5D или 0x14, который отвечает.
Стоит ли перезаписывать конфигурацию GT911?
Только как последнее средство. Сначала прочитайте и сохраните существующий блок из 186 байт начиная с 0x8047; по возможности исправляйте разрешение и ориентацию программно, а если без записи не обойтись — используйте конфигурационный файл поставщика тачскрина. Блок завершается 8-битной контрольной суммой по адресу 0x80FF и байтом config_fresh по адресу 0x8100, который должен быть равен 1.
Источники
- Ядро Linux: drivers/input/touchscreen/goodix.c
- Ядро Linux: drivers/input/touchscreen/goodix.h (адреса регистров)
- Ядро Linux: привязка device-tree для тачскринов Goodix (goodix.yaml)
- Espressif ESP-BSP: исходный код драйвера esp_lcd_touch_gt911
- Espressif ESP-BSP: заголовочный файл esp_lcd_touch_gt911 (адреса I2C)
- ESPHome: компонент тачскрина GT911
- ESPHome: компоненты тачскринов (transform, calibration)