Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 11.07.2016, 10:21  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Re: ili9341 SPI

niXto, ни-о-чем, вы ведь даже не читали ничего кроме названия топика, правда?
Реклама:
dimdidim вне форума  
Непрочитано 11.07.2016, 11:52  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: ili9341 SPI

А вы вчера как с пальмы с абдурины слезли, правда? Настройки СПИ посмотреть, задать контрольные точки выполнения по времени, не? Тупо слепить и сразу "Герой эмбедда"?
STM32F0 вне форума  
Сказали "Спасибо" STM32F0
Easyrider83 (11.07.2016)
Непрочитано 11.07.2016, 13:22  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 720
Сказал спасибо: 363
Сказали Спасибо 802 раз(а) в 376 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: ili9341 SPI

Предлагается учредить такое звание и/или статус - "Гы!"
Это аббревиатура "Герой ымбедда" )
j-Roger вне форума  
Сказали "Спасибо" j-Roger
Easyrider83 (11.07.2016)
Непрочитано 11.07.2016, 21:55  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: ili9341 SPI

Сообщение от dimdidim Посмотреть сообщение
UP.. Да, передавать массивами значительно быстрее, чем попиксельно. Так можно добиться приличной скорости обновления экрана и без DMA
Ну как получилось хотябы раза 3-4 в секунду?
Заливка одним цветом из массива это конечно хорошо, но когда начнешь формировать какие-то элементы, текст - перерисовка полного кадра ради замены пары цифр - накладное дело, поскольку не хватает оперативки. Считай, вся сотая серия СТМов не имеет объема, достаточного для полного кадра. Это уже удел четырехсотой серии. Выходит, что максимальные скорости работы МК приходится выжимать только ради перерисовки дисплея. И даже при этом, сколько бы не извращался, предел скорости на SPI получится что-то около 100 мс на полный кадр, ну плюс-минус. При одноразовой перерисовке нормуль, а вот постоянное обновление будет дерганным.
Ускориться, особенно в режиме прерываний, поможет перевод SPI в 16-битный режим на время передачи данных изображения. Но менять битность SPI можно только при отключенном SPI. Для этого напишем вот такую функцию (это не на ХАЛ, это быстрее):
Код:
void Start_16bit_communication(void){
	SPI1-›CR1 &= ~SPI_CR1_SPE;
	SPI1-›CR1 |= SPI_CR1_DFF;
	SPI1-›CR1 |= SPI_CR1_SPE;
}
Теперь перед началом передачи изображения вызовем ее Start_16bit_communication(); Прибавка в скорости получается за счет вдвое меньшего числа прерываний. Конечно, на деле несколько меньше, чем вдвое прибавка.
Настанет время передать 8-битные команды, возвращаем в прежний режим:

Код:
void Return_to_8bit_communication(void){
	SPI1-›CR1 &= ~SPI_CR1_SPE;
	SPI1-›CR1 &= ~SPI_CR1_DFF;
	SPI1-›CR1 |= SPI_CR1_SPE;
}
Все это хорошо, однако размер оперативки, формирование изображения...
И вот тут на помощь приходят команды дисплея - CASET, PASET. Хотя писательской мороки получается больше, зато в пределах выделенной области перерисовка пойдет куда быстрее. Например, обновить две-три небольшие цифры размером в 16*8 быстрее в ограниченной области, тут как бы даже объяснять не надо.

Итак...
Прежде, чем начать более серьезно после первых опытов работать с дисплеем, неплохо бы вообще почитать его даташит, поглазеть на набор команд и режимы.

В даташите к дисплею (не к контроллеру, а именно к дисплею) приведена стандартная процедура инициализации. Она дофига какая длинная. Из нее смело можно выкинуть почти всё, (выкинутое отправим для эстетов, напотом), оставить в инициализации нужно буквально несколько команд:

- Команда софтового сброса Software Reset - вещь хорошая и полезная, позволит правильно возобновить работу с дисплеем, если питание не прерывалось, а только сбросился управляющий МК. Совместно с "железным" выводом сброса /RST помогает правильно запустить дисплей после "железной" подачи питания. Перед подачей следующих команд надо выдержать паузу 5 мс.

- Команда Pixel Format Set - крайне важная команда при инициализации. Дисплей стартует по умолчанию с 18-битным цветом, представленном в трех байтах. Поэтому, если хотим сэкономить на размерах, выставляем этой командой 16-битный цвет.

- Команда Memory Access Control - тоже очень нужная вещь, она настраивает ориентацию изображения, зеркалирование, и важную вещь - порядок вывода цветов - RGB или BGR, то есть, соответствие последовательности физических цветовых пикселей в триаде той последовательности, которая передается интерфейсно. В моем дисплее по дефолту синий и красные цвета наоборот местами поменяны.

- Команды Display ON и Sleep OUT - без них никуда - первая активирует внутренние выходы на пиксели, вторая - запускает развертку пикселей. Команды влияют только на работу пикселей и развертки, сам дисплей способен принимать команды и данные в выключенном или спящем режиме.
После этих команд надо выдерживать небольшие паузы по 100 мс.

Вот, это основной набор для инициализации. Остальное, типа калибровки цветов и настройки гаммы - пофик, пусть эстеты морочатся.

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

Прежде, чем переходить к рисованию всякой фигни на дисплее, надо заготовить функции работы с дисплеем. Причем, команды не обязательно пересылать через видеобуфер или DMA. Команды короткие, есть однобайтные без параметров, есть с одним параметром, есть с двумя-четырьмя, причем, приходится передергивать сигнал D/CX. Правда, в определенном режиме его можно включить в посылку SPI, но посылки должны быть 9-битными тогда.
"Джентельменский набор" функций работы с дисплеем - помимо инициализации и записи/чтения видеопамяти - еще и установка размеров области записи/чтения. Эта функция должна быть всегда под рукой.

Ну вот, после таких подготовительных операций, когда всё отлажено и работоспособно, можно переходить непосредственно к формированию изображения.
А вот тут пригодится еще одна функция, упаковывающая R, G и B компоненты в два байта в соответствии с заданным режимом дисплея. 5-6-5. По 5 бит на красный и синий и 6 бит на зеленый цвета. Тоже очень просто - каждый компонент переносится в двухбайтную переменную, сдвигаясь на заданное число позиций и добавляясь по ИЛИ.

Заодним, понадобятся заранее задефайненные цвета в формате непосредственного вывода. То есть,
Код:
#define RED_Tx      0xF800
#define GREEN_Tx    0x07E0
#define BLUE_Tx      0x001F
#define YELLOW_Tx    0xFFE0
#define LIGHTBLUE_Tx  0x07FF
#define WHITE_Tx    0xFFFF
#define BLACK_Tx    0x0000
... ну и так далее..
Пригодится при однородных заливках, чтобы не вычислять из RGB компонент.

Ну а дальше... Дальше вопрос формирования изображения...
Причем, простейшую геометрию можно формировать прямо "на лету" - рамочки, заливочки, поля. Двухмерный массив, однако..

Сообщение от dimdidim Посмотреть сообщение
в stm32f1xx_hal_spi.h все функции передачи данных только 8 бит.
Хм... Так а чего там такого, неужто без ХАЛа с двухбайтной переменной не справиться? Регистр приёма/передачи автоматически изменяет разрядность при изменении разрядности SPI.
uint16_t variable - и готово, работай. Остальное настраивается/работает так же, как и в 8-битном режиме.
NewWriter вне форума  
Эти 7 пользователя(ей) сказали Спасибо NewWriter за это сообщение:
-jonns- (13.07.2016), andries5 (12.07.2016), dimdidim (18.07.2016), Foto-Remont (20.02.2018), j-Roger (12.07.2016), majorka65 (14.07.2016), Znajomsky (12.07.2016)
Непрочитано 12.07.2016, 11:04  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 720
Сказал спасибо: 363
Сказали Спасибо 802 раз(а) в 376 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: ili9341 SPI

Круто, NewWriter - настоящая лекция!
Как бы вот.
j-Roger вне форума  
Непрочитано 13.07.2016, 14:15  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: ili9341 SPI

NewWriter
Подсветку мучать не надо
Можно у спящего дисплея загрузить картинку и после этого включить умножители напряжения и сам дисплей
niXto вне форума  
Непрочитано 14.07.2016, 11:42  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: ili9341 SPI

Не-а, не канает.. По крайней мере, с MIO283QT. Выключенный дисплей полностью пропускает свет подсветки. А без подсветки он полностью черный, даже если есть изображение. Работает только на просвет, на отражение не виден.

Раньше я не использовал SPI для дисплея, считая его слишком медленным. В принципе, в некотором роде да... хотя...
Попробовал.. На прерываниях скорость перерисовки полного кадра не впечатлила. Довольно сильно заметен эффект "листания".
Ладно, DMA. Уже лучше. При работе с кольцевым буфером максимальная скорость перерисовки кадра будет равна максимальной пропускной способности SPI.
(102 мс на кадр при 12 МГц SPI, DMA 16 бит, двойная буферизация)
Видео:


Полный кадр 240*320 при 16-битном цвете (65К цветов) содержит 1'228'800 бит. Для SPI на 18 МГц перерисовка полного кадра займет 68 мс (14,6 fps). Для SPI на 12 МГц - 102 мс (9,8 fps). При 18-битном цвете (262К цветов) скорость перерисовки падает в полтора раза. Потому что один пиксель представлен в трех байтах.
Кстати, меня малость смущают указанные в даташите ILI9341 тайминги SPI. Serial clock cycle указано минимум 100 нс, а это 10 МГц.
Но на 12 МГц работает без проблем. Да и у топикстартера на 18 МГц тоже вроде как работает. Хм.

