Пытаюсь запустить дисплей на контроллере LS020 с STM32VL Discovery. Инициализация проходит, заливка работает, но вывести какую-либо графику не получается. Все время начинается вывод с краю дисплея и все время какая-то абракадабра. Инициализация вот такая: Спойлер
в AVR spi наверное программно был организован? я помню у меня тоже была подобная ерунда, я сейчас не за своим компьютером, код не могу посмотреть, но помню что у меня тоже на avr работало нормально а на stm32 были проблемы...
Поставте в lcd_cmd перед ретерном небольшую задержку, буквально в 100-200 тактов, если у вас stm32VL это наверное stm32 discoverу, там у вас наверное частота генератор 24MHz? настройте spi что б его частота была не больше 8Mhz, это на верняка у меня с этим дисплеем spi работал на 10 легко, а на 12MHz уже по мойму выделывался, короче 8 мегагерц будет наверняка...
я не могу сейчас полностью проверить код, но помню что без задержки в командах к дисплею на больших скоростях он работать нормально отказывался!
а заливка правильным цветом идет? таким же как и на avr
и вообще я не понимаю если на avr аппаратный был то скорости примерно такая же была, - портируйте код на stm без изменений, ну изменение только в периферии...
и посмотрите у вас где филскрин там 4 команды на выставление окна заливки!!! - все правельно!!! а на выбор пикселя эти команды где??? вы вместо команды там отсылаете данные!!! это наверное и ошибка !!!
Цвет выводит правильный. Ну значит так. Оказывается, дисплей вообще не реагирует на отправку команд lcd_cmd(); Например, если из функции fill_screen(); убрать
то ничего не меняется, заливка все так же работает. Соответственно не срабатывают команды выбора окна, поэтому и не работает все остальное. Перешел на 8-битный режим, полностью скопировал код с рабочей библиотеки для AVR, включая инициализацию, но эффект нулевой. Вот эта функция вывода прямоугольника тоже не работает, хотя на AVR все нормально:
Код:
void lcd_set_window(char x1, char y1, char x2, char y2) { lcd_cmd16(0xEF90); lcd_cmd16(0x0500); // Set Direction lcd_cmd16(0x0A00+x1); lcd_cmd16(0x0B00+x2); lcd_cmd16(0x0800+y1); lcd_cmd16(0x0900+y2); }
void LS020_CMD(unsigned short int comand) { while (!(SPI1->SR & SPI_SR_TXE));
CS_LOW RS_HIGH
SPI1->DR = comand; while (!(SPI1->SR & SPI_SR_TXE));
for(unsigned int i=0; i<100; i++); CS_HIGH
}
я вот так на stm32f100discovery, если на stm32 вы пользуетесь не библиотечными функциями, то там легко запутаться в регистрах set bit и reset bit, возьмите светодиодик и поверте работают ли фактически линии RS, ChipSelect и spi проверить не помешало б, spi проверяется просто, соединяете miso и mosi и в дебагере смотрите приходит ли на вход то что вы отправляете...
В общем все оказалось предельно просто. Плата STM32 VL Discovery у меня воткнута вот в такую плату:
Для подключения периферии выведены PLS линейки. И на выводе PA3 был непропай, а как раз к нему была подключена линия CS. Непропай устранил и дисплей заработал нормально в 16-битном режиме. Даже на максимальной частоте SPI Теперь выводится и текст и графические примитивы. Теперь другой вопрос, как вывести рисунок? Вроде алгоритм должен быть простым: 1) Перегнать картинку в массив цветов пикселей на ПК. 2) Вывести массив на экран попиксельно.
Но размер такого массива будет огромным, 176*132 = 23232 элемента Может есть какие-то другие способы?
_________________ Опыт растет прямо пропорционально выведенному из строя оборудованию...
для вывода картинки, вам понадобится формат bmp, это и есть bit map, то есть каждому пикселю отвечает 3 байта R G B... точнее почитайте bmp файла http://c-site.h1.ru/infa/bmp_struct.htm и все станет понятно
есть конечно библиотеки для декодирования jpeg и jpg но они очень громоздки и для начала нужно научится работать с bmp
Сейчас этот форум просматривают: Simon.S и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения