Перейти к содержанию

Почему на дисплее 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. Поэтому результат может отличаться в зависимости от того, как перезапускали модуль, — команды настройки отправляют при каждой инициализации.

Источники

  1. 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
  2. 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

Нашли ошибку?