Почему на дисплее ST7789 неправильные цвета?
Обновлено Редакция GAW
Контроллеры Sitronix ST7789 и ST7735 управляют самыми распространёнными маленькими TFT-дисплеями. Модулей с одним контроллером много, а панели у них разные, поэтому код инициализации, взятый для «такого же» дисплея, нередко даёт негатив или переставленные цвета. Сами контроллеры описаны на странице «TFT на ST7735 и ST7789».
Что за что отвечает
| Симптом | Причина | Команда |
|---|---|---|
| Негатив: белый фон чёрный, цвета дополнительные | режим инверсии не подходит панели | INVON (21h) или INVOFF (20h) |
| Красный и синий поменялись | порядок субпикселей | MADCTL (36h), бит D3: 0 — RGB, 1 — BGR |
| Цветной шум, искажённые цвета | формат пикселя не совпадает с данными | COLMOD (3Ah) = 55h для RGB565 (в разд. 8.8 — 05h) |
| Изображение повёрнуто или отражено | порядок обхода памяти | MADCTL, биты MY, MX, MV |
После включения питания у ST7789V инверсия выключена, MADCTL = 00h, а формат — 18 бит на пиксель. Если программа шлёт 16-битные пиксели RGB565, без команды COLMOD данные будут разобраны неверно. Примечание к описанию COLMOD в даташите велит ставить 55h при записи 16-битных пикселей (младшая тетрада 101 — 16 бит для MCU-интерфейса, старшая — 65K для RGB-интерфейса), а разделы 8.8 с форматами записи приводят 05h; для чтения памяти даташит требует 66h. Что такое RGB565 и как упаковывается цвет, описано в термине «Формат пикселя».
// ST7789 init fragment (ST7789V datasheet, 9.1.16, 9.1.28, 9.1.32)
st7789_cmd(0x3A); st7789_data(0x55); // COLMOD: 16 bit per pixel, RGB565 (note 2 of 9.1.32; 0x05 in 8.8)
st7789_cmd(0x36); st7789_data(0x00); // MADCTL: RGB order, no rotation; 0x08 = BGR
st7789_cmd(0x21); // INVON: panel-dependent, send 0x20 instead if the image is negative
Как проверять
Залейте экран чистыми цветами по очереди — белым, красным, зелёным, синим. Белый стал чёрным — меняйте команду инверсии; красный показан синим — меняйте бит D3 в MADCTL; цвета «рассыпаются» — проверьте COLMOD и порядок байтов в буфере. Почему вообще один дисплей продают с разными контроллерами и панелями, рассказано в термине «Контроллер дисплея». Похожие команды MADCTL и COLMOD есть у ILI9341, а сравнение всех дисплеев — в разделе «Дисплеи».
Похожие вопросы
Почему одна и та же программа даёт правильные цвета на одном модуле и негатив на другом?
Потому что модули с одним контроллером делают на разных панелях, и нужный режим инверсии зависит от панели (наш вывод из того, что команда одна, а результат разный). По даташиту контроллер после сброса работает с выключенной инверсией, поэтому для части модулей в инициализацию добавляют INVON.
Влияет ли MADCTL на поворот изображения?
Да: биты MY, MX и MV того же регистра задают порядок обхода памяти и поворот, поэтому при смене ориентации легко случайно сбросить и бит RGB. Записывайте MADCTL целиком, с нужными битами поворота и цвета одновременно.
Почему после программного сброса цвета не изменились?
По даташиту ST7789V программный сброс не меняет MADCTL, а после включения питания и аппаратного сброса регистр равен 00h. Поэтому результат может отличаться в зависимости от того, как перезапускали модуль, — команды настройки отправляют при каждой инициализации.
Источники
- Sitronix. ST7789V 240RGB x 320 dot 262K Color with Frame Memory Single-Chip TFT Controller/Driver, Version 1.3, 2014-03 — разд. 9.1.15: INVOFF (20h) — выход из режима инверсии, после включения питания, программного и аппаратного сброса инверсия выключена; разд. 9.1.16: INVON (21h) — инверсия изображения; разд. 9.1.28: MADCTL (36h) — D7 MY, D6 MX, D5 MV, D4 ML, D3 RGB (0 — RGB, 1 — BGR), D2 MH, после включения и аппаратного сброса 00h, программный сброс не меняет; разд. 9.1.32: COLMOD (3Ah) — 101 = 16 бит на пиксель (65K, RGB 5-6-5), после включения — 18 бит на пиксель; примечание 2: при записи 16-битных пикселей 3Ah устанавливают в 55h, а для чтения памяти — в 66h; разд. 8.8: форматы записи для 3Ah = 05h
- Sitronix. ST7735R 262K Color Single-Chip TFT Controller/Driver, V0.2, 2009-08-05 (копия Adafruit) — разд. 10.1.14 и 10.1.15: INVOFF (20h) и INVON (21h); разд. 10.1.27: MADCTL (36h), бит D3 RGB — 0 RGB, 1 BGR, биты MY, MX, MV, ML, MH; статус дисплея содержит бит INVON
Нашли ошибку?
Смотрите также
- TFT на ST7735 и ST7789Память и разрешения, SPI, цвет, поворот, смещение окна, инициализация
- Формат пикселяRGB444, RGB565, RGB666: биты на точку, команда 3Ah, размер кадра
- Контроллер и драйвер дисплеяМикросхема, которая хранит изображение и управляет строками и столбцами панели
- TFT на ILI9341Питание, SPI с D/CX, RGB565 и RGB666, окно записи, поворот, инициализация
- ЖК-дисплеиHD44780, KS0108, ST7920, TFT и OLED: типы модулей и выбор