Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

ST7789 240x240

Пт июн 07, 2019 12:59:47

Всем добрый мяу!
Борюсь с дисплеем с али (1.3 дюйма ST7789), никак не заставлю его работать, перепробовал кучу инициализаций (в том числе и от st7735).
Если есть у кого наработки по нему - прошу помощи.
Дисплей https://ru.aliexpress.com/item/1-ips-1- ... ac087e1e-3
Датащи https://datasheetspdf.com/pdf-down/S/T/ ... nology.pdf
Коды инитов:
Код:
TFT_command(ST7789_SWRESET);
delay_ms(120);
TFT_command(ST7789_SLEEPOUT);
delay_ms(120);
TFT_command(ST7789_DISPON);
TFT_command(ST7789_MADCTL_RGB);
TFT_data(0b00001000);
TFT_command(ST7789_COLMOD);
TFT_data(5);


Код:
MOSI_pin = 1;
DC_pin = 1;
SCK_pin = 1;
RESET_pin = 0;
delay_ms(120);
RESET_pin = 1;
delay_ms(120);
// последовательность инициализации дисплея
   TFT_command(0x11); // проснулись

   delay_ms(10);      // пауза 10 мс

   TFT_command(0x3A); // режим цвета:
   TFT_data(0x05); //             16 бит
   TFT_command(0x29); // включаем изображение

    // закрасим экран тремя цветами на черном фоне
   for (y=0;y<240;y++)
      for (x=0;x<240;x++) {
         unsigned int color=0x0;
         if (y<20) color=0xFC00;
         else  {
            if (y<40) color=0x02E0;
         else { if (y<60) color=0x001F; }
         }
         lcd7735_pix(x, y, color);

}

Пишу в CVAVR
Благодарю за помощь!

Re: ST7789 240x240

Пт июн 07, 2019 13:17:14

А логический анализатор у Вас есть? Обмен между МК и контроллером соответствует ожиданиям?

Re: ST7789 240x240

Пт июн 07, 2019 13:19:18

А логический анализатор у Вас есть? Обмен между МК и контроллером соответствует ожиданиям?

Анализатор никак не прошью, есть осциллограф...
Вечерком проверю, но с дисплеями на ssd1306 все работало корректно и длительности были в норме.

Re: ST7789 240x240

Пт июн 07, 2019 13:46:17

А где передача ST7789_MADCTL_RGB?
вот из библиотеки ардуино- https://mysku.ru/blog/aliexpress/62746.html

Re: ST7789 240x240

Пт июн 07, 2019 14:08:19

А где передача ST7789_MADCTL_RGB?
вот из библиотеки ардуино- https://mysku.ru/blog/aliexpress/62746.html

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

Re: ST7789 240x240

Пт июн 07, 2019 14:18:10

Не обязательная. У меня в коде на ST7735 ее нет.
Но у Вас в коде я не вижу, например, инициализации SPI.

Re: ST7789 240x240

Пт июн 07, 2019 14:33:39

Если несложно, покажите пожалуйста ваш код инициализации.
Upd
Проверил выходной сигнал, все выходит как положено. Тайминги даже в норме..

Re: ST7789 240x240

Пн июн 10, 2019 15:20:00

Вопрос актуален

Re: ST7789 240x240

Чт окт 17, 2019 14:46:04

Всех приветствую!
Дисплейчик в общем-то запустился, однако есть некоторые проблемки, с которыми прошу помочь знающих:
1) Спер функцию отрисовки символов, но есть одно "но" - выводится повернутым под 90 градусов, пробовал поменять начальные и конечные точки используемой области (area), менять "координаты", однако на экране получаю в итоге лебелерду.
2) Может есть у кого идеи, или готовый шрифт большего размера? (не хочется отрисовывать каждый символ с нуля, наверняка уже кто-то делал, или, может, вариант с масштабированием готовых шрифтов?).
Буду благодарен за помощь!
Код:
void write_byte(unsigned char c,unsigned char com)//0-command 1-data
{ unsigned char i;
  CS_pin = 0;
  if(com==0)
    DC_pin = 0;
  else
    DC_pin = 1;
  SCK_pin = 1;
  for(i=0;i<8;i++)
  {
    if(((c>>(7-i))&1) == 1){
      MOSI_pin = 1;}
    else {
      MOSI_pin = 0;}
    SCK_pin = 0;
    delay_us(1);
    SCK_pin = 1;
  }
  CS_pin = 1;
}
void Reset()
{
  RESET_pin = 0;
  delay_ms(10);
  RESET_pin = 1;
  delay_ms(150);
}

void TFTInit()
{  unsigned int i=0;

  DDRB.2 = 1;
DDRD.4 = 1;
DDRD.5 = 1;
DDRD.6 = 1;
DDRD.7 = 1;

  RESET_pin = 1;
  CS_pin = 1;
  DC_pin = 1;
  SCK_pin = 1;
  MOSI_pin = 1;
  Reset(); 
  write_byte(0x01,0);
  delay_ms(150);
  write_byte(0x11,0);
  delay_ms(100);
  write_byte(0x3A,0);
  write_byte(0x05,1);
  write_byte(0x36,0);
  write_byte(0x14,1);
  write_byte(0x21,0);
  write_byte(0x13,0);
  write_byte(0x29,0);
 
}

void WriteTwoByte(unsigned char LCD_DataH,unsigned char LCD_DataL)
{
  write_byte(LCD_DataH,1);
  write_byte(LCD_DataL,1);
}

void OutColor(unsigned int color)
{
WriteTwoByte((color>>8),((color<<8)>>8));
}

void TFTSingleColor(unsigned int color)
{
  unsigned char i,j;
  for (i=0;i<WIDTH;i++)
    for (j=0;j<HEIGH;j++)
      OutColor(color);
}

