Всем доброго времени суток
Подключаю дисплей с драйвером 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)); }
В общем, уже не знаю, в какую сторону можно думать. Первый раз работаю с такими вот экранчиками. Вот этот пример смотрела здесь и еще с других источников. Не видела, чтобы сталкивались с такой проблемой. У меня возникает ощущение, что я упускаю какую-то маленькую и важную деталь.
Если шумы появились, значит дисплей на команды реагирует.
А где полная инициализация дисплея?
Просто так он не заработает. В статье, на которую ссылаетесь, это всё описано.
Если при полной инициализации дальше шума дело не идёт, может не хватать питания.
@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);
Не сразу обратил внимание.
У вас то команды для 7735, то для 7789.
Конечно запись и команды у них одинаковы, но странно как то.
7735 от 7789 отличаются. У 7735 могут быть разные разрешения на разных размерах и инициализируются они по разному.
7789 независимо от размера имеют одно и то же назрешение.
Подключаю дисплей с драйвером ST7735 к stm32
Доброго времени суток!
Да, дисплей-то в итоге какой, 7735 или 7789?
@eduard я перепутала библиотеки, подумала, что в этом тоже может быть причина. Уже все переписала на st7735, как в последнем примере инициализации. Потом увидела, что не все переписано в последнем примере. Но в моем проекте все переписано на st7735
@fon_syslik Можете скинуть сюда актуальную инициализацию на всякий случай, чтобы путаницы не было? Там кстати у 7735 есть еще модификации 7735S, 7735R, у них есть отличия в инициализации.
@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();
Дисплей при таком коде выводит шумы на экран. Его можно включить(шумы) и выключить(подсветка). Функцию заливки цветом не меняла.
@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(); }
@fon_syslik Пропустил сообщение... Выглядит все отлично в целом, можно ради теста попробовать CS дергать только по окончании всех транзакций, псевдокод:
CS_0(); DC_0(); Command(CASET); Command(RASET); Command(RAMWR); DC_1(); Data(); CS_1();
Но в то, что в этом проблема, верится слабо.
@aveal Проблему решила, теперь все работает. Оказалось, я написала неправильный макрос для установки/сброса DC. Грубо говоря, дергала не ту ногу при переключении бита с передачи команды на передачу данных. Поэтому команды включить/выключить проходили, а запись данных в память ОЗУ и данных при инициализации нет.
такая глупая ошибка.... мне очень неловко. Спасибо, что не бросили меня один на один с ним