Как инициализировать дисплей DT028ATFT

Я пытаюсь инициализировать дисплей DT028ATFT-TS на основной плате STM32F10B. Раньше система работала с DT028TFT-TS, но этот дисплей снят с производства. В результате использования нового дисплея интерфейс также должен был измениться с ILI9320 на ILI9341. Сейчас я в основном пытаюсь инициализировать новый дисплей в конфигурации, которая была бы эквивалентна той, что у меня была раньше.

Проблема, с которой я столкнулся, заключается в том, что изображение на дисплее в конечном итоге показывает горизонтальные полосы, распределенные случайным образом (немного разные при каждом запуске) с небольшим мерцанием. И иногда (не уверен, что это связано) он просто показывает подсветку и ничего больше - ни полос, ни тестового изображения. Тестовое изображение представляет собой один большой красный квадрат (100x100), отображаемый с координатами x=100, y=50. Вы можете увидеть последствия проблемы здесь: Изображение с полосами.

Ниже приведена часть кода инициализации, который я использовал — часть его взята как таковая из примера кода DisplayTech, предлагаемого на их веб-сайте, часть — изменена. Я исключил из примера кода команды, которые не задокументированы в ILI9341 (вероятно, настройка поставщика) и параметры гамма-коррекции, просто чтобы сэкономить место. Буду признателен за любую помощь в поиске того, где я ошибся.

// DT028ATFT LCD init - ILI9341:
// Frame Rate Control
SPI_WriteCMD(0xB1);
SPI_WriteDAT(0x00);     // division ratio: 1
SPI_WriteDAT(0x10);     // 16 clocks per line
// Power Control
SPI_WriteCMD(0xC0);
SPI_WriteDAT(0x25);     // GVDD = 4.70V
SPI_WriteCMD(0xC1);
SPI_WriteDAT(0x03);     // VCL=VCI x 2, VGH=VCI x 6, VGL=-VCI x 3
// VCOM Control
SPI_WriteCMD(0xC5);
SPI_WriteDAT(0x5C);     // VCOMH = 5.000 V
SPI_WriteDAT(0x4C);     // VCOML = -0.600 V
SPI_WriteCMD(0xC7);
SPI_WriteDAT(0x94);     // VCOMH = VMH - 44, VCOML = VML - 44
// Memory Access Control
SPI_WriteCMD(0x36);
SPI_WriteDAT(0x08);     // BGR=1, Normal addr order and refresh direction
// Write CTRL Display
SPI_WriteCMD(0x53);
SPI_WriteDAT(0x24);     // BCTRL=1, DD=0, BL=1
// Display Function Control
SPI_WriteCMD(0xB6);
SPI_WriteDAT(0x00);     // Normal scan, V63 pos pol / V0 neg pol
SPI_WriteDAT(0xA0);     // LCD normally white, G1 to G320, S720 to S1
SPI_WriteDAT(0x27);     // NL = 320
SPI_WriteDAT(0x00);     // PCDIV not used
// Entry Mode Set
SPI_WriteCMD(0xB7);
SPI_WriteDAT(0x06);     // Normal display for G1-G320 output, Low voltage detection enabled
// Column Address Set
SPI_WriteCMD(0x2A);
SPI_WriteDAT(0x00);
SPI_WriteDAT(0x00);     // Start Column = 0
SPI_WriteDAT(0x00);
SPI_WriteDAT(0xEF);     // End Column = 239
// Page Address Set
SPI_WriteCMD(0x2B);
SPI_WriteDAT(0x00);
SPI_WriteDAT(0x00);     // Start Page = 0
SPI_WriteDAT(0x01);
SPI_WriteDAT(0x3F);     // End Page = 319
// Gamma Set
SPI_WriteCMD(0x26);
SPI_WriteDAT(0x01);     // Gamma Curve 1 selected (G2.2)
// Pixel Format Set
SPI_WriteCMD(0x3A);
SPI_WriteDAT(0x55);     // 16bits/pixel (RGB and MCU i/f)
// Interface Control
SPI_WriteCMD(0xF6);
SPI_WriteDAT(0x00);     // image data not wrapped around (exceeding data ignored)
SPI_WriteDAT(0x00);     // MSB used also as LSB for R and B (64k colours)
SPI_WriteDAT(0x00);     // Disp Op Mode: internal clk, GRAM access: Sys I/F, 1 transf/pxl (16bit 64k colours)
// RGB Interface Signal Control
SPI_WriteCMD(0xB0);
SPI_WriteDAT(0xC0);     // BypassMode=1, RCM=2, VSPL=0, HSPL=0, DPL=0, EPL=0
// Sleep Mode off (DC/DC conv enabled, internal osc started)
SPI_WriteCMD(0x11);
Dly100us((void*)1200);
// Display ON
SPI_WriteCMD(0x29);
// ===============================

person Unstacked    schedule 11.12.2013    source источник


Ответы (1)


ваша проблема звучит как проблема времени. Вы пробовали уменьшить частоту кадров? это должно ослабить время отображения. вы устанавливаете его на 119 Гц.

Вы делаете правильный сброс перед инициализацией?

можно сравнить с другими реализациями для контроллера ILI9341:

person Manu3l0us    schedule 11.12.2013
comment
Делаю сброс раньше, да. Изменение частоты кадров (70 Гц) избавило от полос. Теперь все чисто. Спасибо! Я все еще иногда получаю пропадание изображения (просто остается подсветка), но это, вероятно, отдельная проблема. - person Unstacked; 12.12.2013
comment
Хорошо получилось. Что касается исчезающего изображения, я понятия не имею. Это может быть почти что угодно, включая HW. Если у вас есть второй дисплей, попробуйте воспроизвести, а также убедитесь, что ваша схема питания стабильна. - person Manu3l0us; 12.12.2013
comment
Получил исправление для исчезающего изображения - я подумал, что это может быть полезно другим, чтобы сделать это примечание. К сожалению, я не уверен, какие из изменений оказали наибольшее влияние, но вот они: 1. Добавлен SW Reset после сброса чипа, который у меня уже был. - person Unstacked; 13.12.2013
comment
Позвольте мне попробовать это снова :) Вот изменения: 1. Добавлен SW Reset после сброса чипа, который у меня уже был, с последующим отключением дисплея. 2. Использованы настройки гаммы из вашего примера ссылки. 3. Добавлена ​​задержка после включения дисплея и после заполнения бкг. 4. Замедление тактовой частоты SPI с 8 МГц до 4 МГц (я точно знаю, что это избавило меня от некоторых артефактов, которые я получал). Еще раз спасибо за вашу помощь, Manu3l0us. - person Unstacked; 14.12.2013
comment
Стоит упомянуть: когда я столкнулся с пустыми экранами, изменение бита GAS (команда установки режима входа) для отключения обнаружения низкого напряжения заменило событие пустого экрана событием поврежденного экрана (все еще близким к оригиналу). Это говорит о том, что дисплей намеренно обрезал изображение при обнаружении недопустимых напряжений (несколько раз переключал бит для подтверждения). VCC было 2,8 В, так что все было в порядке. Должно быть, это какие-то производные внутренние напряжения. Именно тогда я начал присматриваться к вашему примеру. Кстати, я также следил за порядком cmd - не уверен, что это имело значение. Ваше здоровье! - person Unstacked; 14.12.2013