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);
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Да это собственно не обязательная команда для перевода из GRB в RGB. При отладке, конечно, это вставлю, сейчас задача хотя бы убедиться в работоспособности экрана, хотя бы мусор вывести... У меня постоянно чёрный дисплей, похоже неправильная инициализации, а в чем - понять не могу..
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Всех приветствую! Дисплейчик в общем-то запустился, однако есть некоторые проблемки, с которыми прошу помочь знающих: 1) Спер функцию отрисовки символов, но есть одно "но" - выводится повернутым под 90 градусов, пробовал поменять начальные и конечные точки используемой области (area), менять "координаты", однако на экране получаю в итоге лебелерду. 2) Может есть у кого идеи, или готовый шрифт большего размера? (не хочется отрисовывать каждый символ с нуля, наверняка уже кто-то делал, или, может, вариант с масштабированием готовых шрифтов?). Буду благодарен за помощь!
Обнаружил, что эти и подобные дисплеи не любят отключения линии CS (или SS) после отправки в дисплей команды. По этому при инициализации может и не запуститься. На отключение CS после отправки данных реагируют нормально. Я сейчас вывод CS просто сажаю на на GND.
Зарегистрирован: Чт май 21, 2015 13:54:40 Сообщений: 4
Рейтинг сообщения:0
Во первых спасибо за код на основе которого я написал свой
В таком виде код не работает, но если SPI закоментировать а ногодрыг раскоментировать будет красиво выводить 3 алфавита разного размера. Во вторых для поворота можно попробовать разные комбинации команды 0х36 в инициализации. Описание на странице 215 даташита. Но при некоторых комбинациях первые 80 строк могут уйти "за борт". Для этого нужно раскоментировать "Y += 80" в процедуре "эриа"
Собственно вопрос к знающим людям: Почему не работает SPI?
Смотрел осциллом. Сигналы есть. Передний фронт как в даташите. Проц: STM32F051
SlovachevskyDV, я убрал твою сверхдлинную "портянку" из твоего поста. во-первых, длинный текст прячь под спойлер. во-вторых, не давай такой широкий текст, который выходит далеко за пределы экрана.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Зарегистрирован: Сб мар 26, 2016 01:01:31 Сообщений: 43
Рейтинг сообщения:0
Всем доброго времени!
ST7789 240x240 из китая. CS у него прибит к земле. В интернете брал разные примеры кодов инициализации, вывода информации на этот дисплей. Какие-то примеры работали, какие-то нет, но не суть. Два момента хотелось бы прояснить. 1. Инициализация. 2. Полярность и фаза SPI. Можно взять готовый пример из интернета и забыть, но хочется разобраться почему именно так. С английским у меня не очень (но я стараюсь). Весь (как мне кажется) даташит на контроллер пересмотрел, но не могу найти: -последовательность первоначальной инициализации; -режим работы SPI (CPOL, CPHA); Кому не сложно подскажите где эта информация выискивается?
// инициализация дисплея 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 Там есть ссыль на ютуб, где показана скорость работы с дисплеем.
Зарегистрирован: Пн май 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 - выводы поставил как и в тесте: Спойлер
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 - инициализация дисплея и функции рисования точки / заполнения экрана Спойлер
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 - включение дисплея
Зарегистрирован: Пн май 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; // дисплей неактивен }
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)
Зарегистрирован: Пн май 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 так и не понял, но последний вариант полностью устраивает. Может быть, кому-нибудь пригодится.
#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) }
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения