Top.Mail.Ru
Уведомления
Очистить все

[Решено] Шумы на экране с драйвером ST7735

(@fon_syslik)
Level 1

Всем доброго времени суток
Подключаю дисплей с драйвером ST7735 к stm32. После инициализации с Adafruit дисплей не реагировал ни на что, у него оставалась ток подсветка, поэтому упростила ее до вида:

RST_0();
delay(10);
RST_1();
delay(10);
CS_1();
delay(5);
CS_0();
delay(1);
ST7789_WriteCommand(ST7735_SWRESET);
delay(125);
ST7789_WriteCommand (ST7735_SLPOUT);
delay(125);
ST7789_WriteCommand(ST7735_COLMOD); 
ST7789_WriteSmallData(0x55);
ST7789_WriteCommand(ST7735_ MADCTL); 
ST7789_WriteSmallData(0x00);    
ST7789_WriteCommand(0x21);
ST7789_WriteCommand (ST7789_DISPON); 
delay(10);
CS_1();

После такой инициализации на экранчике появляются шумы и я могу включать и выключать экран, что наводит на мысли, что spi настроен правильно(настраивала строго по даташиту(CPHA=1, CPOL=1). Где-то увидела, что нужно после аппаратного сброса дергать cheap select, иначе драйвер не реагирует. В общем, перепробовала всякое, но уперлась лбом в стенку.... Сейчас хочу просто залить экран цветом, но не могу это сделать. Вижу только шумы. Хотя устанавливаю адрес заливки, а потом и саму заливку по пикселям

uint16_t x_start = 0, x_end = SIZE_X;
uint16_t y_start = 0, y_end = SIZE_Y;

ST7789_WriteCommand(ST7789_CASET);
uint8_t data[] = {x_start >> 8, x_start & 0xFF, x_end >> 8, x_end & 0xFF};
ST7789_WriteData(data, 4);

ST7789_WriteCommand(ST7789_RASET);
uint8_t data[] = {y_start >> 8, y_start & 0xFF, y_end >> 8, y_end & 0xFF};
ST7789_WriteData(data, 4);

ST7789_WriteCommand(ST7789_RAMWR);

for (uint16_t i = x_start; i < x_end; i++)
    for (uint16_t j = y_start; j < y_end; j++) {
        uint8_t data[] = {color >> 8, color & 0xFF};
        ST7789_WriteData(data, sizeof(data));
    }

В общем, уже не знаю, в какую сторону можно думать. Первый раз работаю с такими вот экранчиками. Вот этот пример смотрела здесь и еще с других источников. Не видела, чтобы сталкивались с такой проблемой. У меня возникает ощущение, что я упускаю какую-то маленькую и важную деталь. 


Цитата
Создатель темы Размещено : 31.08.2025 03:38
Метки темы
(@eduard)
Level 5 Moderator

Если шумы появились, значит дисплей на команды реагирует.

А где полная инициализация дисплея?

Просто так он не заработает. В статье, на которую ссылаетесь, это всё описано.

Если при полной инициализации дальше шума дело не идёт, может не хватать питания.


ОтветитьЦитата
Размещено : 31.08.2025 21:16
(@fon_syslik)
Level 1

@eduard если брать полный код инициализации из статьи, на которую ссылалась выше, то дисплей вообще ни на что не реагирует. Я вижу только голую подсветку

RST_1();
delay(5);
RST_0();
delay(5);
RST_1();
delay(5);

CS_1();
delay(5);
CS_0();
delay(1);

ST7735_WriteCommand(ST7735_SWRESET);
delay(150);

ST7735_WriteCommand(ST7735_SLPOUT);
delay(500);

ST7735_WriteCommand(ST7735_FRMCTR1);
ST7735_WriteSmallData(0x01);
ST7735_WriteSmallData(0x2C);
ST7735_WriteSmallData(0x2D);

ST7735_WriteCommand(ST7735_FRMCTR2);
ST7735_WriteSmallData(0x01);
ST7735_WriteSmallData(0x2C);
ST7735_WriteSmallData(0x2D);

ST7735_WriteCommand(ST7735_FRMCTR3);
ST7735_WriteSmallData(0x01);
ST7735_WriteSmallData(0x2C);
ST7735_WriteSmallData(0x2D);
ST7735_WriteSmallData(0x01);
ST7735_WriteSmallData(0x2C);
ST7735_WriteSmallData(0x2D);

ST7735_WriteCommand(ST7735_INVCTR);
ST7735_WriteSmallData(0x07);

ST7735_WriteCommand(ST7735_PWCTR1);
ST7735_WriteSmallData(0xA2);
ST7735_WriteSmallData(0x02);
ST7735_WriteSmallData(0x84);

ST7735_WriteCommand(ST7735_PWCTR2);
ST7735_WriteSmallData(0xC5);

ST7735_WriteCommand(ST7735_PWCTR3);
ST7735_WriteSmallData(0x0A);
ST7735_WriteSmallData(0x00);

ST7735_WriteCommand(ST7735_PWCTR4);
ST7735_WriteSmallData(0x8A);
ST7735_WriteSmallData(0x2A);

ST7735_WriteCommand(ST7789_PWCTR5);
ST7735_WriteSmallData(0x8A);
ST7735_WriteSmallData(0xEE);

ST7735_WriteCommand(ST7735_VMCTR1);
ST7735_WriteSmallData(0x0E);

ST7735_WriteCommand(ST7735_INVOFF);

ST7735_WriteCommand(ST7735_MADCTL);
ST7735_WriteSmallData(0xC0);

ST7735_WriteCommand(ST7735_COLMOD);
ST7735_WriteSmallData(0x05);

ST7735_WriteCommand(ST7735_GMCTRP1);
ST7735_WriteSmallData(0x02);
ST7735_WriteSmallData(0x1c);
ST7735_WriteSmallData(0x07);
ST7735_WriteSmallData(0x12);
ST7735_WriteSmallData(0x37);
ST7735_WriteSmallData(0x32);
ST7735_WriteSmallData(0x29);
ST7735_WriteSmallData(0x2d);
ST7735_WriteSmallData(0x29);
ST7735_WriteSmallData(0x25);
ST7735_WriteSmallData(0x2B);
ST7735_WriteSmallData(0x39);
ST7735_WriteSmallData(0x00);
ST7735_WriteSmallData(0x01);
ST7735_WriteSmallData(0x03);
ST7735_WriteSmallData(0x10);

ST7735_WriteCommand(ST7735_GMCTRN1);
ST7735_WriteSmallData(0x03);
ST7735_WriteSmallData(0x1d);
ST7735_WriteSmallData(0x07);
ST7735_WriteSmallData(0x06);
ST7735_WriteSmallData(0x2E);
ST7735_WriteSmallData(0x2C);
ST7735_WriteSmallData(0x29);
ST7735_WriteSmallData(0x2D);
ST7735_WriteSmallData(0x2E);
ST7735_WriteSmallData(0x2E);
ST7735_WriteSmallData(0x37);
ST7735_WriteSmallData(0x3F);
ST7735_WriteSmallData(0x00);
ST7735_WriteSmallData(0x00);
ST7735_WriteSmallData(0x02);
ST7735_WriteSmallData(0x10);
ST7735_WriteCommand(ST7735_NORON);
delay(10);

ST7735_WriteCommand(ST7735_DISPON);
delay(100);

ОтветитьЦитата
Создатель темы Размещено : 01.09.2025 01:51
(@eduard)
Level 5 Moderator

Не сразу обратил внимание.

У вас то команды для 7735, то для 7789.

Конечно запись и команды у них одинаковы, но странно как то.

7735 от 7789 отличаются. У 7735 могут быть разные разрешения на разных размерах и инициализируются они по разному.

7789 независимо от размера имеют одно и то же назрешение.


ОтветитьЦитата
Размещено : 01.09.2025 09:14
Aveal
(@aveal)
Top level Admin

Запись от: @fon_syslik

Подключаю дисплей с драйвером ST7735 к stm32

Доброго времени суток!

Да, дисплей-то в итоге какой, 7735 или 7789?


ОтветитьЦитата
Размещено : 01.09.2025 10:20
(@fon_syslik)
Level 1

@eduard я перепутала библиотеки, подумала, что в этом тоже может быть причина. Уже все переписала на st7735, как в последнем примере инициализации. Потом увидела, что не все переписано в последнем примере. Но в моем проекте все переписано на st7735


ОтветитьЦитата
Создатель темы Размещено : 01.09.2025 20:53
Aveal
(@aveal)
Top level Admin

@fon_syslik Можете скинуть сюда актуальную инициализацию на всякий случай, чтобы путаницы не было? Там кстати у 7735 есть еще модификации 7735S, 7735R, у них есть отличия в инициализации.


ОтветитьЦитата
Размещено : 01.09.2025 21:03
(@fon_syslik)
Level 1

@aveal Проверила модификацию своего дисплея. Действительно ST7735S, не обратила внимания. Посмотрела на него даташит и нашла отличие в настройках. Все еще раз проверила. Актуальный код инициализации выглядит так.

CS_0();
RST_1();
delay(5);
RST_0();
delay(5);
RST_1();
delay(5);

CS_1();
delay(5);
CS_0();
delay(1);

ST7735_WriteCommand(ST7735_SWRESET);
delay(50);

ST7735_WriteCommand(ST7735_SLPOUT);
delay(500);

ST7735_WriteCommand(ST7735_FRMCTR1);
ST7735_WriteSmallData(0x05);
ST7735_WriteSmallData(0x3C);
ST7735_WriteSmallData(0x3C);

ST7735_WriteCommand(ST7735_FRMCTR2);
ST7735_WriteSmallData(0x05);
ST7735_WriteSmallData(0x3C);
ST7735_WriteSmallData(0x3C);

ST7735_WriteCommand(ST7735_FRMCTR3);
ST7735_WriteSmallData(0x05);
ST7735_WriteSmallData(0x3C);
ST7735_WriteSmallData(0x3C);
ST7735_WriteSmallData(0x05);
ST7735_WriteSmallData(0x3C);
ST7735_WriteSmallData(0x3C);

ST7735_WriteCommand(ST7735_INVCTR);
ST7735_WriteSmallData(0x07);

ST7735_WriteCommand(ST7735_PWCTR1);
ST7735_WriteSmallData(0xA8);
ST7735_WriteSmallData(0x08);
ST7735_WriteSmallData(0x84);

ST7735_WriteCommand(ST7735_PWCTR2);
ST7735_WriteSmallData(0xC0);

ST7735_WriteCommand(ST7735_PWCTR3);
ST7735_WriteSmallData(0x0A);
ST7735_WriteSmallData(0x00);

ST7735_WriteCommand(ST7735_PWCTR4);
ST7735_WriteSmallData(0x8A);
ST7735_WriteSmallData(0x26);

ST7735_WriteCommand(ST7735_PWCTR5);
ST7735_WriteSmallData(0x8A);
ST7735_WriteSmallData(0xEE);

ST7735_WriteCommand(ST7735_VMCTR1);
ST7735_WriteSmallData(0x05);

ST7735_WriteCommand(ST7735_INVOFF);
ST7735_WriteCommand(ST7735_MADCTL);
ST7735_WriteSmallData(0x00);

ST7735_WriteCommand(ST7735_COLMOD);
ST7735_WriteSmallData(0x05);

ST7735_WriteCommand(ST7735_NORON);
delay(10);
ST7735_WriteCommand(ST7735_DISPON);
delay(100);
CS_1();

Дисплей при таком коде выводит шумы на экран. Его можно включить(шумы) и выключить(подсветка). Функцию заливки цветом не меняла.


ОтветитьЦитата
Создатель темы Размещено : 03.09.2025 00:21
Aveal
(@aveal)
Top level Admin

@fon_syslik А в ST7735_WriteData() вывод DC выставляется в 1?


ОтветитьЦитата
Размещено : 03.09.2025 12:19
(@fon_syslik)
Level 1

@aveal Да, выставляется. А при ST7735_WriteCommand() DC выставляется в 0. CS тоже дергаю как положено

void ST7735_WriteCommand(uint8_t cmd) {
    CS_0();
    DC_0();
    ST7735_spi_transmit(&cmd, 1);
    CS_1();
}

void ST7735_WriteSmallData(uint8_t data) {
    CS_0();
    DC_1();
    ST7735_spi_transmit(&data, 1);
    CS_1();
}

ОтветитьЦитата
Создатель темы Размещено : 04.09.2025 21:10
Aveal
(@aveal)
Top level Admin

@fon_syslik Пропустил сообщение... Выглядит все отлично в целом, можно ради теста попробовать CS дергать только по окончании всех транзакций, псевдокод:

CS_0();
DC_0();

Command(CASET);
Command(RASET);
Command(RAMWR);

DC_1();
Data();
CS_1();

Но в то, что в этом проблема, верится слабо.

 


ОтветитьЦитата
Размещено : 08.09.2025 14:44
(@fon_syslik)
Level 1

@aveal Проблему решила, теперь все работает. Оказалось, я написала неправильный макрос для установки/сброса DC. Грубо говоря, дергала не ту ногу при переключении бита с передачи команды на передачу данных. Поэтому команды включить/выключить проходили, а запись данных в память ОЗУ и данных при инициализации нет. 

такая глупая ошибка.... мне очень неловко. Спасибо, что не бросили меня один на один с ним


ОтветитьЦитата
Создатель темы Размещено : 12.09.2025 10:37
Поделиться:
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.