Далее, дело упирается в небольшой размер оперативки у 103-го МК. Всего 20 кбайт из требуемых как минимум 150, да и то из этих 20 под видеобуфер можно выделить лишь какую-то часть. Поэтому, передавать придется небольшими блоками, строк по 10-20. Время передачи 20 строк - 4,2 мс при 18 МГц SPI.
Ну а чтобы не было задержек на подготовку очередного блока, используем флаги DMA. DMA_ISR_HTIF3 - флаг передачи половины буфера и DMA_ISR_TCIF3 - флаг передачи полного буфера (могут вызываться прерывания). Получение первого флага означает, что первая половина видеобуфера передалась и можно начинать готовить первую половину для следующего блока (при условии, что вторая половина видеобуфера подготовлена и загружена). Получение второго флага означает, что весь буфер был передан, и если МК уже приготовил первую половину для следующего блока, то можно запустить передачу DMA следующего блока и начать готовить вторую половину следующего блока. При этом очень желательно, чтобы время подготовки половины блока с запасом укладывалось во время передачи половины блока, иначе возможны артефакты на изображении. Если не укладывается, то лучше приостанавливать передачу.

Вобщем, если размер видеобуфера меньше, чем размер полного кадра, начинаются "увлекательные" занятия по поиску наиболее быстрого алгоритма.
Кстати, полистав немного инета по теме "дисплей через SPI", увидел решение примерно то же самое, что и у топикстартера. А ведь подобный дисплей, только в урезанном виде, на SPI используют абдуринщики. Интересно, их не смущает медленная перерисовка и эффект "листания"?
NewWriter вне форума  
Сказали "Спасибо" NewWriter
Znajomsky (14.07.2016)
Непрочитано 14.07.2016, 16:32  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: ili9341 SPI

Не думал что эта тема кому-то ещё интересна, уже давно всё порешали. Однако нашлись любители томов "Война и мир" и открытия америки.

Сообщение от NewWriter Посмотреть сообщение
Не-а, не канает.. По крайней мере, с MIO283QT. Выключенный дисплей полностью пропускает свет подсветки. А без подсветки он полностью черный, даже если есть изображение. Работает только на просвет, на отражение не виден.
Стёкла разные бывают. Для унылых вариантов блымать подсветкой тоже вариант.
Сообщение от NewWriter Посмотреть сообщение
На прерываниях скорость перерисовки полного кадра не впечатлила. Довольно сильно заметен эффект "листания".
Ещё бы. Смысла в этом и нет.
Сообщение от NewWriter Посмотреть сообщение
Ладно, DMA. Уже лучше. При работе с кольцевым буфером максимальная скорость перерисовки кадра будет равна максимальной пропускной способности SPI.
Да там и без ДМА нормально. С ДМА имеет смысл если делать хардварно.
Сообщение от NewWriter Посмотреть сообщение
Кстати, меня малость смущают указанные в даташите ILI9341 тайминги SPI. Serial clock cycle указано минимум 100 нс, а это 10 МГц.
Кетайсы. У них там чёрт ногу сломит.
Сообщение от NewWriter Посмотреть сообщение
Вобщем, если размер видеобуфера меньше, чем размер полного кадра, начинаются "увлекательные" занятия по поиску наиболее быстрого алгоритма.
Тогда проще и быстрее напрямую.
Сообщение от NewWriter Посмотреть сообщение
подобный дисплей, только в урезанном виде, на SPI используют абдуринщики. Интересно, их не смущает медленная перерисовка и эффект "листания"?
Их вообще ничего не смущает, они живут в параллельном мире.
STM32F0 вне форума  
Непрочитано 18.07.2016, 15:52  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Re: ili9341 SPI

Сообщение от NewWriter Посмотреть сообщение
Ну как получилось хотябы раза 3-4 в секунду?
обновление по DMA раз 10 в секунду получилось - эффект листания почти не заметен - чем больше буфер, тем быстрее обновление

Сообщение от NewWriter Посмотреть сообщение
Хм... Так а чего там такого, неужто без ХАЛа с двухбайтной переменной не справиться? Регистр приёма/передачи автоматически изменяет разрядность при изменении разрядности SPI.
uint16_t variable - и готово, работай. Остальное настраивается/работает так же, как и в 8-битном режиме.
да эта библиотека часто ставит в тупик своей неочевидностью - в какой-то момент от нее толку почти нет
да как то приспособился пока 8бит слать

Сообщение от NewWriter Посмотреть сообщение
на 18 МГц тоже вроде как работает
подтверждаю

На самом деле если SPI использовать - это забирает много времени на поиски шустрого алгоритма!
Сейчас со шрифтами играюсь

Последний раз редактировалось dimdidim; 18.07.2016 в 16:16.
dimdidim вне форума  
Непрочитано 18.07.2016, 22:44  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Re: ili9341 SPI

Каким кодам соответствует кириллица? Если для UTF-8 коды кириллицы начинаются с 1040, то как это укладывается в char (если выводить, например, строки типа "Привет, мир!" или символы 'А' 'Б')? Как вообще правильно работать с кириллицей тогда?
dimdidim вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Кто-нибудь работал с RF модулями nRF2401A? Easyrider83 Автоматика и аппаратура связи 1481 04.09.2021 23:24
Atmega16 - много переферийных устройств SPI pavned AVR 21 23.01.2013 07:00
Работа с EEPROM по SPI dominik2 Микроконтроллеры, АЦП, память и т.д 15 05.05.2012 00:24
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


Часовой пояс GMT +4, время: 11:45.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot