Например TDA7294

Форум РадиоКот • Просмотр темы - ST7789 240x240
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 14:10:31

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 25 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: ST7789 240x240
СообщениеДобавлено: Пт июн 07, 2019 12:59:47 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
Всем добрый мяу!
Борюсь с дисплеем с али (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 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 41
Рейтинг сообщений: 306
Зарегистрирован: Пт сен 07, 2018 20:20:02
Сообщений: 2296
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
А логический анализатор у Вас есть? Обмен между МК и контроллером соответствует ожиданиям?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Пт июн 07, 2019 13:19:18 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
А логический анализатор у Вас есть? Обмен между МК и контроллером соответствует ожиданиям?

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


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Пт июн 07, 2019 13:46:17 
Это не хвост, это антенна

Карма: 10
Рейтинг сообщений: 78
Зарегистрирован: Вт янв 05, 2016 10:14:25
Сообщений: 1395
Откуда: Мелеуз
Рейтинг сообщения: 0
А где передача ST7789_MADCTL_RGB?
вот из библиотеки ардуино- https://mysku.ru/blog/aliexpress/62746.html


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Пт июн 07, 2019 14:08:19 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
А где передача ST7789_MADCTL_RGB?
вот из библиотеки ардуино- https://mysku.ru/blog/aliexpress/62746.html

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


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Пт июн 07, 2019 14:18:10 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 41
Рейтинг сообщений: 306
Зарегистрирован: Пт сен 07, 2018 20:20:02
Сообщений: 2296
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Не обязательная. У меня в коде на ST7735 ее нет.
Но у Вас в коде я не вижу, например, инициализации SPI.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Пт июн 07, 2019 14:33:39 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
Если несложно, покажите пожалуйста ваш код инициализации.
Upd
Проверил выходной сигнал, все выходит как положено. Тайминги даже в норме..


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Пн июн 10, 2019 15:20:00 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
Вопрос актуален


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Чт окт 17, 2019 14:46:04 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
Всех приветствую!
Дисплейчик в общем-то запустился, однако есть некоторые проблемки, с которыми прошу помочь знающих:
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 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 1
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 128
Рейтинг сообщения: 0
Обнаружил, что эти и подобные дисплеи не любят отключения линии CS (или SS) после отправки в дисплей команды. По этому при инициализации может и не запуститься. На отключение CS после отправки данных реагируют нормально.
Я сейчас вывод CS просто сажаю на на GND.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Вт окт 22, 2019 10:44:45 
Это не хвост, это антенна
Аватар пользователя

Карма: 11
Рейтинг сообщений: 1
Зарегистрирован: Пт фев 19, 2010 19:39:28
Сообщений: 1451
Откуда: Москва
Рейтинг сообщения: 0
А есть примеры вывода?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Ср янв 15, 2020 16:50:35 
Родился
Аватар пользователя

Зарегистрирован: Чт май 21, 2015 13:54:40
Сообщений: 4
Рейтинг сообщения: 0
Во первых спасибо за код на основе которого я написал свой

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

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Чт янв 16, 2020 10:36:57 
Родился
Аватар пользователя

Зарегистрирован: Чт май 21, 2015 13:54:40
Сообщений: 4
Рейтинг сообщения: 0
на казусе помогли разобраться

Спойлер
Код:
void SPI1_Init(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; /* Enable SPI1 clock */

    /* Configure PA6 to MISO, PA7 to MOSI, PB3 to SCK */
    GPIOA->AFR[0] &= ~((15ul << 4* 6) | (15ul << 4* 7));
    GPIOA->AFR[0] |= (( 0ul << 4* 6) | ( 0ul << 4* 7));
    GPIOB->AFR[0] &= ~(15ul << 4* 3);
    GPIOB->AFR[0] |= ( 0ul << 4* 3);
 
    GPIOA->MODER &= ~(( 3ul << 2* 6) | ( 3ul << 2* 7));
    GPIOA->MODER |= (( 2ul << 2* 6) | ( 2ul << 2* 7));
    GPIOB->MODER &= ~( 3ul << 2* 3);
    GPIOB->MODER |= ( 2ul << 2* 3);
   
    SPI1->CR1 = 0x00000000; /* Reset SPI1 CR1 Registry*/
    SPI1->CR1 = (( 0ul << 0) | /* CPHA=0 */
    ( 1ul << 1) | /* CPOL=1 */
    ( 1ul << 2) | /* MSTR=1 */
    ( 0ul << 3) | /* BR (fPCLK/2) ~= Max SPEED */
    ( 0ul << 7) | /* MSBFIRST */
    ( 0ul << 8) | /* SSI */
    ( 1ul << 14) | /* SSI */
    ( 1ul << 9)); /* SSM */
    SPI1->CR2 = 0x00000000; /* Reset SPI1 CR2 Registry*/
    SPI1->CR2 |= (SPI_CR2_NSSP | SPI_CR2_DS_0 | SPI_CR2_DS_1 | SPI_CR2_DS_2 | SPI_CR2_FRXTH);
    SPI1->CRCPR = 0x0007;
    SPI1->CR1 |= SPI_CR1_SPE; /* Enable SPI1 */
}

void SPI1_Write_byte (uint8_t wr)
{
    *(volatile uint8_t *)&(SPI1->DR) = wr;
    while (!(SPI1->SR & SPI_SR_TXE));
    while (SPI1->SR & SPI_SR_BSY);
}


Вложения:
st7789.c [43.01 KiB]
Скачиваний: 498
st7789.h [926 байт]
Скачиваний: 427


Последний раз редактировалось SlovachevskyDV Чт янв 16, 2020 15:13:02, всего редактировалось 2 раз(а).
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Чт янв 16, 2020 12:45:24 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2801
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18058
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
SlovachevskyDV,
я убрал твою сверхдлинную "портянку" из твоего поста.
во-первых, длинный текст прячь под спойлер.
во-вторых, не давай такой широкий текст, который выходит далеко за пределы экрана.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Вт мар 09, 2021 19:52:57 
Родился

Зарегистрирован: Сб мар 06, 2021 21:16:38
Сообщений: 1
Рейтинг сообщения: 0
Oled ST7789 240x240 дисплей не могу проверить ,скетч не могу найдти,может кто поможет?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Пт апр 23, 2021 10:36:59 
Открыл глаза

Зарегистрирован: Сб мар 26, 2016 01:01:31
Сообщений: 41
Рейтинг сообщения: 0
Всем доброго времени!

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Ср апр 28, 2021 14:43:19 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 63
Рейтинг сообщений: 536
Зарегистрирован: Чт июл 28, 2016 07:58:37
Сообщений: 1925
Откуда: Kyiv, UA
Рейтинг сообщения: 0
mab72,
mab72 писал(а):
-последовательность первоначальной инициализации
Делал инициализацию на основе этих данных
Спойлер
Код:
// Инициализация
void lcd_st7739_init(void)
{
    hspi1.Instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER;
    hspi1.Init.Direction = SPI_DIRECTION_1LINE;
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi1.Init.NSS = SPI_NSS_SOFT;
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
    hspi1.Init.CRCPolynomial = 10;
    HAL_SPI_Init(&hspi1);
   
    // CS=0  - начали сеанс работы с дисплеем
    LCD_ST7739_CS_0;   
   
    // аппаратный сброс дисплея
    LCD_ST7739_RES_0;         // RST=0
   // lcd_st7739_send_cmd(0x01);
    HAL_Delay(LCD_RESET_DELAY); // пауза
    LCD_ST7739_RES_1;           // RST=1
    HAL_Delay(LCD_DELAY);       // пауза

    // инициализация дисплея
    lcd_st7739_send_cmd(0x11);  // после сброса дисплей спит - даем команду проснуться

    HAL_Delay(LCD_DELAY);       // пауза

    lcd_st7739_send_cmd(0x3A);  // режим цвета:

    lcd_st7739_send_data(0x05); //16 бит

    lcd_st7739_send_cmd(0x36);  // направление вывода изображения:
   
    lcd_st7739_send_data(0x14); // снизу вверх, справа налево, порядок цветов RGB
   
    lcd_st7739_send_cmd(0x21);  // инверсия цвета

    lcd_st7739_send_cmd(0x29);  // включаем изображение
   
    lcd_st7739_send_cmd(0x51);  // установка контрастности?
    lcd_st7739_send_cmd(0x0);  // параметр
   
    LCD_ST7739_CS_1;
}

Это чей то код под СТМ32, но суть инициализации понятна...

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
Там есть ссыль на ютуб, где показана скорость работы с дисплеем.

_________________
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Пн май 31, 2021 22:55:20 
Первый раз сказал Мяу!

Зарегистрирован: Пн май 31, 2021 22:14:00
Сообщений: 25
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
Чтобы не создавать новую тему, спрошу здесь.
Есть дисплей ST7789 135*240 точек - http://www.lcdwiki.com/1.14inch_IPS_Module. Подключаю к Arduino UNO (atmega 328p), частота 16 МГц. Скетч с тестом для таких дисплеев прекрасно работает, то есть и МК, и дисплей живые.
Пишу свою программу в MPLAB X IDE и загружаю с помощью USBasp - дисплей не реагирует (только подсветка работает и всё). Инициализация вроде бы выполняется (проверяю по светодиодам).

Моделировал в Proteus - всё нормально...
Пробовал аппаратный и программный SPI, менял режимы SPI (комбинации битов CPOL и CPHA), уменьшал частоту SPI, менял величину задержек и ставил их после каждой команды - ничего... Смотрел примеры и здесь, и по другим форумам - вроде бы всё аналогично. Идеи закончились(

Код SPI.h - выводы поставил как и в тесте:
Спойлер
Код:
#define DISP_Enable         PORTB &= ~(1<<CS_BIT);
#define DISP_Disable        PORTB |= (1<<CS_BIT);
#define DISP_Reset_ON       PORTB &= ~(1<<RES_BIT);
#define DISP_Reset_OFF      PORTB |= (1<<RES_BIT);
#define DISP_Mode_Command   PORTB &= ~(1<<DC_BIT);
#define DISP_Mode_Data      PORTB |= (1<<DC_BIT);
#define SCK_L       PORTB &= ~(1<<SCK_BIT);
#define SCK_H       PORTB |= (1<<SCK_BIT);
#define MOSI_L      PORTB &= ~(1<<MOSI_BIT);
#define MOSI_H      PORTB |= (1<<MOSI_BIT);

// Номера выводов аппаратного SPI
#define DC_BIT     0   // #08 - DC (режим передачи: 1 - данные; 0 - команда)
#define RES_BIT    1   // #09 - RES (аппаратный сброс: 1 - нормальная работа; 0 - сброс)
#define CS_BIT     2   // #10 - CS дисплея (выбор устройства: 0 - активен; 1 - неактивен)
#define MOSI_BIT   3   // #11 - MOSI/SDA (данные от МК к ведомому устройству)
#define SCK_BIT    5   // #13 - SCK/SCL (тактовая частота)

    // Функции
void InitSPI(void);     // инициализация SPI (частота, тип, выводы)


SPI.c - инициализация SPI:
Спойлер
Код:
#include <avr/io.h>
#include "SPI.h"

void InitSPI(void) {   // настройка SPI
//    SPSR |= (1<<SPI2X);  // удвоение частоты работы SPI
   SPCR |= ((1<<SPE)|(1<<MSTR));   
    // SPE - включение SPI; MSTR - режим "мастер"
   // SPR1 и SPR0 по умолчанию равны 0: частота /4 -> 16 МГц/4 = 4 МГц
    SPCR &= ~(1<<CPOL);
    SPCR &= ~(1<<CPHA);
   
   DDRB |= ((1<<MOSI_BIT)|(1<<SCK_BIT));   // MOSI, SCK - выход
    DDRB |= ((1<<RES_BIT)|(1<<DC_BIT));      // RES, DC - выход
    DDRB |= (1<<CS_BIT);                    // CS - выход
   
   MOSI_H;     // в 1
    SCK_H;      // в 1
   DISP_Mode_Data;     // в 1 (режим работы с данными)
   DISP_Reset_OFF;     // в 1 (нормальная работа)
    DISP_Disable;       // в 1 (дисплей неактивен)
}



ST7789V.h - обозначения цвета, адресов команд, прототипы функций инициализации дисплея и рисования
Спойлер
Код:
#ifndef ST7789V_H
#define   ST7789V_H

#define BLACK                   0x0000
#define BLUE                    0x001F
#define RED                     0xF800
#define GREEN                   0x07E0
#define CYAN                    0x07FF
#define MAGENTA                 0xF81F
#define YELLOW                  0xFFE0 
#define WHITE                   0xFFFF

#define SLPOUT  0x11    // Sleep Out (p. 184)
//#define FRCTRL1 0xB1    // Frame Rate Control 1  (p. 264)
#define INVOFF  0x20    // Display Inversion Off - 188
#define INVON   0x21    // Display Inversion ON - 188
#define MADCTL  0x36    // Memory Data Access Control - 215
#define COLMOD  0x3A    // Interface Pixel Format - 224
#define CASET   0x2A    // Column Address Set - 198
#define RASET   0x2B    // Row Address Set - 200
#define NORON   0x13    // Normal Display Mode On - 187
#define DISPON  0x29    // Display On - 196
#define RAMWR   0x2C    // Memory Write - 202
#define SWRESET 0x01    // Software Reset - 163

void Init_ST7789V(void);  // Функция инициализации дисплея
void ST7789V_fill_screen(uint16_t color);
void ST7789V_draw_pixel(int16_t x, int16_t y, uint16_t color);

#endif



ST7789V.c - инициализация дисплея и функции рисования точки / заполнения экрана
Спойлер
Код:
#include <stdbool.h>
#include <avr/io.h>

#define F_CPU 16000000UL  // 8 MHz
#include <util/delay.h>      // для задержки

#include "ST7789V.h"
#include "SPI.h"



void Write(unsigned char mode, char data) {   // передача данных в дисплей
   // mode: данные - 1; команда - 0
   
   if (mode) {DISP_Mode_Data;}     // в 1 - режим передачи данных
   else {DISP_Mode_Command;}      // в 0 - режим передачи команд
   
   SPDR = data;   // передача информации
   while(!(SPSR & (1<<SPIF)));   // ожидание окончания передачи информации
}



void Init_ST7789V(void) {   // инициализация дисплея
   DISP_Enable;   // в 0 - дисплей активен
   
         PORTD &= ~(1<<PORTD1);
   
   DISP_Reset_ON; _delay_ms(50);    // в 0 - сброс дисплея (аппаратный) и задержка 50 мс
   DISP_Reset_OFF; _delay_ms(120); // в 1 - нормальная работа
        // задержка 120 мс (с. 48, 49)
        // после этого Sleep in / Normal display mode on / Idle mode off (с.139)
   
    Write(0, SWRESET); _delay_ms(120);  // 0x01 - программный RESET задержка 120 мс (с. 163)
    Write(0, SLPOUT); _delay_ms(120);   // 0x11 - выход из режима сна и задержка в 120 мс (с. 184)
    Write(0, COLMOD);   // 0x3A - формат вывода изображения
        Write(1, 0x05);   // (с. 224)
        // 0101 - 65K of RGB interface?
        // 0101 - 16bit/pixel
   
    Write(0, MADCTL);   // 0x36 - управление способом отображения информации
        Write(1, 0x14); // 0b00010100);   // (с. 215)
        // MY-0 (сверху вниз), MX-0 (слева направо)
        // MV-0 (нормальный режим адресации страниц/столбцов), ML-1 (обновление снизу вверх)
        // RGB-0 (формат RGB, а не BGR), MH-1 (обновление справа налево)

    Write(0, CASET);    // 0x2A - установка адресации столбцов
        Write(1, 0x00); Write(1, 0x00);     // слева - от 0
        Write(1, 0x00); Write(1, 0x86);     // справа - до 0x86 - 134
    Write(0, RASET);    // 0x2B - установка адресации строк
        Write(1, 0x00); Write(1, 0x00);     // слева - от 0
        Write(1, 0x00); Write(1, 0x86);     // справа - до 0xEF - 239
     
    Write(0, INVON);    // 0x20 - отключить инверсию цвета
    Write(0, NORON);    // 0x13 - нормальный режим работы дисплея (с. 187)
    Write(0, DISPON);   // 0x29 - включение дисплея
   
   DISP_Disable;   // в 1 - дисплей неактивен
}



void ST7789V_fill_screen(uint16_t color) {
    DISP_Enable;

    Write(0, RAMWR);    // 0x2C
    for(uint16_t counter = 0; counter < (128*128); counter++) {
        Write(1, color >> 8);
        Write(1, color);   
    }
    DISP_Disable;
}



void ST7789V_draw_pixel(int16_t x, int16_t y, uint16_t color) {
    DISP_Enable;
    Write(0, CASET);
        Write(1, x >> 8); Write(1, x);
        Write(1, (x + 1) >> 8); Write(1, x + 1);
    Write(0, RASET);
        Write(1, y >> 8); Write(1, y);
        Write(1, (y + 1) >> 8); Write(1, y + 1);
    Write(0, RAMWR);
        Write(1, color >> 8);
        Write(1, color);   
    DISP_Disable;
}


main.c
Спойлер
Код:
#include <avr/io.h>

#include "SPI.h"
#include "ST7789V.h"

#define F_CPU 16000000UL    // 16 MHz
#include <util/delay.h>      // для задержки


int main(void){
    _delay_us(1000000); // задержка

    InitSPI();
    Init_ST7789V();
   
    //ST7789V_draw_pixel(2, 2, RED);
    ST7789V_fill_screen(YELLOW);
         
    while (1) {
    }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Вт июн 01, 2021 12:36:46 
Первый раз сказал Мяу!

Зарегистрирован: Пн май 31, 2021 22:14:00
Сообщений: 25
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
Дисплей частично заработал... Записал код от Сериг с минимальными переделками и появился цветной шум. Оказалось, что у меня в программном SPI после отправки бита в MOSI был спад на линии SCK (1 -> 0), а надо подъём (0 -> 1). При конструкции "SCK_L; asm("nop"); SCK_H;" программный SPI работает стабильно (при передёргивании питания тоже).

Пока проблема с аппаратным SPI.
На одной плате Arduino UNO он не запускается совсем (вероятно, там он накрылся, так как и с SD-картой тоже не работает, хотя тест для дисплея со скетча почему-то работает).
На второй плате Arduino UNO работает через раз, причём после передёргивания питания или сброса кнопкой шансов запуска практически нет. Виснет на отправке команды выхода из сна ("Write(0, SLPOUT);").
Забавно ещё и то, что сначала аппаратный SPI на второй плате работал только при комбинации бит CPOL,CPHA - 1,1 (при других не запускался совсем). Теперь может запуститься только при комбинации CPOL,CPHA - 1,0 (при других не запускается, при этом и при рабочей до этого прошивке с CPOL,CPHA 1,1 тоже виснет).

Функция инициализации SPI (при SPItype равном 1 - аппаратный SPI, при 0 - программный SPI):
Спойлер
Код:
void InitSPI(void) {   // настройка SPI
   
#if(SPItype)
    SPSR |= (1<<SPI2X);  // удвоение частоты работы SPI
    SPCR = 0b01011000;
    // 0101: SPE - включение SPI; MSTR - режим "мастер"; 11: CPOL и CPHA
   // 00: SPR1 и SPR0 по умолчанию равны 0: частота /4 -> 16 МГц/4 = 4 МГц
    // до этого запускался при 11: CPOL и CPHA. Теперь работает при 10...
    // другие комбинации CPOL и CPHA - зависает
       
#endif
   DDRB |= ((1<<MOSI_BIT)|(1<<SCK_BIT));   // MOSI, SCK - выход
    DDRB |= ((1<<RES_BIT)|(1<<DC_BIT));      // RES, DC - выход
    DDRB |= (1<<CS_BIT);                    // CS - выход
   
   MOSI_H;     // в 1
    SCK_H;      // в 1
   DISP_Mode_Data;     // в 1 (режим работы с данными)
   DISP_Reset_OFF;     // в 1 (нормальная работа)
    DISP_Disable;       // в 1 (дисплей неактивен)
}


Функция отправки байта по SPI:
Спойлер
Код:
void Write(unsigned char mode, unsigned char data) {   // передача данных в дисплей
   // mode: данные - 1; команда - 0

//DISP_Enable;   // дисплей активен
   if (mode == 1) {DISP_Mode_Data;}     // в 1 - режим передачи данных
   else {DISP_Mode_Command;}      // в 0 - режим передачи команд
   
#if(SPItype)
    SPDR = data;   // передача информации
   while(!(SPSR & (1<<SPIF)));   // ожидание окончания передачи информации
#else
    // SCK      ??|__||??|__||??|__||??
    // MOSI     ???????|______|_______
    //          .  1   .  0   .  0   .   
    // Моя ошибка в том, что оставил код от OLED-дисплея, где сначала было
    // SCK_H, а потом SCK_L. Инициализация проходила, но дисплей был чёрным.
    unsigned char i;
    SCK_H;     
    for(i = 0; i < 8; i++) {
        if(( (data >> (7-i) ) & 1) == 1) {MOSI_H;} else {MOSI_L;}
        SCK_L; asm("nop"); SCK_H;
    }
#endif
// DISP_Disable;   // дисплей неактивен
}


Функция инициализации дисплея:
Спойлер
Код:
void Init_ST7789V(void) {   // инициализация дисплея
   
   DISP_Enable;   // в 0 - дисплей активен
   
    PORTD &= ~(1<<PORTD1);
   
   DISP_Reset_ON; _delay_ms(50);    // в 0 - сброс дисплея (аппаратный) и задержка 5 мкс
   DISP_Reset_OFF; _delay_ms(120); // в 1 - нормальная работа
        // задержка 120 мс (с. 48, 49)
        // после этого Sleep in / Normal display mode on / Idle mode off (с.139)
   
    PORTD |= (1<<PORTD1);
   
    Write(0, SWRESET); _delay_ms(120);  // 0x01 - программный RESET задержка 120 мс (с. 163)

    PORTD &= ~(1<<PORTD0);
    Write(0, SLPOUT);  // 0x11 - выход из режима сна
    // =========
    // Сюда при аппаратном SPI доходит редко
    // =========

    _delay_ms(120);   // задержка в 120 мс (с. 184)
    PORTD |= (1<<PORTD0);   
   
    Write(0, COLMOD);   // 0x3A - формат вывода изображения
        Write(1, 0x55);   // (с. 224)
        // 0101 - 65K of RGB interface
        // 0101 - 16bit/pixel
   
    Write(0, MADCTL);   // 0x36 - управление способом отображения информации
        Write(1, 0b00000000);   // 0x14); (с. 215)
        // MY / MX / MV / ML / RGB / MH
        // MY-0 (0-вверх, 1-вниз),
        // MX-0 (0-вправо, 1-влево)
        // MV-0 (0-нормальный режим,1-инверсный),
        // ML-0 (0-обновление вниз,1-вверх)
        // RGB-0 (0-формат RGB, 1-BGR),
        // MH-0 (0-обновление вправо,1-влево)

    Write(0, CASET);    // установка адресации столбцов
        Write(1, 0x00); Write(1, 0x00);     // слева - от 0
        Write(1, 0x00); Write(1, COLUMN-1);     // справа - до 128 0x86 - 134

    Write(0, RASET);    // установка адресации строк
        Write(1, 0x00); Write(1, 0x00);     // слева - от 0
        Write(1, 0x00); Write(1, ROW-1);     // справа - до 128 0xEF - 239
     
    Write(0, INVON);    // 0x20 - отключить инверсию цвета
    Write(0, NORON);    // 0x13 - нормальный режим работы дисплея (с. 187)
    Write(0, DISPON);   // 0x29 - включение дисплея
   
   //DISP_Disable;   // в 1 - дисплей неактивен
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ST7789 240x240
СообщениеДобавлено: Ср июн 02, 2021 00:12:33 
Первый раз сказал Мяу!

Зарегистрирован: Пн май 31, 2021 22:14:00
Сообщений: 25
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
Дисплей снова стал с большой вероятностью запускаться при CPOL,CPHA 1,1... При добавлении в функцию записи SCK_H, DISP_Enable и DISP_Disable дисплей начинает работать после третьего нажатия на кнопку Reset после передёргивания питания:
Спойлер
Код:
void Write(unsigned char mode, unsigned char data) {   // передача данных в дисплей
   // mode: данные - 1; команда - 0

   if (mode == 1) {DISP_Mode_Data;}     // в 1 - режим передачи данных
   else {DISP_Mode_Command;}      // в 0 - режим передачи команд

    SCK_H;
    DISP_Enable;   // дисплей активен
 
    SPDR = data;   
    while(!(SPSR & (1<<SPIF)));

    DISP_Disable;   // дисплей неактивен
}


В результате решил инициализацию проводить программным SPI, а дальнейшую работу аппаратным SPI. Пока всё стабильно как при передёргивании питания, так и при нажатии кнопки Reset. При этом работает всё при любых комбинациях CPOL,CPHA и на двух Arduino UNO (даже на той, на которой аппаратная инициализация вообще не хотела никак запускаться).
В чём моя ошибка при инициализации аппаратным SPI так и не понял, но последний вариант полностью устраивает. Может быть, кому-нибудь пригодится.

Инициализация SPI:
Спойлер
Код:
void InitSPI(void) {   // настройка SPI
   
#if(SPItype)
    SPSR |= (1<<SPI2X);  // удвоение частоты работы SPI
    SPCR = 0b01010000;
    // 0101: SPE - включение SPI; MSTR - режим "мастер"; 00: CPOL,CPHA - любые
   // 00: SPR1 и SPR0 по умолчанию равны 0: частота /4 -> 16 МГц/4 = 4 МГц
       
#endif
   DDRB |= ((1<<MOSI_BIT)|(1<<SCK_BIT));   // MOSI, SCK - выход
    DDRB |= ((1<<RES_BIT)|(1<<DC_BIT));      // RES, DC - выход
    DDRB |= (1<<CS_BIT);                    // CS - выход
   
   MOSI_H;     // в 1
    SCK_H;      // в 1
   DISP_Mode_Data;     // в 1 (режим работы с данными)
   DISP_Reset_OFF;     // в 1 (нормальная работа)
    DISP_Disable;       // в 1 (дисплей неактивен)
}


Отправка в SPI:
Спойлер
Код:
uint8_t SPInit = 0; // при инициализации будет программный SPI


void Write(unsigned char mode, unsigned char data) {   // передача данных в дисплей
   // mode: данные - 1; команда - 0

   if (mode == 1) {DISP_Mode_Data;}     // в 1 - режим передачи данных
   else {DISP_Mode_Command;}      // в 0 - режим передачи команд
    SCK_H;
    DISP_Enable;   // дисплей активен
   
    if(SPInit == 0) {
        SPDR = data;   // передача информации
        while(!(SPSR & (1<<SPIF)));
    } else {
        // SCK      ??|__||??|__||??|__||??
        // MOSI     ???????|______|_______
        //          .  1   .  0   .  0   .   
        // Моя ошибка в том, что оставил код от OLED-дисплея, где сначала было
        // SCK_H, а потом SCK_L. Инициализация проходила, но дисплей был чёрным.
        // Хотя здесь - с. 56 - SDA is sampled at the rising edge of SCL
        unsigned char i;   
        for(i = 0; i < 8; i++) {
            if(( (data >> (7-i) ) & 1) == 1) {MOSI_H;} else {MOSI_L;}
            SCK_L; asm("nop"); SCK_H;
        }
    }
    DISP_Disable;   // дисплей неактивен
}


Инициализация дисплея:
Спойлер
Код:
void HDRESET(void){
   DISP_Reset_ON; _delay_us(5);    // в 0 - сброс дисплея (аппаратный) и задержка 5 мкс
   DISP_Reset_OFF; _delay_ms(120); // в 1 - нормальная работа
        // задержка 120 мс (с. 48, 49)
        // после этого Sleep in / Normal display mode on / Idle mode off (с.139)   
}


void Init_ST7789V(void) {   // инициализация дисплея
   
    SPInit = 1;
    SPSR = 0;
    SPCR = 0;
   
   DISP_Enable;   // в 0 - дисплей активен
   
    PORTD &= ~(1<<PORTD1);
    HDRESET();
    PORTD |= (1<<PORTD1);
   
//    Write(0, SWRESET); _delay_ms(120);  // 0x01 - программный RESET задержка 120 мс (с. 163)

    PORTD &= ~(1<<PORTD0);
    Write(0, SLPOUT); _delay_ms(120);   // 0x11 - выход из режима сна и задержка в 120 мс (с. 184)
       
    Write(0, COLMOD);   // 0x3A - формат вывода изображения
    PORTD |= (1<<PORTD0);   // <------- Сюда при аппартаном SPI доходит редко
        Write(1, 0x55);   // (с. 224)
        // 0101 - 65K of RGB interface
        // 0101 - 16bit/pixel
   
    Write(0, MADCTL);   // 0x36 - управление способом отображения информации
        Write(1, 0b00000000);   // 0x14); (с. 215)
        // MY / MX / MV / ML / RGB / MH
        // MY-0 (0-вверх, 1-вниз),
        // MX-0 (0-вправо, 1-влево)
        // MV-0 (0-нормальный режим,1-инверсный),
        // ML-0 (0-обновление вниз,1-вверх)
        // RGB-0 (0-формат RGB, 1-BGR),
        // MH-0 (0-обновление вправо,1-влево)
     
    Write(0, INVON);    // 0x21 - включить инверсию цвета
    Write(0, NORON);    // 0x13 - нормальный режим работы дисплея (с. 187)
    Write(0, DISPON);   // 0x29 - включение дисплея
   
    SPInit = 0;
    SPSR |= (1<<SPI2X);  // удвоение частоты работы SPI
    SPCR = 0b01010000;
}


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y