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

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) Скачиваний: 20
st7789.h
(926 байт) Скачиваний: 13
Последний раз редактировалось SlovachevskyDV Чт янв 16, 2020 15:13:02, всего редактировалось 2 раз(а).

Re: ST7789 240x240

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

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