void Area(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1)
{
  write_byte(0x2a,0);
  write_byte(0,1);
  write_byte(y0,1);
  write_byte(0,1);
  write_byte(y1,1);
  write_byte(0x2b,0);
  write_byte(0,1);
  write_byte(x0,1);
  write_byte(0,1);
  write_byte(x1,1);
  write_byte(0x2c,0);
}

void DrawPixel(unsigned char x0, unsigned char y0, unsigned int color)
{
  Area((WIDTH-x0),y0,(WIDTH-x0),y0);
  OutColor(color);
}

void WriteChar8x11(unsigned char x0, unsigned char y0, unsigned char s, unsigned int color)
{
    unsigned char x,y,c;
    Area((19-y0)*8, x0*11, (19-y0)*8+7, x0*11+10);   // Area((19-x0)*8, y0*11, (19-x0)*8+7, y0*11+10);
    for(y=0;y<8;y++){
      for(x=0;x<11;x++)
        {
       if(s>=192)
         c=65;
       else
        c=0;
       if((Font_8x11[s-32-c][y]&(1<<x))!=0)
         OutColor(color);
       else
         OutColor(BLACK);
        }
        }
}

void WriteString8x11(unsigned char x0,unsigned char y0,unsigned char *s,unsigned int color)
{
  int i,x,y,xx,c;
  xx=19-x0;
  for(i = 0;s[i]!='\0';i++)
    {
    Area(xx*8, y0*11, xx*8+7, y0*11+10);//откуда тут взялись константы - тоже не понятно, как их высчитывать..
    for(y=0;y<8;y++)
      for(x=0;x<11;x++)
        {
       if(s[i]>=192)
         c=65;
       else
        c=0;
       if((Font_8x11[s[i]-32-c][x]&(1<<y))!=0)
         OutColor(color);
       else
         OutColor(BLACK);       
       }
    if(xx==0)
      {
      xx=19;
      y0++;
     }
    else
      xx--;
    if(y0>10)
      y0=0;
    }         
}

Re: ST7789 240x240

Вт окт 22, 2019 09:03:56

Обнаружил, что эти и подобные дисплеи не любят отключения линии CS (или SS) после отправки в дисплей команды. По этому при инициализации может и не запуститься. На отключение CS после отправки данных реагируют нормально.
Я сейчас вывод CS просто сажаю на на GND.

может пригодится кому...

Re: ST7789 240x240

Вт окт 22, 2019 10:44:45

А есть примеры вывода?

Re: ST7789 240x240

Ср янв 15, 2020 16:50:35

Во первых спасибо за код на основе которого я написал свой

В таком виде код не работает, но если SPI закоментировать а ногодрыг раскоментировать будет красиво выводить 3 алфавита разного размера.
Во вторых для поворота можно попробовать разные комбинации команды 0х36 в инициализации. Описание на странице 215 даташита.
Но при некоторых комбинациях первые 80 строк могут уйти "за борт". Для этого нужно раскоментировать "Y += 80" в процедуре "эриа"

Собственно вопрос к знающим людям:
Почему не работает SPI?

Смотрел осциллом. Сигналы есть. Передний фронт как в даташите.
Проц: STM32F051

Re: ST7789 240x240

Чт янв 16, 2020 10:36:57

на казусе помогли разобраться

Вложения
st7789.c
(43.01 KiB) Скачиваний: 202
st7789.h
(926 байт) Скачиваний: 154
Последний раз редактировалось SlovachevskyDV Чт янв 16, 2020 15:13:02, всего редактировалось 2 раз(а).

Re: ST7789 240x240

Чт янв 16, 2020 12:45:24

SlovachevskyDV,
я убрал твою сверхдлинную "портянку" из твоего поста.
во-первых, длинный текст прячь под спойлер.
во-вторых, не давай такой широкий текст, который выходит далеко за пределы экрана.

Re: ST7789 240x240

Вт мар 09, 2021 19:52:57

Oled ST7789 240x240 дисплей не могу проверить ,скетч не могу найдти,может кто поможет?

Re: ST7789 240x240

Пт апр 23, 2021 10:36:59

Всем доброго времени!

ST7789 240x240 из китая. CS у него прибит к земле. В интернете брал разные примеры кодов инициализации, вывода информации на этот дисплей. Какие-то примеры работали, какие-то нет, но не суть.
Два момента хотелось бы прояснить. 1. Инициализация. 2. Полярность и фаза SPI. Можно взять готовый пример из интернета и забыть, но хочется разобраться почему именно так.
С английским у меня не очень (но я стараюсь). Весь (как мне кажется) даташит на контроллер пересмотрел, но не могу найти:
-последовательность первоначальной инициализации;
-режим работы SPI (CPOL, CPHA);
Кому не сложно подскажите где эта информация выискивается?

Re: ST7789 240x240

Ср апр 28, 2021 14:43:19

mab72,
mab72 писал(а):-последовательность первоначальной инициализации
Делал инициализацию на основе этих данных

mab72 писал(а):-режим работы SPI (CPOL, CPHA)

Настройка SPI: CPOL=1, CPHA=1

Следует еще учесть, что если вы используете CS, то низкий уровень на нем нужно держать до окончания отправки данных по SPI. Если оторвать CS от земли раньше, чем закончится передача данных - то остаток данных не будет воспринят дисплеем (Это я к тому, что если вы вдруг захотите отпаять дисплей от китайской платы и паять его в свою схему.)

Добавлено after 4 hours 9 minutes 25 seconds:
Вот шустренький вариант, правда для ардуины - https://github.com/cbm80amiga/Arduino_ST7789_Fast
Там есть ссыль на ютуб, где показана скорость работы с дисплеем.
Ответить