Lib за ILI9486 - 3.5 дюймов 480x320 Touch TFT для RPI

Стивестронг
Пн 26 декабря 2016 г., 11:28 утра
Всем привет,

В последнее время я пытался улучшить некоторые функции SPI (оптимизация скорости). Я в основном использовал новую бета -версию SDFAT, и все сработало хорошо.
Но потом мне сказали, что у моих улучшений есть некоторые проблемы на дисплеях на основе ILI9341, поэтому я хотел купить контролируемую плату дисплея SPI.

В своих поисках соответствующей доски я понял, что Arduino совместима 2.4 -дюймовые касания TFT с интерфейсом SPI имеют почти такую ​​же цену, что и 3.5 -дюймовый 480x320 сенсорный TFT -дисплей для RPI. Я решил купить один из них.

Когда доска прибыла, мне было трудно, чтобы идентифицировал контроллер встроенного контроллера, так как на доске не доступно функциональность чтения регистра, попробовал несколько последовательностей инициировать из сети.
В конце я понял, что это должен быть ILI9486.
Эта доска содержит сериал->Схема параллельного преобразования, ILI9486 фактически настроен на 16-битный параллельный интерфейс только для записи.

Я решил написать библиотеку, совместимая с Адафрутом, и я взял ILI9341 LIB из нашего репо в качестве отправной точки.

И Вот это самая первая рабочая версия.

Используя графический эскиз для тестирования, я мог бы оценить производительность 16 -битного написания на 36 МГц SPI -тактовой скорости.

И это результат:
***** ILI9486 graphic Test ***** ************************************************ Without DMA: ************************************************ Benchmark Time (microseconds) Screen fill 342137 Text 49898 Lines 544406 Horiz/Vert Lines 30606 Rectangles (outline) 19241 Rectangles (filled) 834795 Circles (filled) 298164 Circles (outline) 429518 Triangles (outline) 111944 Triangles (filled) 361198 Rounded rects (outline) 130705 Rounded rects (filled) 960236 Done! ************************************************ Now using DMA: ************************************************ Benchmark Time (microseconds) Screen fill 341513 Text 52079 Lines 613614 Horiz/Vert Lines 31325 Rectangles (outline) 20255 Rectangles (filled) 833456 Circles (filled) 352232 Circles (outline) 429516 Triangles (outline) 136594 Triangles (filled) 386043 Rounded rects (outline) 131725 Rounded rects (filled) 973679 Done!

Ахулл
Пн 26 декабря 2016 г. 12:01
: D Хороший.

Есть куча экранов HVGA, но я никогда не делал решающий шаг и фактически купил один.
Я смотрел на этот, Но неясно, какой контроллер на нем, но я подозреваю, что он также использует LI9486.

Интересно видеть, что версии SPI на самом деле относительно быстрые. Я бы подумал, что параллель принесет некоторые серьезные преимущества скорости, но, очевидно, они находятся в одном и том же парке общего бала. Этот SPI с DMA не является преимуществом, пока вы не имеете такого такого заполнения, что имеет смысл, хотя и имеет смысл.

Может быть, мне нужно переименовать свиньи $ 10 в качестве свиньи в 10 фунтов стерлингов и обновление от QVGA до HVGA :) В конце концов, я попробовал меньше 1.4 -дюймовый экран, и это работает, так почему бы не пойти большим.

Стивестронг
Пн 26 декабря 2016 12:10
Ваша плата выглядит немного по -другому, может использовать один и тот же контроллер или, в качестве альтернативы HX8375 LIB от Adafruit.

michael_l
Пн 26 декабря 2016 12:33
Stevestestong: Хорошая работа! Это так же быстро, как ili9431_stm для STM32F1 с DMA или даже быстрее?

Мне было интересно, это последовательность инициации обнаружения, отличная для каждого чипа?

Стивестронг
Пн 26 декабря 2016 г. 14:45
michael_l написал:Это так же быстро, как ili9431_stm для STM32F1?

Rogerclark
Пн 26 декабря 2016 г., 8:04 вечера
Спасибо @Stevestrong

Я скачаю и проверю ваш последний код.

Интересно, что DMA сейчас медленнее в большинстве случаев. Но мы никогда не использовали DMA для его реальной цели, что позволяет процессору делать что -то еще, пока перевод работает.

В идеале мы должны иметь не блокирующие функции DMA, а также блокировка (это можно сделать с помощью дополнительного параметра)

Кроме того, природа команд ILI9341 SPI E.G, чтобы установить отдельные пиксели путем отправки адреса, затем значение, очень неэффективно, тем более что библиотека AdaFruit по умолчанию не ставит эти переводы в одну большую передачу SPI.

Я думаю, что Пол переписал огромные куски кода Adafruit для использования в Teensy и добавил буферизацию для достижения гораздо более высоких скоростей, но для большинства людей то, что у нас в настоящее время, является достаточным, поэтому никому не нужно делать то же самое с нашей версией.

Дэйвид.Прентис
Пн 26 декабря 2016 г., 22:17
Это кажется невероятно сложным способом управления дисплеем.

Большинство контроллеров TFT можно настроить для 8-битного SPI. Минимальный цикл записи незначительно быстрее с параллельным интерфейсом 8080. Минимальный цикл чтения быстрее со SPI, чем параллель. OTOH, SPI легко контролируется с помощью DMA.

Вы можете рассчитать «лучшее» время для любой графической работы по времени цикла данных.
Конечно, большинство графики требуют расчетов программного обеспечения. STM32 может рассчитывать, пока автобусный трафик обрабатывается DMA.

STM32 требует «замедления» при использовании 8080-параллельного интерфейса. Вы не можете водить интерфейс 8080 с DMA. Таким образом, вы не можете рассчитать и проезжать в автобус одновременно.

Имейте в виду, если дисплей RPI преобразует SPI в 8080-16-бит параллельно в оборудовании, DMA должен работать просто хорошо.

Дэйвид.

Стивестронг
Пн 26 декабря 2016 г., 22:30
Насколько я знаю, RPI управляет дисплеем как «кадровый буфер». Это означает, что в RAM есть полный буфер изображений и пишет его как целый кадр всегда снова с высокой скоростью на дисплее. Таким образом, ему не нужно изменять координаты окна, нет переключения между командой и выбором данных. Вот почему это действительно может работать с DMA.
Но мы не можем позволить нам эту роскошь, Ram ограничен. Таким образом, самая большая нехватка - как оптимизировать выбор команд и данных.
У меня есть некоторые подростки в моей голове, буферизация может быть реализована с не слишком большими усилиями, должен проверить версию Пола.

Rogerclark
Вт 27 декабря 2016 г. 10:03
@stevestrong

Я проверил последние обновления SPI, и они кажутся в порядке, но, пожалуйста, проверьте, что ваш репо обновлен, так как это похоже на изменения в досках.TXT и, возможно, другие не были вытянуты с моей главной головы к вашей вилке.

Спасибо

Роджер

Стивестронг
Вт 27 декабря 2016 г. 10:59
Роджер, я обновил и синхронизировал свою репо, так что теперь все должно быть нормально.

Кстати, я также немного увеличил скорость, уменьшив часть установки адреса на 50% (с 18 до 8 США). Сейчас я также использую 16 -битный доступ для настройки регистрации, без DMA.
***** ILI9486 graphic Test ***** ************************************************ Benchmark Time (microseconds) Screen fill 342102 Text 42270 Lines 456059 Horiz/Vert Lines 30056 Rectangles (outline) 18507 Rectangles (filled) 834569 Circles (filled) 259954 Circles (outline) 351849 Triangles (outline) 94697 Triangles (filled) 343390 Rounded rects (outline) 109572 Rounded rects (filled) 949488 Done!

Rogerclark
Вт 27 декабря 2016 г., 19:12
@stevstrong

Спасибо, я притяну вашу версию в свой местный филиал и повторный тест.

У меня есть пользовательская печатная плата, которую я использую для этих тестов, у которой есть Maple Mini с одной стороны и дисплей ILI9341 с другой, так что провода (дорожки печатной платы) довольно короткие (около 3 см)

КСТАТИ. Я думаю, что SPI F103 Spec Max для SPI на самом деле составляет 20 МГц, но обычно, кажется, работает нормально на 36 МГц.
Я не знаю максимальную скорость дисплея, это также может быть менее 36 МГц.

Я думаю, что лучший способ дальнейшего увеличения скорости с дисплеем на основе ILI9341 - это буферизация нескольких записей.
Использование двойной буферизации позволило бы наилучшим образом использовать DMA (если у нас был обратный вызов завершения) в качестве расчета строки, пикселя и текстового чертежа должны занять почти столько же времени, сколько передаваемость данных SPI на дисплей

Стивестронг
Вт 27 декабря 2016 г., 19:47
Доска дисплея должна работать с RPI, поэтому я предполагаю, что она должна поддерживать до 80 МГц.
Монтаж платы контроллера очень близко к дисплею должен сделать трюк.

Я сегодня реализовал буферизацию (с настраиваемым размером), я в настоящее время отлаживаю ее 8-)

Rogerclark
Вторник 27 декабря 2016 г., 22:21
Max SPI Speed ​​для ILI9341, по -видимому, составляет 10 МГц на основе спецификации

https: // cdn-shop.Адафрут.com/dataheets/ili9341.PDF

Страница 231. Показывает: «Запись серийного тактового цикла» при 100 Н. Мин = 100 МГц

Так что, возможно, не все устройства ILI9341 будут работать на уровне 36 МГц, так как он значительно выше Spec Max Speed.

Стивестронг
Вт 27 декабря 2016 г., 22:51
Как я уже упоминал, на доске есть сериал->параллельный преобразователь, Таким образом, контроллер фактически приводится в 16 -битный параллельный режим.
И этот режим должен поддерживать ~ 10 МГц писать стробоми (стр. 226), что означает теоретическую серийную скорость 160 МГц...

victor_pv
Ср 28 декабря 2016 г. 1:58 утра
Стивестронг,

Я посмотрел на эти цифры, и я тоже удивлен тем же, что и на той же скорости с DMA и без, но я также заметил, что вы не можете запустить дисплей на скорости MAX SPI.
Похоже, ваши оптимизации SPI определенно являются большим улучшением, и теперь накладные расходы не так уж и много. Если вы сможете водить его на уровне 36 МГц, мы увидим, на этом скорость DMA начинает получать какое -то преимущество или нет.

Некоторое время назад при переносе библиотеки SD-FAT я провел некоторые тесты с DMA и без DMA на более медленных скоростях SPI, и заметил почти то же самое, до определенной точки DMA не был быстрее, чем обычно.
Большое преимущество, как сказал Роджер, - это параллелизм DMA, который позволяет DMA, я сделал несколько тестовых набросков с Freertos и COOS и с использованием DMA для передачи блоков позволил немного больше времени для других задач, но опять же только для трансферов больших блоков. Если вы начнете рисовать что -то другое, что прямое линии, вообще нет никакого преимущества.

Если я правильно помню, я провел некоторый тест с библиотекой ILI, где она использовала бы DMA только в том случае, если линия для рисования была длиннее N пикселей, и использовать обычную передачу для небольших линий, и обнаружил минимальное количество пикселей для DMA, чтобы сделать разница. Тем не менее, достижение по сравнению с использованием DMA все время на полной скорости не было значимым, но показали, что нормальные переводы были быстрее, если в рамках ряда байтов.

Стивестронг
Ср 28 декабря 2016 г., 9:05
Виктор, тесты работали на 36 МГц, но дисплей был частично поврежден. Перед какой -либо оптимизацией коррупция не была настолько значительной, что после. Если я ускоряю написание регистра, то у меня есть больше проблем, случайным образом.
Поскольку он работает без какой -либо ошибки на 18 МГц, я уверен, что SW работает нормально, это просто то, что провода слишком длинные.

Версия без DMA больше не имеет пробелов часов между последовательными записями, поэтому время выполнения идентична или лучше с версией DMA. У него нет накладных расходов, но прерывается Systick и USB IRQ, где версия DMA не.

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

victor_pv
Ср 28 декабря 2016 г., 8:22 вечера
Стивестронг написал: Версия без DMA больше не имеет пробелов часов между последовательными записями, поэтому время выполнения идентична или лучше с версией DMA. У него нет накладных расходов, но прерывается Systick и USB IRQ, где версия DMA не.

Стивестронг
Ср 28 декабря 2016 г., 22:36
Да, я делаю все это как хобби, хотя я не эксперт, я люблю оптимизировать программное обеспечение, я думаю, что это своего рода болезнь ;)

Что касается буферизации, я думаю, что я нахожусь в хорошем смысле, есть только один ОГРОМНЫЙ проблема...
Я борюсь весь день с DMA IRQ и SPI...
Мне действительно нужна помощь здесь
Похоже, что периферийная пластинка SPI замерзает после того, как DMA закончил свою работу. Проверка TXE и занятых флагов в рутине DMA ISR: while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." /* and */ while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI."

Squonk42
Чт 29 декабря 2016 г. 9:38 утра
Не интерфейс SPI, а не для RPI без добавления регистров смены, таких как Спрайтные моды сделал, но я заметил этот грязный дешевый 3.5 "один за 6 долларов.42:
http: // www.eBay.com/itm/281672772523

Это выглядит как интерфейс HVGA 8080 в стиле UNO R3 с сенсорным экраном с контроллером ILI9488, но код инициации, который они предоставляют, предназначен для ILI9327.

Я заказал один, дайте вам знать, как это работает.

Rogerclark
Чт 29 декабря 2016 г. 10:17 утра
Squonk42 написал:Не интерфейс SPI, а не для RPI без добавления регистров смены, таких как Спрайтные моды сделал, но я заметил этот грязный дешевый 3.5 "один за 6 долларов.42:
http: // www.eBay.com/itm/281672772523

Это выглядит как интерфейс HVGA 8080 в стиле UNO R3 с сенсорным экраном с контроллером ILI9488, но код инициации, который они предоставляют, предназначен для ILI9327.

Я заказал один, дайте вам знать, как это работает.

Стивестронг
Чт 29 декабря 2016 г. 10:33
"Не отправляется в Германию" :(

Но этот можно отправить в Германию (хотя и немного больше и дороже): http: // www.eBay.com/itm/172354640099

Ахулл
Чт 29 декабря 2016 г., 10:58 утра
Выглядит очень полезно. Я соблазнен...

Тот же показ MCUFriend, но даже дешевле -> http: // www.eBay.com/itm/tft-lcd-display ... SW5CNYGU4A

GBP 5.15 приблизительно 6 долларов США.30

Бьянкифан
Чт 29 декабря 2016 12:22
Squonk42 написал:Не интерфейс SPI, а не для RPI без добавления регистров смены, таких как...

Стивестронг
Чт 29 декабря 2016 г. 13:28
Бьянкифан написал: Хорошо, я тоже предпочитаю SPI, но я не понимаю всех этих усилий, чтобы получить RPI One Run... :?:

Squonk42
Чт 29 декабря 2016 г., 21:47
Это то, что я пытался выяснить, просматривая форум: каковы плюсы и минусы использования SPI VS. Интерфейс «8080» (8 Data + 5 управляющего сигнала)?

Конечно, SPI определенно использует меньше контактов (его можно смягчить, если вы рассмотрите сенсорный экран), но каковы последствия с точки зрения скорости?

DMA используется в обоих случаях, и если да, есть ли реальная выгода, используя его, или, насколько я понимаю, зависит ли это от того, как вы его используете?

Учитывая, что мы не можем позволить себе иметь буфер рамы внутри STM32, если мы добавим внешнюю оперативную память, как в комплектах Discovery (я действительно сомневаюсь...), используйте метод спрайта, чтобы проклить прямоугольные области в контроллер, или нарисовать графические элементы на лету или даже пиксель с помощью пикселя, попытаться буферизировать и т. Д.?

Стивестронг
Чт 29 декабря 2016 г., 22:06
Ну, это сильно зависит от приложения.
В случае обычного использования, чтобы нарисовать некоторые кнопки и немного текста, вам не обязательно понадобится DMA.
Если вы прочитаете первый пост в этой теме, вы понимаете, что с текущей Spi Lib, при использовании DMA нет усиления скорости.

Интересно сравнить (графический тест) две платы с идентичным контроллером и разрешением, одна из которых управляется SPI, а другая - параллельно 8/16.

Поскольку у меня есть только один 240x320 8 -битный параллельный (ILI9327) дисплей и один дисплей 320x480 SPI (ILI9486), сравнение не очень актуально.
Как ссылка, мой эталон для 8 -битной параллельной.

DMA будет иметь смысл только в приложениях, где вы могли бы последовательно использовать время, используемое DMA для написания в SPI для других целей. В этом случае плотина должна быть буферирована.
В настоящее время я работаю над методом буферизации, есть еще некоторые ошибки для решения.

В качестве предварительной информации, рисование символов с буферным DMA вызывает огромное снижение скорости (200-300%)... Накладные расходы для хранения данных пикселей в буфере делают чертеж намного медленнее, чем с простым рисунком без буферированного DMA.

Rogerclark
Чт 29 декабря 2016 г., 11:56 вечера
Squonk42 написал:....

DMA используется в обоих случаях, и если да, есть ли реальная выгода, используя его, или, насколько я понимаю, зависит ли это от того, как вы его используете?

..

Rogerclark
Пт 30 декабря 2016 г. 12:06
КСТАТИ.

Re: качество этих дисплеев

Это выглядит так, как будто их можно спасти от старых мобильных телефонов, у меня были подобные проблемы с дисплеями Nokia 5110 от eBay, поскольку многие из них на самом деле не «новые» (как рекламируется), они спасаются и часто даже не очищаются. Так были освещены в любой грязи в форме мобильного телефона годы использования

victor_pv
Пт 30 декабря 2016 г., 4:13
Стивестронг написал: В качестве предварительной информации, рисование символов с буферным DMA вызывает огромное снижение скорости (200-300%)... Накладные расходы для хранения данных пикселей в буфере делают чертеж намного медленнее, чем с простым рисунком без буферированного DMA.

Стивестронг
Пт 30 декабря 2016 г., 9:34
victor_pv написал: Другой способ воспользоваться преимуществами - не использовать основную функцию DMASEND, а скорее написать свою собственную, где вы устанавливаете все общие параметры только один раз (круглый буфер, адрес для буфера, включение DMA для периферического и т. Д.), где единственное, что вам нужно для DO устанавливает длину передачи и стреляйте в DMA, поскольку остальные параметры все время одинаковы, и не нужно каждый раз включать и отключать DMA, установить ISR или что -то еще, что является обычным явлением.

Squonk42
Пт 30 декабря 2016 г. 9:35 утра
Стивестронг написал:Если вы прочитаете первый пост в этой теме, вы понимаете, что с текущей Spi Lib, при использовании DMA нет усиления скорости.

Стивестронг
Пт 30 декабря 2016 г., 9:52 утра
Я думаю, что математика довольно проста: если вы можете переключить данные параллельно быстрее, чем (скорость SPI)/(8*nr_bytes), тогда переключение быстрее.

Допустим, у вас есть 8 -битный параллельный интерфейс, и один байт передается в пределах 1USEC; Это эквивалентно скорости SPI 8 МГц. Любая скорость SPI выше этого - победитель.
Для 16 -битного параллельного интерфейса, если перенос 1 слова длится 1 USEC, то это равняется скорости SPI 16 МГц. Приложение, в котором часы SPI составляют 36 МГц, более чем в 2 раза быстрее.
В котором 16 -битный параллельный интерфейс в 2 раза быстрее, чем 8 -битный параллельный интерфейс.

Для параллельных передач, для расчета одной передачи данных, вы должны добавить время, чтобы записать данные в порт IO (в идеальном случае у вас есть все контакты данных на одном и том же порре GPIO), время для установки линии WR, а затем установите WR Снова высоко.
Для простоты я предполагаю, что написание адреса окна займет такое же количество времени как в серийном, так и в параллельном.

Ваше сравнение имеет смысл только в том случае, если вы сравниваете одно и то же программное обеспечение GraphicStest, работающее на одной и той же плате контроллера (MM или Blue Pill), контролируя тот же контроллер дисплея (ILI9341?), управление тем же разрешением дисплея (320x240) в двух разных режимах (параллельные и серийные с максимально возможной скоростью).
Кстати, где вы взяли параллельный эталон ILI9341 от?

Squonk42
Пт 30 декабря 2016 г., 11:19
От тебя ;)
http: // www.STM32duino.com/viewtopic.PHP ... 180#P17524

Но, как я уже сказал, это действительно сравнивает яблоки с апельсинами, и для того, чтобы результаты были значимыми, вам нужно будет убедиться, что все другие параметры (контроллер, размер экрана и т. Д.) последовательны.
Стивестронг написал:Допустим, у вас есть 8 -битный параллельный интерфейс, и один байт передается в пределах 1USEC; Это эквивалентно скорости SPI 8 МГц. Любая скорость SPI выше этого - победитель.

Стивестронг
Пт 30 декабря 2016 г. 11:56 утра
Squonk42 написал:От тебя ;)
http: // www.STM32duino.com/viewtopic.PHP ... 180#P17524

Squonk42
Пт 30 декабря 2016 г. 13:07
Стивестронг написал:Если вы посмотрите на Scope Screenshot (Второй синий/голукий блок), вы заметите, что поток SPI непрерывный, контроллер не нуждается в создании дополнительной строки WR между последовательными данными пикселей. Это управляется аппаратным сериалом->Параллельная цепь на плате отображения.

Стивестронг
Пт 30 декабря 2016 г. 13:20
Squonk42 написал: На самом деле, он использует схему RC с t = 150 нс, которые могут или не маскированы следующим байтом, в зависимости от того, является ли WR Edge или Level, инициируемый в контроллере

Squonk42
Пт 30 декабря 2016 г. 13:33
Я посмотрел на источник драйверов низкого уровня (ADAFRIT_ILI9341_STM.CPP), и, учитывая возможность DMA, я подумал, что было бы интересно добавить новый метод «BliTrect», очень похожий на «заполнение», но это взяло бы свои исходные данные из прямоугольной области в RAM STM32 или Flash вместо немедленная ценность цвета.

Это обеспечит возможность передачи «спрайта», вырезанную из одного источника, содержащего изображение и перенесено через DMA на дисплей в желаемом положении назначения. При небольших модификациях это можно использовать и для фиксированного/переменного визуализации шрифта.

Вот предложенный прототип:
// blit a rectangular area from a source image void Adafruit_ILI9341_STM::blitRect(uint16_t *src, int16_t wrap, int16_t x, int16_t y, int16_t w, int16_t h);

Squonk42
Пт 30 декабря 2016 г. 18:14
Стивестронг написал:Squonk42 написал: На самом деле, он использует схему RC с t = 150 нс, которые могут или не маскированы следующим байтом, в зависимости от того, является ли WR Edge или Level, инициируемый в контроллере

Squonk42
Пт 30 декабря 2016 г., 18:20
Re 18 МГц ограничение скорости:

ILI9486 указывает время цикла WR 50 нс мин. (TWC в Таблица данных, стр. 212), таким образом, вы ограничены 20 МГц на стороне интерфейса 8080. Предел будет чипы HCT на данном VCC.

Стивестронг
Пт 30 декабря 2016 г., 21:25
Squonk42 написал:Re 18 МГц ограничение скорости:
ILI9486 указывает время цикла WR 50 нс мин. (TWC в Таблица данных, стр. 212)...

Стивестронг
Пт 30 декабря 2016 г., 21:32
Мне наконец удалось закончить буферированную версию DMA.
Ну, я не убежден, что это время.
Вот эталон:
Ili9486_spi_benchmark_compare.jpg
Ili9486_spi_benchmark_compare.JPG (185.66 киб) просмотрено 763 раза

victor_pv
Сб 31 декабря 2016 г. 1:03
О скорости GPIO существует ограничение в спецификациях, ниже 72 МГц. Я не помню этого сейчас, но может быть 50 МГц.
DMA может быть от памяти в память. Поскольку GPIO просто регистрируется в памяти, DMA может писать на параллельные порты. Я уверен, что у форумов STM есть несколько примеров, но в любом случае я не думаю, что это должно быть слишком сложным.
Помимо адреса назначения, который вы делаете круговым по одному адресу, соответствующему порту, на который вы хотите написать, остальная часть установки именно так, как мы делаем в функциях Spi dmasend. я.E:
Выберите канал DMA
Установите его на источник, назначение, увеличивается ли адреса или нет (не должен для DST, и должен для буферного источника)
Прикрепите ISR к каналу DMA
включить прерывание по завершению или наполовину завершено или оба
Пожарная передача
Если я помню правильные каналы в обоих контроллерах в STM32F103CBT может выполнять перенос MEM-MEM, что должно применяться к переносу MEM-GPIO.

Было много времени с тех пор, как я прочитал все вещи DMA, но это более или менее то, что я помню, если это может быть полезно.

РЕДАКТИРОВАТЬ:
Эта ветка была только что связана в другом обсуждении, и, как оказалось, точно показывает, как сделать передачу DMA в GPIO:
http: // www.STM32duino.com/viewtopic.PHP?F = 18&t = 1042

Это показывает, что пинг переключался при 4 МГц. Я почти уверен, что порты GPIO могут быть установлены на более высокую скорость, чем это, и я считаю, что есть более старая ветка, где Роджер упомянул больше деталей.

Стивестронг
Сб 31 декабря 2016 г. 8:31
Действительно, это кажется способом пойти.
В текущей версии переключение PIN -кода выполняется на «основном» уровне, что означает, что он удерживает основной уровень от своей работы.
Я постараюсь подтолкнуть адрес с адресом окна, чтобы быть обработанным исключительно с помощью DMA.
Но это выглядит очень сложно (почти невозможно) жениться на GPIO DMA со SPI DMA...

Стивестронг
Сб 31 декабря 2016 г. 10:14
Тем временем я сделал больше тестов для других размеров буфера, здесь результат:
Ili9486_spi_benchmark_compare.jpg
Ili9486_spi_benchmark_compare.JPG (197.61 киб) просмотрено 732 раза

Дэйвид.Прентис
Сб 31 декабря 2016 г. 14:08
Подумай об этом. У вас есть только три типичных операция:
1. Установите прямоугольное окно 1x1. Напишите один пиксель
2. установить прямоугольное окно. Напишите один и тот же цвет каждому пикселю. эн.глин. натяжение или заполнение
3. установить прямоугольное окно. Напишите разные цвета для каждого пикселя. эн.глин. PushColors от Flash или SRAM

Любая операция состоит из команды + переменной суммы данных. Вы должны установить штифт постоянного тока в нужное время.
DMA может иметь существенное значение для данных GRAM_WRITE часть (2) и (3)
Большинство других операций команды + данные имеют тривиальные по размеру и требуют установки контактного вывода DC.

Рисование изогнутых линий или прозрачного текста включает в себя отдельные вызовы DrawPixel ()
Тяжелый текст может использовать (3), но обратите внимание, что библиотека ADAFRIT_GFX не использует эту оптимизацию.

Насколько я вижу, ваш дисплей Rasppi не читается. Так не кажется очень привлекательным.
Я предполагаю, что ваш «36 МГц» означает, что F103 работает на уровне 72 МГц со SPI SCK на 36 МГц

Дэйвид.

Squonk42
Солнце 01 января 2017 11:50 утра
Стивестронг написал:Я думаю, что с короткими проводами от платы контроллера для отображения платы, часы SPI 36 МГц должны работать без проблем.
Плата предназначена для RPI, поэтому она должна поддерживать не менее 80 МГц.
Кстати, на борту - чипы HC, а не HCT.

Пито
Солнце 01 января 2017 12:16
В спецификациях существует ограничение, ниже 72 МГц. Я не помню этого сейчас, но может быть 50 МГц. 50 МГц касается «краев сигналов GPIO» - вы можете установить сильные стороны драйвера. Я думаю, что с короткими проводами от платы контроллера для отображения платы, часы SPI 36 МГц должны работать без проблем. Я управлял SDCARD на SPI1 @36 МГц с 21 см.. Используйте самые короткие провода, конечно, конечно ;)

Стивестронг
Солнце 01 января 2017 17:07
Squonk42 написал: Чипсы HC имеют минимальный Fmax :? 20 МГц @3.3v в худшем случае, поэтому все выше этого значения не может быть гарантировано.

Squonk42
Солнце 01 января 2017 18:32
Конечно, но типичные значения не могут быть гарантированы, только минимальные могут в этом случае.

Вы можете достичь 36 МГц с короткими проводами и прямым соединением без макета при 25 ° C, но вы рискуете (таким образом, поврежденный дисплей).

И я не вижу, как вы можете достичь надежной операции 80 МГц для RPI, используя эти чипы HC.

От Источники FBTFT, RPI выглядит так, как будто он управляет этим дисплеем @ 32 МГц, но он использует полный непрерывно обновленный буфер рамы, поэтому сбой не будет таким заметным, как в любом случае перерисованным на следующей кадре.

Дэйвид.Прентис
Солнце 01 января 2017 8:37 вечера
Я понимаю, что эта тема посвящена конкретному оборудованию определенного щита Rasppi.

Однако спецификация для нативного интерфейса SPI контроллеров Ilitek, похоже, говорит:
ILI9320: TSCYCW >= 100ns, tscycr >= 200ns.
ILI9325: TSCYCW >= 100ns, tscycr >= 300NS.
ILI9325D: TSCYCW >= 50uS, TSCYCR >= 200uс. // Конечно, должно быть опечатка
ILI9341: TWC >= 100NS, TRC >= 150NS.
ILI9481: TWC >= 100NS, TRC >= 300NS.
ILI9486: TSCYCW >= 66ns, tscycr >= 150NS.

Это подразумевает, что вы можете поддерживать частоту SCK <= 120 МГц для ILI9486
Или <= 80 МГц для ILI9341 и ILI9481

Мой опыт работы с ILI9341, кажется, проверяет 80 МГц в порядке с ESP8266.
STM32F103 в любом случае ограничен SCK = 36 МГц.

У меня нет расппи. У меня нет Rasppi TFT Shield.
Все они используют 74HC4040 и 74HC4094?
Или другая схема регистрации смены?
Или некоторые используют обычный интерфейс SPI?

У меня есть Spi ili9320. Сигнал постоянного тока находится в байте побега. Так что это выглядит более поддающимся DMA. Я никогда не пробовал это.

Дэйвид.

victor_pv
Солнце 01 января 2017 8:54
У меня есть Spi ili9320. Сигнал постоянного тока находится в байте побега. Так что это выглядит более поддающимся DMA. Я никогда не пробовал это. Это интересно! Интересно, какие другие контроллеры ILI имеют то же самое. Это может сделать действительно быстрые драйверы отображения даже с небольшими буферами и минимальным использованием ЦП.

Только что посмотрел на таблицу данных ILI9341 и поддерживает режим без линии D/C, я думаю, что есть некоторая резка трека и паяль для реконфигурирования дисплея. Похоже, последовательный режим без линии DC в ILI9341 - это последовательный 9 -битный, который усложняет вещи другими способами :(
Все еще интересно для тех, кто поддерживает его.

Дэйвид.Прентис
Солнце 01 января 2017 21:17
Несколько контроллеров используют байт побега, который содержит значения DC и RW.
эн.глин. ILI9326, R61509 и другие не MIPI-контроллеры

Это медленнее, чем использование отдельных линий управления, но, по крайней мере, вы можете использовать 8-битное оборудование SPI.
Вам все еще нужно синхронизировать CS для следующей команды после взрыва данных.

Контроллеры MIPI, такие как ILI9341, имеют 9-битный серийный интерфейс.
Это кошмар с большинством микроконтроллеров. Очень немногие имеют переменную ширину SPI. И вы навсегда меняетесь между 9-битным 8-битным 16-битным SPI.

Все ли щиты Rasppi используют схему SPI до 8080, описанная в исходном посте?
16-битные модули чаще встречаются на рынке избытков. Часто нет доступа к линии IM#. Таким образом, вы не можете настроить их для Native SPI.

Дэйвид.

Squonk42
Солнце 01 января 2017 9:22 вечера
Дэйвид.Прентис написал:ILI9320: TSCYCW >= 100ns, tscycr >= 200ns.
ILI9325: TSCYCW >= 100ns, tscycr >= 300NS.
ILI9325D: TSCYCW >= 50uS, TSCYCR >= 200uс. // Конечно, должно быть опечатка
ILI9341: TWC >= 100NS, TRC >= 150NS.
ILI9481: TWC >= 100NS, TRC >= 300NS.
ILI9486: TSCYCW >= 66ns, tscycr >= 150NS.

Это подразумевает, что вы можете поддерживать частоту SCK <= 120 МГц для ILI9486
Или <= 80 МГц для ILI9341 и ILI9481

Дэйвид.Прентис
Солнце 01 января 2017 21:46
Мои извинения. Да, конечно, диаграммы показывают время цикла SCK, а не время байтового цикла.
Так что все мои «частоты» неверны в 8.

Сказав это, реальные контроллеры ILI9341 с интерфейсом SPI, похоже, работают надежно при 80 МГц!
И если вы используете интерфейс 8080, TWC = 66NS, TRCFM = 450NS. И эти значения отражаются в реальной жизни. Вы получаете глюки, если вы бежите слишком быстро.

Я обладаю ILI9225, ILI9320, ILI9341 с 4-проводным SPI, ILI9481 с 3-проводным SDIO (двунаправленный)
Модули SPI встречаются реже, чем параллельно 8080.

Дэйвид.

Squonk42
Солнце 01 января 2017 22:26
Без проблем!

Да, из-за этого, быстрые схемы экрана TFT используют 8 или 16-битные параллельные режимы, поскольку встроенный контроллер 3 или 4-проводные режимы SPI получают примерно одинаковую скорость переключения, вы получаете производительность передачи, разделенные на 8 или 16.

Тем не менее, Rasppi Shield, обсуждаемый здесь. Импульс WR автоматически генерируется 74HC4040, но недостаток в том, что нет режима чтения, поскольку RD не контролируется и не связан с VCC. Не проблема для Rasppi, поскольку он сохраняет внутренний полнокадровый буфер, а скорее раздражает при использовании буфера, как здесь, так как он предотвращает режим прозрачности чтения перед записями.

И хотя Rasppi управляет SPI @ 32 МГц, который выше гарантированной максимальной частоты, он все еще находится в типичных достижимых, и, как снова PI использует полный кадритный буфер с непрерывным обновлением, сбой будет невы То, как использует библиотека TFT Arduino, она полностью отличается, и нажимать частоту передачи в пределах приведет к поврежденным отображениям (если в режиме данных) или может повесить контроллер (если в режиме регистрации).

Тем не менее, я действительно удивлен, что ESP8266 может управлять ILI9341 на 80 МГц. Я знаю, что его процессор выполняется на этой скорости, и что он может быть разбросан до 160 МГц без проблем, и что шина SPI может также достигать скорости 80 МГц и содержит глубокие FIFOS, способные не отставать от скорости передачи вспышки SPI, но это возможно, только если вы используете SPI в главном режиме с DMA. Вы измерили эту фактическую скорость с помощью осциллографа?

Дэйвид.Прентис
Солнце 01 января 2017 22:55
Нет, я не измерил это. И это не мой код. Я просто устанавливаю IDE на часы @ 160 МГц и использовал библиотеку Bodmer's TFT_ILI9341_ESP.

Кажется совершенно правдоподобным, что контроллер может выполнить команду в x ns.
Получил ли он команду на автобусе 8080, 6800 автобус, SPI, ... нематериально.

Во всяком случае, он должен быть в состоянии реализовать свой SPI быстрее и эффективнее в своем собственном кремнии. OTOH, TWRH = 40NS и TWRL = 40NS четко показывают ограничения скорости SCK.

У меня нет быстрого анализатора осциллографа или логики. Но это должно быть достаточно просто, чтобы просто полагаться на ILI9341 FillScreen () Times. я.эн. 240 x 320 x 16 бит / частота SCK = 16 мс при 80 МГц.

Тест Adafruit составляет 5 заполнителей, поэтому я должен ожидать 80000us.
Для дисплея Стива Стронга 320x480 @ 36 МГц я ожидаю 342000us. И это именно то, что он получил!

Вместо ошибочных спекуляций я буду проверять эти цифры с настоящим оборудованием завтра.

Дэйвид.

Squonk42
Пн, 02 января 2017 г. 7:10 утра
Да, продолжительность заливного экрана () кажется хорошей метрикой для измерений скорости необработанной шины, так как он добавляет лишь небольшие накладные расходы к массивной передаче пикселей.

Пожалуйста, дайте нам знать о результатах!

Дэйвид.Прентис
Пн, 02 января 2017 г. 9:01
Ну, я запустил эскиз. FillScreen сообщил:
162024us для 80 МГц
157946) для 160 МГц

Итак, я первым предполагает, что библиотека Бодмера использует библиотеку SPI. И библиотека SPI ограничивает частоту SCK до 40 МГц. Редактировать. Bodmer's user_setup.H файл определяет максимум 40 МГц для SCK

Иточи для всех тестов ADAFRIT.10 с 80 МГц и 1.66S за 160 МГц.
Это подразумевает, что более быстрая скорость расчета улучшает время. Тест линий является интенсивным расчетом:
320608us для 80 МГц
202668us для 160 МГц

В идеальном мире все расчеты выполняются в то время, когда DMA Bliting the Bus.
я.эн. Вы ограничены исключительно скоростью автобуса.
Все чипсы рук способны к "без разрыва" SPI. Таким образом, вы можете достичь полной скорости SPI без DMA. Заличный экран не требует работы. Я должен быть в состоянии получить то же время без DMA

У периферийного устройства AVR SPI всегда есть "пробелы". Периферийное устройство AVR USART_MSPI может достичь полной скорости без пробелов. Конечно, вам нужна хорошая библиотека Arduino SPI, чтобы получить максимум от аппаратного обеспечения.

Время для чашки чая. И проверка библиотеки Бодмера.

Я предсказываю серьезный скромный пирог. я.эн. Мои предыдущие утверждения о 80 МГц SCK выглядят довольно глупо.

Редактировать. Я могу установить MAX SCK на 80 МГц в user_setup.час. Это должна быть особенность ESP8266, которую вы можете запустить периферийную программу SPI при 80 МГц, даже если ядро ​​процессора составляет всего 80 МГц.
Я получаю 82919US/82011US для заполнения экрана. 305250us/180745us для линий
Это подтверждает скорость шины 80 МГц. Линии, иллюстрирующие мощность процессора.
Бодмерс сказал, что он получает случайные сбои с SCK = 80 МГц. Я запускал свой стандартный "graphictest_kbv.Ино "эскиз через класс клея. Я не наблюдал никаких сбоев. Я знаком с тем, где могут возникнуть глиши из моих параллельных целей.

Я ошеломлен производительность ESP8266. Тем более по хорошим поведению ILI9341.
Все тесты Adafruit включают несколько петель. «Время», вероятно, будет рассчитано до того, как DMA фактически завершится. Это должно быть относительно незначительным.

Дэйвид.

Стивестронг
Пн, 02 января 2017 г. 9:57 утра
Как только примечание:
Одна проблема, которую я столкнулся при запуске наброска GraphicStest, относительно времени измерения: это имеет разницу, когда вы выбираете время окончания теста. При запуске в режиме DMA «Fire and Forge» (означает, что вы не ждете окончания работы DMA на основном уровне), может случиться так, что DMA все еще работает на фоне, в то время как основной уровень сообщает о конце теста. Разница может быть значительной в тесте на заливном экране, когда целый экран очищается в 3 частях из -за структуры SMT32 DMA, что позволяет только до 0xffff числа передач для одного задания (480x320 = 153600 = 65535+65535+22530). Таким образом, измеренное время может пропустить последний поезд.

Текущий Spi Lib of arduino_stm32 уже "без пробелов" в режиме не-DMA. Вот почему весь графический тест (кроме одного) без DMA работает равный или лучше, чем с DMA, из -за отсутствия накладных расходов DMA.

Дэйвид.Прентис
Пн, 02 января 2017 10:23
Простой способ выполнения DMA - иметь один канал. Вы можете делать тяжелые вычисления, пока заполняется экран. Следующая задача DMA не начнется до тех пор, пока предыдущий выпран DMA не завершится.

Похоже, у вас есть целый список рабочих мест DMA, которые находятся в очереди. Это должно быть очень эффективным, если у вас есть большая работа DMA.

Тем не менее, задание dlavpixel () имеет 4-байтовый набор адресов столбца, 4-байтовый адрес адреса столбца, 2-байтовый пакет данных записи данных. Каждый с 1-байтовым командным пакетом.

Я сомневаюсь, что вы получите много преимущества от DMA.

Дэйвид.

Стивестронг
Пн, 02 января 2017 г. 10:27 утра
Дэйвид.Прентис написал: Я сомневаюсь, что вы получите много преимущества от DMA.
Дэйвид.

Бьянкифан
Пн, 02 января 2017 г. 10:58
Стивестронг написал:Бьянкифан написал: Хорошо, я тоже предпочитаю SPI, но я не понимаю всех этих усилий, чтобы получить RPI One Run... :?:

Стивестронг
Пн, 02 января 2017 г. 11:01
@bianchifan,
Ваша доска 8 -битная параллельна.
Здесь мы обсуждаем дисплеи, управляемые SPI.

Бьянкифан
Пн, 02 января 2017 г. 11:50 утра
Стивестронг написал:Ваша доска 8 -битная параллельна.

Дэйвид.Прентис
Пн, 02 января 2017 г., 11:52
Ваш синий щит Uno Display содержит 8-битный параллельный ILI9481.
У него нет сенсорной панели.

Дэйвид.

Стивестронг
Пн, 02 января 2017 г. 11:53
Бьянкифан написал:Стивестронг написал:Ваша доска 8 -битная параллельна.

Бьянкифан
Пн, 02 января 2017 г., 11:57
Дэйвид.Прентис написал:У него нет сенсорной панели.

Стивестронг
Солнце 08 января 2017 г. 9:13
Итак, мне удалось установить BP очень близко к плате дисплей.
К сожалению, @Squonk42 был прав: низкая длина проводов не компенсировала «плохие» динамические характеристики чипов HC при 36 МГц.
Проблема: чипсы HC поставляются с наборными сгенерированными 3.3В.
Я попытался ярлык на борту 3.3V регулятор, поставляя чипы HC непосредственно 5V и, вуаля, он начал показывать «нормальную» картинку, без артефактов.Это означает, что чипсы HC не могут работать на 3.3 В с 36 МГц.
Хотя я узнал, что SN74LV4040A может работать в 2.5 В с мин. 40 МГц, я сомневаюсь, что будет иметь смысл заменить оригинал на это, потому что я не мог найти какую -либо более быструю замену для 4094. Кто -нибудь знает об этом больше?

Я не вижу, как любой RPI будет работать правильно с этим дисплеем в 40 МГц, без каких -либо взломов HW. Я видел блоги где было предложено использоваться довольно 16 МГц, это звучит намного более реалистично. Кроме того, есть несколько версий таких досок, возможно, есть другие с лучшими характеристиками/контроллерами.

ВОПРОС: Можно ли генерировать частоты SPI 24 МГц на BP? Может быть, путем разгона или других «нетрадиционных» методов?
В противном случае я вижу себя вынужденным удалить чипсы HC с платы дисплея и управлять дисплеем с 16 битами, параллельными непосредственно с BP (с помощью PB0..15).

Пито
Солнце 08 января 2017 г. 9:58 утра
ВОПРОС: Можно ли генерировать частоты SPI 24 МГц на BP? Может быть, путем разгона или других «нетрадиционных» методов? С недостатком 48 МГц USB тоже будет работать.
С разгрузкой до 96 МГц все может работать нормально.

Например, GD делает это в досках.текст genericGD32F103C.menu.cpu_speed.speed_96mhz=96Mhz (Stable) genericGD32F103C.menu.cpu_speed.speed_96mhz.build.f_cpu=96000000L

Стивестронг
Солнце 08 января 2017 10:09
@Pito, где я могу найти информацию, как разгонять до 96 МГц рядом этот?
Пошаговое описание не повредит :), Кроме того, поддержание USB было бы неплохо, но не жизненно важным.

Пито
Солнце 08 января 2017 10:19
Я тоже собираюсь разгонять Zet6, см. Выше мой пост.
Я сделал это в 100 раз, но в других средах. Это очень легко с чибиосом или с оригинальными ST Libs.
Вы просто измените множитель PLL с 9 на 12 в настройке в нашем случае.

Установка SW обычно записывается такова, что настраивает все остальные настройки. Не уверен, как это работает здесь. Основные парни должны сказать.
Я всегда позволял настройкам вспышки (Flash Waitdatates) как есть, так как разрыв до 96 МГц невелик, а 103c будет работать с 96 МГц.

Пито
Солнце 08 января 2017 10:27 утра
@Pito, где я могу найти информацию, как разгонять до 96 МГц рядом с этим? Как грязный взлом, попробуйте в boards_setup.CPP для BP // Allow boards to provide a PLL multiplier. This is useful for // e.g. STM32F100 value line MCUs, which use slower multipliers. // (We're leaving the default to RCC_PLLMUL_9 for now, since that // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL #define BOARD_RCC_PLLMUL RCC_PLLMUL_12 #endif

Rogerclark
Солнце 08 января 2017 10:38 утра
Взгляните на доску GD32F103 и вариант.

Я добавил скорость процессора в этот вариант, так как он будет работать в более широком диапазоне частот, сохраняя при этом USB.

К сожалению, STM32F103 будет работать только на уровне 72 МГц или 48 МГц и по -прежнему запускается USB, так как USB -часы выполняются с основных часов (после того, как он был умножен), и есть только два значения разделителей (1.5 и 1.0)

Пито
Солнце 08 января 2017 10:55 утра
С моим вышеупомянутым взломом USB прекращает работу, как указывает Роджер, с Serial1 он не устанавливает правильный Uart Baudrate, но код работает, он кажется..
Когда я добавляю процессор FREQ #ifndef BOARD_RCC_PLLMUL #define BOARD_RCC_PLLMUL RCC_PLLMUL_12 #define F_CPU 96000000 #endif

Пито
Солнце 08 января 2017 11:37
Добавление настройки скорости частоты процессора в инструменты-> меню:
============================================================================= ============

Добавить ..\ Arduino_stm32 \ stm32f1 \ boards.TXT в варианте BPILL (103C) в:
###################### Generic STM32F103C ######################################## .. #---------------------------- UPLOAD METHODS --------------------------- .. <<<<<<<< HERE

Стивестронг
Солнце 08 января 2017 12:27
Спасибо, Пито, мне удалось изменить часы SPI на 24 МГц (см Мой пост здесь как).

И дисплей работает нормально при 24 МГц !

И USB тоже работает. ЦП запускается с 48 МГц, но так же быстро, как и с 72 МГц, потому что я установил состояние Flash Wait Down до 1.

Пито
Солнце 08 января 2017 12:34
Отличный Стив, ты тоже удвоил мой гид :) :)
Я запускаю свой 103Zet6 на 128 МГц :)
В прошлом я управлял F100 (DiscoveryVL) при 56 МГц с 0WS. Стандарт 24 МГц.. Некоторые тесты действительно показали 56, чем F103 на 72.

Стивестронг
Солнце 08 января 2017 13:05
Здесь эталон со SPI = 24 МГц, процессор при 48 МГц, Флэша ожидания состояния = 0 (!!) ;) ,
с DMA: Benchmark Time (microseconds) Screen fill 497067 Text 66080 Lines 563363 Horiz/Vert Lines 58813 Rectangles (outline) 41143 Rectangles (filled) 502296 Circles (filled) 332981 Circles (outline) 441015 Triangles (outline) 129064 Triangles (filled) 490033 Rounded rects (outline) 154242 Rounded rects (filled) 1415779

Squonk42
Солнце 08 января 2017 13:59
Стивестронг написал:Здесь эталон со SPI = 24 кГц, процессор при 48 МГц, Флэша ожидания состояния = 0 (!!) ;)

Стивестронг
Солнце 08 января 2017 14:05
Но, конечно, спасибо, я исправил.

Дэйвид.Прентис
Солнце 08 января 2017 г. 15:26
Глядя на заполнение экрана: 320x480 пикселей должны занять не менее 10.2 мс для 16-битного параллельного интерфейса (TWC = 66NS)
Ваш тест имеет пять заливок экрана = 50.7 мс

Если вы включаете регистры смены при 24 МГц, это будет 320x480x16 бит = 103 мс или 520 мс для 5 заполнений.
Итак, вы достигаете оптимальных результатов от своего дисплея Rasppi.

Между прочим, эксперименты с ESP8266 и SPI ILI9341 дают надежные результаты до SCK = 80 МГц. Несмотря на то, что таблица данных четко указывает SCK = 10 МГц. Чтение Грамм надежно до SCK = 40 МГц.

«Нечитаемый» дисплей меня на самом деле не интересует. Тем не менее, было бы интересно посмотреть, насколько быстро будут работать ваши регистры смены. В конце концов, 16-битная параллель может быть в 10 раз быстрее.

Дэйвид.

Стивестронг
Солнце 08 января 2017 г., 17:20
Дэвид, мое первоначальное намерение было просто иметь один показ, который управляется SPI. У меня уже есть один дисплей 240x320, который имеет 8 -битный параллельный привод, и, конечно, намного быстрее, чем этот. Здесь я ограничен сериалом->параллельный преобразователь.

Я также играю с идеей преобразовать этот дисплей в 16 -битный параллельный.

Далее я проверю, если дисплеи будут работать со SPI на 32 МГц.

Стивестронг
Солнце 08 января 2017 г., 17:39
Ну, кажется, что 24 МГц - абсолютный предел. При 28 МГц (и выше) уже есть артефакты, которые следует увидеть.

Rogerclark
Солнце 08 января 2017 20:13
@stevstrong

Вы говорите, что более низкая частота такта, но состояния нуля ожидания быстрее, чем 72 МГц в штатах ожидания по умолчанию ?

Стивестронг
Солнце 08 января 2017 8:21 вечера
Rogerclark написал:Вы говорите, что более низкая частота такта, но состояния нуля ожидания быстрее, чем 72 МГц в штатах ожидания по умолчанию ?

Rogerclark
Солнце 08 января 2017 8:26 вечера
ХОРОШО.

Есть ли выгода для работы на уровне 48 МГц, за исключением слегка уменьшенного энергопотребления ?

Стивестронг
Солнце 08 января 2017 8:30 вечера
Да. Дисплей работает на максимально возможной поддерживаемой частоте SPI (24 МГц) : D

Rogerclark
Солнце 08 января 2017 8:42 вечера
Хорошо.

Можно ли разгонять дисплей на 36 МГц, как мы делаем для ILI9341?

(Я думаю, что, возможно, ответ - нет, иначе вы бы не попробовали 24 МГц)

Стивестронг
Солнце 08 января 2017 8:49 вечера
Узкое место - сериал->Схема параллельного преобразователя, рабочие частоты HC CHIP сильно ограничены напряжением питания.
Они поставляются на борту 3.3V адаптер питания. В 3.3V они поддерживают только до 24 МГц. Я проверил 28, 32 и 36 МГц, ни один из них не работает надежно.
Я пытался дать им 5 В, они работали лучше, но все еще не на 100% на 36 МГц.

Поэтому, если я действительно хочу ускорить дисплей, я должен управлять его чистой параллелью, прямой от BP (над PB0..15).
В противном случае придерживайтесь 24 МГц.

Или смягчить дисплей и управлять прямо в ILI SPI...

Стивестронг
Солнце 08 января 2017 21:31
Самое смешное, что некоторые из графиков (текст, строки и все контуры, где происходит многие пиксельные записи) работают лучше с более низкими часами SPI, но с более высокой частотой процессора, чем наоборот. OTOH, очевидно, большие блочные начинки быстрее с более высокими часами SPI, где частота процессора на самом деле не учитывается.
Так что это действительно зависит от приложения, какой вариант следует использовать.

Rogerclark
Солнце 08 января 2017 11:11
@stevstrong

У меня было ощущение, что 72 МГц может быть быстрее, даже если переводы медленнее. Так что это будет очень сильно зависеть от вашего приложения, так как 72 или 48 было быстрее

Для большинства вещей, включая низкую работу, обычно кажется, что запуск процессора как можно быстрее лучше всего, и для низкой мощности поместите процессор в режим ожидания / низкой мощности, когда не обработайте.

(В моем случае проекта с низкой мощностью он не стоил усилий, чтобы спуститься по методу низкой мощности / резервной системы, поскольку программирование для расчета постоянно изменяющегося времени сна, в зависимости от частоты пульса, в конечном итоге стало очень сложным,, и не стоит головной боли для сохранения мощности 1 или 2 мА ;-)

Дэйвид.Прентис
Пн, 09 января 2017 г. 10:36
Стивестронг написал:Самое смешное, что некоторые из графиков (текст, строки и все контуры, где происходит многие пиксельные записи) работают лучше с более низкими часами SPI, но с более высокой частотой процессора, чем наоборот. OTOH, очевидно, большие блочные начинки быстрее с более высокими часами SPI, где частота процессора на самом деле не учитывается.
Так что это действительно зависит от приложения, какой вариант следует использовать.

Стивестронг
Пн января 09, 2017 10:50 утра
Дэвид, я согласен, что оптимальным решением будет максимальный процессора. в сочетании с макс. Поддерживаемые часы SPI. К сожалению, это не всегда возможно, как в случае общего F103.
Мой стол на ~ 20 ° C.
Чипы HC будут работать нормально при 28 МГц, проблема заключается в том, что задержка распространения сигнала через ICS, а не тактовая частота как таковая.
Чем выше часы SPI, [Чем дольше задержка] Чем сильнее влияние задержки распространения, так что самогенерированный сигнал WR с помощью чипа 4040 слишком сильно смещается по сравнению с выходными сигналами 8-битного серийного->Параллельное изменение 4094 чипсов. Это своевременное несоответствие вызывает на самом деле неприятности выше 24 МГц. Я мог бы попытаться заменить только чип 4040 на более быстрый, и посмотреть, что произойдет.

РЕДАКТИРОВАТЬ
Кстати, что касается вашей рекомендации по ускорению смены ICS (74VHC595), я думаю, что это не совместимо с PIN с 4094, что было бы обязательным требованием.

Squonk42
Пн, 09 января 2017 13:35
Стивестронг написал:Чем выше часы SPI, тем дольше задержка, так что сигнал самогенерированного WR с помощью чипа 4040 слишком сильно сдвинулся по сравнению с выходными сигналами 8-битного сериала->Параллельное изменение 4094 чипсов. Это своевременное несоответствие вызывает на самом деле неприятности выше 24 МГц. Я мог бы попытаться заменить только чип 4040 на более быстрый, и посмотреть, что произойдет.

Стивестронг
Пн, 09 января 2017 13:47
@Squonk42, извините, но я не вижу, как эта комбинация RC может привести к «негативному» сдвигу...
Как только сигнал будет слишком задержан, я не думаю, что эта сеть может вернуть ее пару наносекунд. Или у вас есть некоторые результаты моделирования, которые подтвердили бы противоречие?
РЕДАКТИРОВАТЬ
Я думаю, что объем RC состоит в том, чтобы принести две задержки (из 4040 и из 4094) снова синхронизировать.
Согласно спецификациям, 4094 имеет более высокие типичные задержки распространения при 25 ° C (CP->QPN = 63, 23, 20), чем 4040 (часы->Q1 = 47, 17, 14). Это означает, что сигнал от 4040 должен быть дополнительно задержан.
Я мог бы привести выходной сигнал с 4040 до 2 дополнительных ворот инвертора (74HC04 на борту).
Один ворота HC04 имеет типичную задержку распространения в->Из (25, 9, 7). Это означает, что один ворота покрывает разницу между 4040 и 4094.
Но мне нужно два врата, чтобы иметь правильную полярность сигнала WR... :(
Я думаю, что куплю дополнительную 74HC4050 (шестнадцатеричные не инверторные ворота), имея ту же задержку, что и на борту 74HC04, это будет равным задержкам и принесет правильную полярность для WR.
: идея: Второй инвертор компенсирует задержку с первых 4094 до второго 4094...может быть...
В любом случае, я попробую.

Дэйвид.Прентис
Пн, 09 января 2017 г. 15:46
Если я не потерял график, восходящая кромка WR включает параллельные данные в ILI9486.
4040 создает восходящий край на 16 -м Pulse SCK.
4094 переводит все биты в их окончательную стабильную позицию на 16 -м Pulse Pulse.

TDST = 10NS, что означает, что вам нужна задержка распространения 4040 >= 10NS BEED 4094 Распространение. Другими словами, вы либо используете более быстрый регистр смены (или более медленное счетчик).
Или намеренно откладывает 4040 на дополнительные 10NS через ворота или RC.

Дэйвид.

Стивестронг
Пн, 09 января 2017 г. 16:07
Дэвид, извините, что такое TDST? Я не мог найти его в спецификациях 74HC4040 и 74HC4094.
Я говорил о TPD, TPLH/TPHL (задержки распространения) между входом тактовой передачи и выводом данных.
Минимальная ширина импульса TW, которая ограничивает входную тактовую частоту, как для 4040, так и для 4094 около 10NS (типичное значение, которое, как я признаю, может быть критическим, поскольку минимальное значение намного хуже :( ) в 3.3v, что означает, что они должны работать с частотами до (10^6)/(2xtw) = 50 МГц. Таким образом, 36 МГц может быть теоретически, в типичном случае, возможно.
Дэйвид.Прентис написал:Другими словами, вы либо используете более быстрый регистр смены (или более медленное счетчик).
Или намеренно откладывает 4040 на дополнительные 10NS через ворота или RC.

Дэйвид.Прентис
Пн, 09 января 2017 г., 17:01
Извини. TDST - это время настройки данных перед активным краем /wr в параллельном интерфейсе 8080. (ST7789 Номенклатура. В таблице данных ILI9486 может использовать другую аббревиатуру)

Насколько я вижу, запасы HC4040 собирается произвести сигнал WR до HC4094 загрузил регистр сдвига. я.эн. Это будет неправильно для ILI9486, а также неправильно для HC4094, чтобы зафиксировать регистр смены.

Принимая во внимание, что существует терпимость к значениям времени, порядок сигналов должен подчиняться.

Дэйвид.

Стивестронг
Пн, 09 января 2017 г., 21:25
ХОРОШО. Забудьте о спецификации...

Прицел ясно показывает, что 4040 имеет огромную задержку распространения (около 40 Н !!), который представляет собой период SPI в 25 МГц!
Таким образом, мы не должны задаться вопросом, что все выше 24 МГц не будет работать...

Теперь я использовал некоторые из свободных ворот инверторов из встроенного чипа HC04, чтобы отложить сигналы часов и MOSI с ~ 20NS (2*10NS, 10NS-задержка одного затвора инвертора) и и и...вуаля... это становится намного лучше.
Теперь, по крайней мере, координаты передаются правильно, что не работало раньше.

Тем не менее, существует задержка периода часов на 36 МГц между WR и данными. Это означает, что данные о цвете отображаются как существо, сдвигается на один бит налево. Например, если я хочу красный цвет (0x8000), контроллер дисплея будет выбран 0x0001 из -за этой задержки распространения в течение одного периода.

В качестве обходного пути я могу только представить, что задержка SCK и MOSI сигнализирует еще один ~ 20N, используя другие пары дополнительных инверторов. Для этого я должен использовать дополнительный чип.

У кого -нибудь есть лучшая идея, кроме схемы RC?

Дэйвид.Прентис
Пн, 09 января 2017 11:37
Если у вас есть двухканальный прицел, вы можете наблюдать за часами SCK и сигналом защелки /WR.

Я предполагаю, что у вас есть SPI, настраиваясь на колебание /CS каждые 16 битов.
Это сбрасывает 4040, чтобы снова подсчитать до 16.

Или вы отправляете непрерывный SCK и просто надеетесь, что защелка /WR работает каждые 16 битов?
Пока защелка работает до следующего SCK, вы должны оставаться синхронизированными.

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

Дэйвид.

Стивестронг
Вт 10 января 2017 г. 9:10
Есть два разных случая:

1. Настройка адреса окна для следующих данных
Я делаю это в одном 8 -битном доступе, в котором я оптимизировал настройку CS и управления/вывод данных в одном доступе к регистре BSRR. Эта оптимизация, которую я должен был удалить, потому что сигнал строба WR будет либо генерироваться на 16 -м импульсе CLK, либо на рамке CS (это будет мастер -сбросить счетчик 4040, и, следовательно, все выходные контакты будут немедленно установить на 0). Таким образом, если рельеф WR (CS IDLE) происходит после изменения управления/данных (из -за задержки распространения), контроллер получает неправильное управление/выбор данных. Я только что добавил дополнительную задержку после простоя CS и перед настройкой управления/данных, чтобы преодолеть проблему задержки. Это, конечно, негативно повлияет на общую скорость скорости.

2. непрерывное 16 -битное написание данных
В этом случае я не имею большого влияния, на стороне HW должно быть гарантировано, что выходной импульс 4040 поступает в правильное время сразу после 16 -го бита SCK. И именно это то, что в данный момент имеет решающее значение. Я надеюсь, что решите это с дополнительными задержками для SCK и MOSI, как упоминалось ранее.
Используя RC, я вижу это немного критично, потому что задержки должны быть идентичными для обоих сигналов.

Бьянкифан
Вт 10 января 2017 г. 10:01
Стивестронг написал:Поэтому, если я действительно хочу ускорить дисплей, я должен управлять его чистой параллелью, прямой от BP (над PB0..15).
В противном случае придерживайтесь 24 МГц.

Или смягчить дисплей и управлять прямо в ILI SPI...

Стивестронг
Вт 10 января 2017 г. 10:28 утра
Эта схема генерирует импульсы команды/данных и WR непосредственно из данных SPI, что означает, что можно обрабатывать все элементы управления и передачи данных с помощью SPI + DMA, нет необходимости в отдельном переключении GPIO. Единственный недостаток: вам нужен один (или, может быть, 2) дополнительные байты SPI для управляющих битов, так что даже если вы управляете интерфейсом SPI при 32 МГц, он даст вам только эквивалент 24 МГц (16 МГц). И вы должны заранее подготовить поток данных, чтобы переплетать контрольные байты с байтами данных.

Но то, что я нашел более интересным, это то, что переключения (HC595) поставляются с 3.8 В (!), что встроено с моим наблюдением (и спецификацией), что эти чипы нуждаются в более высоком напряжении питания, чтобы поддерживать более высокие скорости (выше 24 МГц).

Спасибо, @bianchifan, это подводит меня к той же идее, чтобы попробовать такое более высокое напряжение снабжения в моем случае. Может быть, я смогу компенсировать оставшуюся задержку распространения с этим увеличенным напряжением питания, не включая дополнительные ворота инвертора.

Пито
Вт 10 января 2017 12:26
Поместите все это в xc9536xl, это 3.3 В и 80 МГц штраф. Morever это на 100% маршрутизируемое, поэтому вы можете изменить макет штифта по своему желанию (можно использовать 34 контакта). Также 5 В, толерантные входы.

Стивестронг
Вт 10 января 2017 12:45
Я думаю, что XC9536XL будет излишним для моих целей, чтобы вывести его из таблетки...Даже перегруженный до 96 МГц, SPI будет работать на 48 МГц, что, возможно, я могу заставить его работать с моими небольшими изменениями, используя задержки с фиксированным сигналом при определенном напряжении питания (5V было бы слишком много, но 3.8 В .. 4.2v может быть осуществимым).

Rogerclark
Вт 10 января 2017 г., 21:06
Пито написал:Поместите все это в xc9536xl, это 3.3 В и 80 МГц штраф. Morever это на 100% маршрутизируемое, поэтому вы можете изменить макет штифта по своему желанию (можно использовать 34 контакта). Также 5 В, толерантные входы.

Пито
Вторник 10 января 2017 г. 9:25 вечера
Xc9536xl - это половина размера этого Coolr, Coolr нуждается в регуляторе напряжения для ядра, XC95 не работает, у Coolr меньше пользовательского штифта меньше. Xc9536xl стоимостью $ 1 2y обратно.
Конечно, необходимы дополнительные усилия - Xil Ise 14.7, Verilog или схематический захват, программист.
Coolr была попыткой Xilinx произвести CPLD с «более низкой мощностью», чтобы они взяли XC9572XL и уменьшили напряжение ядра до 1.2V AFAIK, поэтому вам нужен дополнительный регулятор для ядра, и это стоило 1 PIN. В противном случае они равны, даже я думаю, что вы можете поместить больше логики в XC9572XL.

Rogerclark
Вт 10 января 2017 г., 21:35
Пито написал:Эти два равны по размеру, Coolr нуждается в регуляторе напряжения для ядра, XC95 не имеет, что Coolr имеет 1 -й PIN -код меньше. Xc9536xl стоимостью $ 1 2y обратно.
Конечно, необходимы дополнительные усилия - Xil Ise 14.7, Verilog или схематический захват, программист.

Пито
Вт 10 января 2017 г., 21:38
XC9536XL - это половина от Coolr, которую вы рекламируете, чип стоит около 1 доллара США. Так что это не может быть излишним :)
Чип работает >150 МГц внутри, при маршрутизации вы можете связываться с счетчиками, регистрами смены и любой логикой, которую вы хотите на 80-90 МГц. Логические парни нуждаются в около 10 строках Verilog, или, с схемой, захватывают ту же схемы, что и выше, так как библиотека включает в себя десятки компонентов, подобных тем, которые парни используют сейчас для TFT (почти все стандартные чипы TTL/CMOS, с которыми люди связываются)).
Хитрость заключается в том, что когда вы хотите что -то изменить в схемах - проводка или добавить компонент или инвертировать сигнал, или полностью изменить свой дизайн, вы делаете это на экране, а затем просто вспыхивают - тот же процесс, что и при arduino. У семьи XC9536XL есть флэш -память для проводки, программируется через JTAG.Цикл разработки составляет около 1-2 минуты, чтобы измениться и запустить. И чип на 100% маршрутируется, поэтому вы можете подключить свой TFT к любым вымыванию, которые вы хотите - он всегда соответствует вашему новому дизайну/схемам к существующей макете выводов на печатной плате (или, другими словами - ваш дизайн всегда может быть направлен на любой I/ o Настройка вывода, которую вы хотите).
Вот 32 -битный фрикметер/период/счетчик/счетчик в XC9572XL, я сделал 5y обратно на форум Arduino в качестве примера. Он включает в себя 2x16 -битные счетчики и 2x16 -битные регистры сдвига и некоторая логика (Arduino прочитал FREQ, измеренный от чипа, по секунду, только 7 контактов использовались). Кольцевой генератор (3 инверторов в петле) там выполнял 150 МГц.
32 -битный счетчик arduino.jpg
32 -битный счетчик Arduino.JPG (38.59 киб) просмотрено 692 раз

Rogerclark
Вт 10 января 2017 г. 11:03
@pito

Жаль, что никто не делает дешевую доску с XC9536XL на нем, поскольку для большинства людей не практично для припадения SMD


Пса.
Что делает часть схемы с 3 инверторами в серии ?

Martinayotte
Ср 11 января 2017 г. 14:26
Rogerclark написал: Что делает часть схемы с 3 инверторами в серии ?

Стивестронг
Ср 11 января 2017 г. 18:29
Вернуться к оригинальной теме ;)

Вот рабочая версия сериала->параллельный преобразователь:
3,5 дюйма TFT Serial -Parallel Converter.jpg
3.5 -дюймовый сериал TFT для параллельного преобразователя.JPG (135.46 киб) просмотрено 1047 раз

Пито
Ср 11 января 2017 г. 18:54
Rogerclark написал:@pito

Жаль, что никто не делает дешевую доску с XC9536XL на нем, поскольку для большинства людей не практично для припадения SMD


Пса.
Что делает часть схемы с 3 инверторами в серии ?

Rogerclark
Ср 11 января 2017 г., 19:06
Пито

Возможно, мы должны начать еще одну ветку для этого FPGA / CPLD материала.

Стивестронг
Ср 11 января 2017 г. 9:05 вечера
Спасибо, Роджер.
Просто хотел показать 2 фото, как легко заставить доску запустить на 36 МГц.
20170111_211409_1.jpg
20170111_211409_1.JPG (159.92 киб) просмотрено 1037 раз

Squonk42
Чт 12 января 2017 г. 22:05
Во всяком случае, STM32F103X8 / STM32F103XB DataShie Указывает максимальную частоту тактовой частоты SPI 18 МГц при температуре окружающей среды.

Конечно, вы можете разгонять SPI и достичь более высоких скоростей, но тогда вы рискуете...

Rogerclark
Чт 12 января 2017 г. 11:12
@stevestrong

Хорошо выглядит. Вещи часто не нужно реализовать, когда вы выясните, что делать. Однако это r&D, чтобы понять, что делать, это сложная и трудоемкая вещь.

@Squonk42

К счастью, скорость SPI SPI STM32 (и большинство других частей MCU) работают далеко за пределами его опубликованной спецификации.
Практически все, кто использует дисплей ILI9341 (вероятно, 100+ человек), запускают SPI на 36 МГц без проблем.

Я даже случайно управляю всем MCU на 5 В в течение нескольких дней, и это не нанесло никакого вреда !

Общий консенсус заключается в том, что STM32F103 довольно надежный ;-)

victor_pv
Пт 13 января 2017 г. 2:42
Стивестронг написал: Я понял еще одну еще одну проблему с использованием DMA: она делится одной и той же шиной данных в память с процессором, поэтому, если в процессоре есть много доступа к памяти, пока DMA работает на заднем плане, ЦП затем замедляется DMA.

Стивестронг
Пт 13 января 2017 г. 9:25 утра
Я еще не проверял свою местную версию (которая содержит неблокирующую DMA), но я сделаю это в ближайшие дни. Оптимизированная версия SPI без зазора SPI уже доступна в моем репо, и в качестве пиара для официального репозиции. Не знаю, удалось ли Роджер работать в этом.
Я все еще думаю, где должна иметь инициализацию SPI: за пределами драйвера ILI9486, на этапе настройки, до или внутри функции Driver ()?

@Squonk42
Что касается скорости SPI, я не знаю, откуда вы получаете информацию о Макс. 18 МГц.
На стр. 691 RM0008 написана:
"8 Master Mode Sceed Sate Prescalers (fpclk/2 max.) »
Это означает, что если fpclk составляет 72 МГц, что является «нормальной» частотой, то, очевидно, мы говорим о 36 МГц «нормальной» скорости SPI_1. Макс. 18 МГц действителен только для SPI_2.
Конечно, с разгоном можно достичь еще более высоких скоростей, которые затем выходят за рамки спецификации, но все еще работают, когда Роджер говорил о надежности чипа.

Пито
Пт 13 января 2017 г. 9:34
103xx DataShief, Docid14611 Rev 12, P.99
SPI 103.jpg
SPI 103.JPG (83.85 киб) просмотрено 988 раз

Стивестронг
Пт 13 января 2017 г. 9:41
Хороший.
Итак, ошибочно интерпретирую RM0008 или таблицы данных содержат противоречивую информацию?
Но если я не ошибаюсь, предел 18 МГц действителен только для I2s Частота SPI, а не «общая» частота SPI...

victor_pv
Пт 13 января 2017 г. 14:28
Стивестронг написал: Я все еще думаю, где должна иметь инициализацию SPI: за пределами драйвера ILI9486, на этапе настройки, до или внутри функции Driver ()?

Squonk42
Пт 13 января 2017 г. 18:09
Стивестронг написал:Но если я не ошибаюсь, предел 18 МГц действителен только для I2s Частота SPI, а не «общая» частота SPI...

Стивестронг
Пт 13 января 2017 г., 19:24
Стивестронг написал:Итак, ошибочно интерпретирую RM0008 или таблицы данных содержат противоречивую информацию?

Squonk42
Пт 13 января 2017 г., 8:41 вечера
Стивестронг написал:Стивестронг написал:Итак, ошибочно интерпретирую RM0008 или таблицы данных содержат противоречивую информацию?

Стивестронг
Пт 13 января 2017 г. 20:53
Для этого проекта я использую SPI 1. Но у меня есть проекты, в которых оба SPI 1 и 2 работают одновременно, с DMA.

Палмерр
Вт 31 января 2017 г. 7:07 утра
Саймон,

Я работал над аналогичным проектом на платформе Teensy, увидел ваш код и подумал, что попробую его на STM32. Вчера появилась доска (Maple Mini Clone), поэтому я запустил его после инструкций Роджера на вики и YouTube (очень полезно). Нет проблем с светодиодным миганом и т. Д., Поэтому я думаю, что у меня есть цепочка инструментов, отсортированная для STM.

Скомпилирование кода из GitHub допускает некоторые ошибки (не проблема), но один из них является следующим, что является очевидным несоответствием со SPI.CPP в оборудовании \ arduino_stm32 \ stm32f1 \ libraries \ spi \ src.

Ваш код ниже, кажется, несколько раз пишет одно значение. Это имеет смысл для линий рисования и т. Д. Однократного цвета, но не совпадает с вызовом функции spi write ().

Функция с двумя аргументами spi write () ожидает первого аргумента быть указателем на массив элементов, которые будут написаны, а не только один элемент. (void spiclass :: write (const uint8 *data, uint32 длина).

Можете ли вы дать мне какие -либо подсказки о том, где я мог бы пойти не так, или если вы сделали какие -либо улучшения, так как вы загрузили эти файлы в GitHub?

Я буду продолжать отлаживать, ожидая ответа, так как, скорее всего, проблема между моим стулом и клавиатурой!

Ричард
-------------------
Adafruit_ili9486_stm32.CPP

void writedata16 (uint16_t color, uint32_t num)
{
SPI.setDatasize (data_size_16bit);
Cd_data;
Cs_active;
//#ifdef use_dma
if (usedma) {
LineBuffer [0] = Color;
пока (num>0xffff) {
SPI.dmasend (linebuffer, 0xffff, 0);
num -= 0xffff;
}
SPI.dmasend (linebuffer, num, 0);
//#еще
} еще {
SPI.написать (цвет, num);
//#endif
}
Cs_idle;
SPI.setDatasize (data_size_8bit);
}
-------------------------------
SPI.CPP

void writedata16 (uint16_t color, uint32_t num)
{
SPI.setDatasize (data_size_16bit);
Cd_data;
Cs_active;
//#ifdef use_dma
if (usedma) {
LineBuffer [0] = Color;
пока (num>0xffff) {
SPI.dmasend (linebuffer, 0xffff, 0);
num -= 0xffff;
}
SPI.dmasend (linebuffer, num, 0);
//#еще
} еще {
SPI.написать (цвет, num);
//#endif
}
Cs_idle;
SPI.setDatasize (data_size_8bit);
}

Стивестронг
Вт 31 января 2017 г. 8:19
Извините, но я не вижу несоответствия. Мой последний коммит был месяц назад, и он должен работать.
Если у вас есть проблемы, пожалуйста, опубликуйте сгенерированную ошибку компилятора.
Кажется, что вы вставли неверную информацию для второй функции.
Выдержка из SPI.час: /** * @brief Transmit one byte/word a specified number of times. * @param data to transmit. */ void write(uint16 data, uint32 n); /** * @brief Transmit multiple bytes/words. * @param buffer Bytes/words to transmit. * @param length Number of bytes/words in buffer to transmit. */ void write(const void * buffer, uint32 length);

victor_pv
Вторник 31 января 2017 г., 17:33
Стивестронг написал:Извините, но я не вижу несоответствия. Мой последний коммит был месяц назад, и он должен работать.
Если у вас есть проблемы, пожалуйста, опубликуйте сгенерированную ошибку компилятора.
Кажется, что вы вставли неверную информацию для второй функции.
Выдержка из SPI.час: /** * @brief Transmit one byte/word a specified number of times. * @param data to transmit. */ void write(uint16 data, uint32 n); /** * @brief Transmit multiple bytes/words. * @param buffer Bytes/words to transmit. * @param length Number of bytes/words in buffer to transmit. */ void write(const void * buffer, uint32 length);

Стивестронг
Вт 31 января 2017 г. 22:09
Есть пиар, который содержит это.
Это одна из функций, которая делает DMA почти устаревшим, так как между последовательными данными не существует пробелов SPI -часов, все непрерывные, для 16 -битных данных, по крайней мере,.

Rogerclark
Вторник 31 января 2017 г. 22:12
Стивестронг написал:Есть пиар, который содержит это.
Это функция, которая делает DMA почти устаревшим, по крайней мере для 16 -битных данных.

Стивестронг
Вт 31 января 2017 г. 22:23
Роджер, я знаю, что ты был занят, вот почему я не толкнул его.
Но теперь я напомню вам, когда вы спросили. : mrgreen:

Rogerclark
Вт 31 января 2017 г. 22:27
Не беспокойся.

Палмерр
Вт 31 января 2017 г. 22:37
Стив (извините за «Саймон» в моем последнем посте), Роджер и Виктор,

Спасибо за быстрый ответ.

Ядро вопроса (кроме моего неправильного вставления из основной библиотеки SPI), кажется, заключается в том, что я использовал библиотеку SPI из Master Repo Роджера, а не в поправках Стива.

Я буду искать пересмотренного на репо Стиве и использовать его тем временем, в то время как PR находится на рассмотрении.

Я не спешу!

Ричард

Палмерр
Ср. 01 февраля 2017 г. 3:05
Стив

Отлично работает с вашей модифицированной библиотекой SPI.

Спасибо

Тесты на моем клоне Maple Mini (2 кнопка, китайский) подтвердите свой.

Ричард

Стивестронг
Ср. 01 февраля 2017 г. 9:25 утра
8-)

Стивестронг
Солнце 05 февраля 2017 г., 21:13
push - для Роджера... ;)

Rogerclark
Солнце 05 февраля 2017 г. 22:31
Стивестронг написал:push - для Роджера... ;)

Фари
Солнце 26 февраля 2017 12:27
Привет всем!

Через 15 лет я вернулся к своему старому хобби. Ну, я работаю над системой умного дома на основе общения с банками. Я выбрал STM32F103 для работы с.
Я прочитал этот пост некоторое время назад и решил купить упомянутый дисплей TFT (3,5-дюймовый дисплей с сенсорным экраном TFT-LCD для Raspberry Pi):
http: // www.eBay.de/itm/-/252472008067?

Я подключил дисплей для связи со SPI 1 со следующими конфигурациями:
#define tft_cntrl gpioa
#define tft_rst pa3
#define tft_rs pa2
#define tft_cs pa4

Я использовал пример SPI в библиотеке STM32, чтобы проверить связь SPI, и дисплей всегда реагирует с шаблоном 0x55, означает ли это, что связь в порядке? Я отключил его и получил 0xff!!! Мне выглядел хорошо!!

Хорошо! После этого я мог запустить программу примеров ILI9486 и получить статистику Time Run, очень похожую на то, что в начале этого поста (см. Ниже!)

Проблема в том, что дисплей просто синхронно мигает белых в тестовых последовательностях. После некоторой отладки с атоликой я не смог обнаружить никакой ошибки.
Теперь я понятия не имею :рулон: , Почему дисплей не показывает тестовых шаблонов!!!
Кто -нибудь может дать мне подсказку, пожалуйста!

(Извините за мою школу английский : | )

***** ILI9486 Графический тест *****

**********************************************
Без DMA:
**********************************************
Контрольное время (микросекунд)
Заполнение экрана 356406
Текст 50544
Линии 547817
Horiz/Vert Lines 31755
Прямоугольники (схема) 19880
Прямоугольники (заполненные) 869491
Круги (заполненные) 302401
Круги (контур) 435629
Треугольники (контур) 112165
Треугольники (заполненные) 356495
Округлые прямы (схема) 132816
Округлые прямы (заполненные) 997862
Сделанный!

**********************************************
Теперь используя DMA:
**********************************************
Контрольное время (микросекунд)
Заполнение экрана 341522
Текст 52901
Линии 622749
Horiz/Vert Lines 31425
Прямоугольники (контур) 20386
Прямоугольники (заполненные) 833499
Круги (заполненные) 359237
Круги (контур) 435628
Треугольники (схема) 138814
Треугольники (заполненные) 374145
Округлые прямы (контур) 133456
Округлые прямы (заполненные) 975637
Сделанный!

Стивестронг
Солнце 26 февраля 2017 г. 15:46
Это похоже на WaveShare Spotpear Clone.
Хотя интерфейс контроллера является SPI, но плата дисплея содержит последовательный->параллельный преобразователь, который только для записи.
Следовательно, эти модули не могут быть прочитаны, поэтому контроллер не может быть определен на 100%, у него может быть другой драйвер, чем ILI9486.

Тем не менее, я бы посоветовал снизить скорость такты SPI до 18 МГц.
36 МГц возможен только с Хэренд-Хак, который я разместил здесь.

Фари
Солнце 26 февраля 2017 г. 16:07
Спасибо, Стив, за ваш подсказка!

Я сделал настройку часов SPI до 18 МГц:
// spi.BeginTransaction (TFT_CS, Spisettings (36000000));
SPI.Begintransaction (TFT_CS, Spisettings (18000000));
Модификация, как и ожидалось, замедлила тест:

**********************************************
Без DMA:
**********************************************
Контрольное время (микросекунд)
Заполнение экрана 683415
Текст 56114
Линии 609680
Horiz/Vert Lines 58171
Прямоугольники (контур) 34479
Прямоугольники (заполненные) 1666679
Круги (заполненные) 386663
Круги (контур) 477277
Треугольники (схема) 126756
Треугольники (заполненные) 591264
Округлые прямы (контур) 155133
Округлые прямы (заполненные) 1859289
Сделанный!


Тем не менее, тестовый шаблон действительно отображался на экране, и мигание такое же, как и раньше :(
Я перепроектировал проводку, и она кажется правильной.
Поврежден дисплей TFT? У тебя есть еще один намек?

Стивестронг
Солнце 26 февраля 2017 г. 16:19
Ну, как я уже сказал, контроллер мой быть другим, а не ILI9486. В этом случае это нормально, что у вас есть поврежденный дисплей.
Вы должны каким -то образом выяснить, какой это может быть контроллер, а затем использовать соответствующую последовательность инициализации, чтобы инициализировать ее.

Кроме того, вы можете опуститься ниже с скоростью (4 МГц) или даже 1 МГц. Если дисплей все еще мигает, то это должен быть другой контроллер.
В этом случае я не могу многое сделать.
Я бы порекомендовал проверить различные последовательности init для различных контроллеров (ILI9481, HX8375D и т. Д.) здесь. Это тоже был мой источник вдохновения.

Фари
Солнце 26 февраля 2017 г. 16:23
Спасибо, Стив! Я постараюсь узнать тип контроллера, а затем вернусь!

Стивестронг
Солнце 26 февраля 2017 г., 17:24
Я нашел Здесь (шаг 5) последовательность инициирования: init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3

Фари
Вт 28 февраля 2017 г. 12:01
Спасибо, Стив! Я попробую!

Палмерр
Вт 28 февраля 2017 г. 12:44
Вот код инициации от моего драйвера, который, кажется, работает нормально.

Если ваша подпрограмма анализатора инициации не обрабатывает строки задержки, то последние несколько команд должны быть выполнены в коде основной линии.

В середине есть несколько прокомментированных строк, которые были унаследованы от кода RPI. Я не проверял их. Весь код на GitHub: https: // github.com/palmerr23/stm32f01-i ... RPI-Driver

Я надеюсь, что это поможет.

Ричард
const uint8_t ili9486_init_sequence[] = { // 2, 0xb0, 0x0, // Interface Mode Control // 1, 0x11, // Sleep OUT // DELAY, 150, 2, 0x3A, 0x55, // use 16 bits per pixel color 2, 0x36, 0x48, // MX, BGR == rotation 0 // 2, 0xC2, 0x44, // Power Control 3 // VCOM Control 1 // 5, 0xC5, 0x00, 0x00, 0x00, 0x00, // PGAMCTRL(Positive Gamma Control) 16, 0xE0, 0x0F, 0x1F, 0x1C, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00, // NGAMCTRL(Negative Gamma Control) 16, 0xE1, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, // Digital Gamma Control 1 16, 0xE2, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, 1, 0x11, // Sleep OUT DELAY, 150, // wait some time 1, 0x29, // Display ON 0 // end marker };

Фари
Вт 28 февраля 2017 г. 9:54 утра
Спасибо за вашу помощь! Я попробую, когда вернусь домой.
Этот код работал на вашем STM32F103?

Фари
Сб 04 марта 2017 г., 7:32 утра
Привет, Стив!

Я следил за всеми намеками выше, но я не мог запустить демонстрацию на этом дисплее. Устройство, которое я купил, выглядит точно так же, как и ваше в начале этого поста. Я попробовал ваш пример без положительных результатов. Очевидно, что на плате есть последовательный параллельный преобразователь, почему это устройство только для записи. Я пробовал ILI9481 и ILI9486 . Если контроллер не ILI9486, что это может быть?
Я буду благодарен за любой намек!
Pinout RPI Display.jpg
Дисплей RPI RPI.JPG (106.42 киб) просмотрено 1679 раз

Стивестронг
Солнце 05 марта 2017 г. 8:05 утра
Как я ранее писал, может быть один из нескольких других контроллеров, см эта страница adafruit Github.
Выберите "fb_*.C "Файл и извлечь последовательность init, замените версию из моей либера.
Если это, кажется, не работает, возьмите следующее .c Файл.
Извините, но этот метод «проб и ошибок» кажется единственным способом выяснить реальный контроллер.

Дополнительные последовательности инициации, которые вы можете найти в репо: David's Repo: https: // github.com/prentiedavid/mcufri ... Nd_kbv.CPP, Начиная с строки 824.

Я, возможно, не упоминался ранее, но вы должны дважды проверить соединения и убедиться, что GPIOS переключается.

Дэйвид.Прентис
Солнце 05 марта 2017 г. 11:03
Выглядит так, как будто ваш дисплей был сделан Waveshare. Итак, вероятно, есть схема. Так что должно быть легко догадаться, как нужно управлять оборудованием.

Как сказал Стив, с дисплеем только для записи вы можете только использовать догадки.

Большинство контроллеров 320x480 соответствуют MIPI. И, вероятно, начинать сами. Просто сбросить, отображать, просыпаться, отображать на. (с некоторыми паузами)
Две типичные соглашения о регистрации:
ILI9481 с Power/Vcom в Regs 0xd0..
ILI9486 с Power/Vcom в Regs 0xc0..

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

Важно знать, какой контроллер установлен.

Дэйвид.

ZMEMW16
Солнце 05 марта 2017 г. 18:38
http: // www.волна.com/wiki/3.5inch_rpi_lcd_ (a)

Хорошие новости, плохие новости
Хорошо - не так много, вы можете найти детали прикрепления для сокета
Плохо - не мог видеть / найти схему - довольно удивлен
плохо - некоторые клонирование их продуктов
Плохо - твоя, кажется, не соответствует их картине
плохо - кажется, не соответствует подделкам

Я подозреваю, что самое простое - найти Raspberry Pi, и если есть что -нибудь в драйвере или загрузочных сообщениях.

Стивен

Дэйвид.Прентис
Пн, 06 марта 2017 г. 10:32 утра
Хорошей новостью является то, что у вас есть логотип Waveshare на вашей печатной плате. Так что это может быть искренним.

Вы всегда можете спросить WaveShare о схеме. Или просто раздайте это самостоятельно.

У меня нет Расппи. Я ничего не знаю о них.

Дэйвид.

Фари
Пн, 06 марта 2017 г. 11:58 утра
Спасибо, Стив, Дэвид и Стивен за ваши драгоценные намеки!

Я буду работать через ваши подсказки. Надеюсь, один из них сработает.

Фари
Вт, март 07, 2017, 16:56
Спасибо, Стив, Дэвид и Стивен за вашу помощь!

Наконец -то я сделал это! Я узнал правильную последовательность инициализации. Частота SPI имеет решающее значение. Дисплей работает только в диапазоне только между 12 МГц до 32 МГц. Любая частота из этого диапазона приводит к белому миганию на экране!

Стивестронг
Вт
Я думаю, что уже упоминал ограничение часов SPI до 24 МГц, но хорошо, что вы также выяснили.

Фари
Ср. 08 марта 2017 12:08
Да! Ты прав, Стив! Но у меня было несколько проблем:
- Описанный булавка с дисплея на сайте продавца была неверной : x (Я пытался в это время снизить частоту, но с неправильной проводкой!!! :рулон: ). Эта проблема была фундаментальной
- Последовательность init должна была быть немного изменена (у меня есть правильная последовательность последовательности init of Raspberry Pi, которая была опубликована в Интернете)
- Частота e.глин. 8 МГц не работает. Я не мог понять до сих пор, почему более низкие частоты не работали
После того, как я узнал, что описание выпуска было неправильно, мне удалось очень быстро решить проблему.
Спасибо всем за поддержку!


Если вам может быть заинтересован, вот правильная булавка с дисплея, который я использую (http: // www.eBay.de/itm/252472008067?ul_noapp = true):
35 -дюймовый дисплей
35 -дюймовый дисплей.JPG (163.87 киб) просмотрено 2345 раз

Стивестронг
Пт 19 мая 2017 г. 15:49
Вернувшись снова через долгое время, чтобы сообщить вам об обновлении.

Я изменил свой ILI9486 - SPI для 16 -битного параллельного доступа. Причина состояла в том, чтобы получить более высокую скорость записи.
Файлы можно найти здесь: https: // github.com/stevstrong/adafruit_ ... 6bit_stm32
Я проверил это с моей черной доской F4.
Текущий эталон: Benchmark Time (microseconds) Screen fill 104767 Text 10386 Lines 185635 Horiz/Vert Lines 9400 Rectangles (outline) 5971 Rectangles (filled) 255546 Circles (filled) 95452 Circles (outline) 78896 Triangles (outline) 51741 Triangles (filled) 112147 Rounded rects (outline) 26409 Rounded rects (filled) 295197

AG123
Пт 19 мая 2017 г. 16:47
Похоже, что F4 * слишком быстрый * для ЖК -дисплея, предел, казалось, не является количеством параллельных проводов, так быстро может работать MCU на ЖК -дисплее :ржу не могу:

Стивестронг
Сб 20 мая 2017 г. 15:09
Действительно, F4 - невероятный быстрый!

Здесь скамейка с использованием FSMC:
Benchmark Time (microseconds) Screen fill 48091 Text 5683 Lines 83850 Horiz/Vert Lines 4258 Rectangles (outline) 2655 Rectangles (filled) 117322 Circles (filled) 39360 Circles (outline) 35190 Triangles (outline) 23373 Triangles (filled) 50048 Rounded rects (outline) 12160 Rounded rects (filled) 134562

Magflip
Сб 20 мая 2017 г. 15:35
Стивестронг написал:Вернувшись снова через долгое время, чтобы сообщить вам об обновлении.

Я изменил свой ILI9486 - SPI для 16 -битного параллельного доступа. Причина состояла в том, чтобы получить более высокую скорость записи.
Файлы можно найти здесь: https: // github.com/stevstrong/adafruit_ ... 6bit_stm32
Я проверил это с моей черной доской F4.
Текущий эталон: Benchmark Time (microseconds) Screen fill 104767 Text 10386 Lines 185635 Horiz/Vert Lines 9400 Rectangles (outline) 5971 Rectangles (filled) 255546 Circles (filled) 95452 Circles (outline) 78896 Triangles (outline) 51741 Triangles (filled) 112147 Rounded rects (outline) 26409 Rounded rects (filled) 295197

Стивестронг
Солнце 21 мая 2017 г. 8:04
@magflip, у вас есть ссылка на ваш дисплей? Это для SPI или параллельного автобуса?

Magflip
Солнце 21 мая 2017 г. 12:36
Стивестронг написал:@magflip, у вас есть ссылка на ваш дисплей? Это для SPI или параллельного автобуса?

Стивестронг
Солнце 21 мая 2017 г. 12:55
Это 2.4 -дюймовый дисплей?
Какие булавки вы используете для шины данных?
Я вижу, что у него 8 бит автобуса, так что ты должен мог использовать 8 -битная параллельная библиотека.

Дэйвид.Прентис
Солнце 21 мая 2017 г. 13:05
Продолжать. Название ветки о Rpi 3.5 -дюймовый дисплей. Вы показываете фото 2.4 -дюймовый щит Arduino Display.

На твоем фото изображена бумажная наклейка "4535". Это подразумевает контроллер LGDP4535, но вы никогда не сможете доверять eBay. (У меня есть один с этикеткой "9488", и он содержит HX8357-D)

Пожалуйста, установите/обновите свою библиотеку MCUFINTION_KBV с помощью менеджера библиотеки.
Большинство примеров сообщают об идентификаторе серийному терминалу.
Если все еще неизвестно, запустите эскиз LCD_ID_Readreg и вставьте выход на форум Arduino в разделе «Отображения».

Я не против ответить на вопрос STM32 здесь. Форум Arduino достигает большего количества людей.

Между прочим, LGDP4535 поддерживается из коробки. LGDP4532 требует включения поддержки_4532 определить.

Где вы взяли эту идею: if (identifier == 0xEFEF) identifier = 0x9486;

Magflip
Солнце 21 мая 2017 г. 14:44
Стивестронг написал:Это 2.4 -дюймовый дисплей?
Какие булавки вы используете для шины данных?
Я вижу, что у него 8 бит автобуса, так что ты должен мог использовать 8 -битная параллельная библиотека.

Magflip
Солнце 21 мая 2017 г. 14:58
Дэйвид.Прентис написал:Продолжать. Название ветки о Rpi 3.5 -дюймовый дисплей. Вы показываете фото 2.4 -дюймовый щит Arduino Display.

На твоем фото изображена бумажная наклейка "4535". Это подразумевает контроллер LGDP4535, но вы никогда не сможете доверять eBay. (У меня есть один с этикеткой "9488", и он содержит HX8357-D)

Пожалуйста, установите/обновите свою библиотеку MCUFINTION_KBV с помощью менеджера библиотеки.
Большинство примеров сообщают об идентификаторе серийному терминалу.
Если все еще неизвестно, запустите эскиз LCD_ID_Readreg и вставьте выход на форум Arduino в разделе «Отображения».

Я не против ответить на вопрос STM32 здесь. Форум Arduino достигает большего количества людей.

Между прочим, LGDP4535 поддерживается из коробки. LGDP4532 требует включения поддержки_4532 определить.

Где вы взяли эту идею: if (identifier == 0xEFEF) identifier = 0x9486;

Стивестронг
Солнце 21 мая 2017 г. 15:48
Я бы предложил использовать ЖК -экранинг тестового эскиза от Дэвида, это помогает проверить вашу проводку.
И вставьте здесь результат от серийного монитора.

Дэйвид.Прентис
Солнце 21 мая 2017 г., 17:55
Следуйте совету Стива. Отредактируйте определение, чтобы соответствовать вашей проводке. Тогда он будет сообщать точно так же, как ваш Uno.
#define LCD_RST PB0 #define LCD_CS PA3 #define LCD_RS PA2 #define LCD_WR PA1 #define LCD_RD PA0 #define LCD_D0 PA8 #define LCD_D1 PA9 #define LCD_D2 PA10 #define LCD_D3 PA11 #define LCD_D4 PA12 #define LCD_D5 PA13 #define LCD_D6 PA14 #define LCD_D7 PA15

Magflip
Солнце 21 мая 2017 г. 22:05
Спасибо за подсказки.
После запуска lcd_id_readreg.INO адаптировал аккаминг к последним сообщениям, Serial Monitor показывает мне следующее:
Read Registers on MCUFRIEND UNO shield controllers either read as single 16-bit e.g. the ID is at readReg(0) or as a sequence of 8-bit values in special locations (first is dummy) reg(0x0000) 00 00 ID: ILI9320, ILI9325, ILI9335, ... reg(0x0004) 04 04 04 04 Manufacturer ID reg(0x0009) 09 09 09 09 09 Status Register reg(0x000A) 0A 0A Get Powsr Mode reg(0x000C) 0C 0C Get Pixel Format reg(0x0061) 61 61 RDID1 HX8347-G reg(0x0062) 62 62 RDID2 HX8347-G reg(0x0063) 63 63 RDID3 HX8347-G reg(0x0064) 64 64 RDID1 HX8347-A reg(0x0065) 65 65 RDID2 HX8347-A reg(0x0066) 66 66 RDID3 HX8347-A reg(0x0067) 67 67 RDID Himax HX8347-A reg(0x0070) 70 70 Panel Himax HX8347-A reg(0x00A1) A1 A1 A1 A1 A1 RD_DDB SSD1963 reg(0x00B0) B0 B0 RGB Interface Signal Control reg(0x00B4) B4 B4 Inversion Control reg(0x00B6) B6 B6 B6 B6 B6 Display Control reg(0x00B7) B7 B7 Entry Mode Set reg(0x00BF) BF BF BF BF BF BF ILI9481, HX8357-B reg(0x00C0) C0 C0 C0 C0 C0 C0 C0 C0 C0 Panel Control reg(0x00C8) C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 GAMMA reg(0x00CC) CC CC Panel Control reg(0x00D0) D0 D0 D0 Power Control reg(0x00D2) D2 D2 D2 D2 D2 NVM Read reg(0x00D3) D3 D3 D3 D3 ILI9341, ILI9488 reg(0x00DA) DA DA RDID1 reg(0x00DB) DB DB RDID2 reg(0x00DC) DC DC RDID3 reg(0x00E0) E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 GAMMA-P reg(0x00E1) E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 GAMMA-N reg(0x00EF) EF EF EF EF EF EF ILI9327 reg(0x00F2) F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 Adjust Control 2 reg(0x00F6) F6 F6 F6 F6 Interface Control

Дэйвид.Прентис
Пн 22 мая 2017 г., 6:04
Пока вы не получите идентичный отчет от lcd_id_readreg в качестве Uno, ваша проводка неверна.

Вы понимаете, что вы можете просто подключить щит к нуклео-F103, Nucleo-L476, Iteadmaple или Afftek's Adapter. Все они работают из коробки.

Поскольку вы решили изобретать свою собственную проводку, вы должны проверить, что она действительно работает.
Жизнь проще, если вы скопируете какую -то проверенную проводку E.глин. Efftek для чертежа.

Дэйвид.

Magflip
Вторник 23 мая 2017 г. 2:06 утра
Привет. Потратив много времени и, увидев, что соединение PIN -штифта было правильным, я решил изменить источник питания на 5 В, а затем эскиз reg_id показал, что «reg (0x0000) 45 35» (хотя оставшиеся регистры были похожи на 00 00).
Я не мог найти никакого LIB для этого драйвера, как бы я ни исследовал. Я пытался использовать https: // github.com/stevstrong/adafruit_ ... 8bit_stm32 Но мне тоже не удалось, даже правильно отредактировать файлы, чтобы указать проводку штифтов данных.
Существует ли решение для использования универсального STM32F103C (синяя таблетка) с этим TFT -дисплеем с драйвером «4535»?

Дэйвид.Прентис
Вторник 23 мая 2017 г. 11:35
Ну, я написал специальное для вас пару дней назад. По содержанию ваших сообщений, я сомневаюсь, что у вас достаточно опыта, чтобы использовать его.
#define USE_MAGFLIP

Стивестронг
Вторник 23 мая 2017 г. 11:57
Разве это не то, что вы ищете?
http: // форум.Ардуино.CC/INDEX.PHP?Тема = 314912.0
В самом первом порте этого потока есть вложение.
Похоже, он использует ili932x_regvalues ​​для последовательности init.

Дэйвид.Прентис
Вторник 23 мая 2017 г. 12:37
@Стив,

Есть несколько версий библиотеки ADAFRIT_TFTLCD, которые были взломаны для LGDP4535. Вероятно, есть и оригинальные. Насколько я знаю, они будут бегать только на Uno или Mega.

OP хочет библиотеку, которая работает на его чертепе STM32 с его индивидуальной проводкой.

Дэйвид.

Aleksey78
Пт 23 июня 2017 г. 6:35 утра
Купил тот же дисплей
https: // www.aliexpress.com/snapshot/0.час ... 2707058182
не может запустить STM32F4Discovery.
Какова минимальная частота SPI?
Режим SPI только 16 бит???
Какова максимальная длина проводов?

Стивестронг
Пт 23 июня 2017 г., 6:45
Ваша ссылка не может быть доступна.
Какое ядро ​​вы используете?
Максимальная частота составляет ~ 24 МГц без моего мода.
Да, SPI работает в 16 -битном режиме.
Провода должны быть максимально короткими.

Aleksey78
SAT 24 июня 2017 г. 11:58 вечера
https: // ru.aliexpress.com/item/3-5 дюймов ... .28.0x2thh
Установлен чип ILI9486?
Если я правильно понимаю, ограничивает минимальную частоту, нет?
Есть ли какой -либо пример инициализации SPI для дисплея?
Возможно ли без инициализации дисплея, чтобы отправить какую -либо последовательность команд, и увидеть изменение экрана?

Стивестронг
Солнце 25 июня 2017 г. 9:02
Aleksey, вы используете это программное обеспечение
https: // github.com/stevstrong/arduino_s ... generic_f4
вместе с этим дисплеем lib
https: // github.com/stevstrong/adafruit_ili9486_stm32
?
Если да, пожалуйста, подробно опишите, что именно не работает.
К сожалению, у меня нет никакого совета по обнаружению F4, поэтому я не могу проверить его на этой доске.

Фари
Вт 11 июля 2017 г. 8:02 утра
Привет, Алекси!

У меня есть этот дисплей! Пожалуйста, обратитесь к моим страницам просмотра сообщения назад.
Я мог бы отправить вам свой функционирующий Exmaple, если хотите!

С наилучшими пожеланиями

Чиндуй
Солнце 25 марта 2018 г. 14:22
[Фари - Вторник 11 июля 2017 г. 8:02 утра] - У меня есть этот дисплей! Пожалуйста, обратитесь к моим страницам просмотра сообщения назад.
Я мог бы отправить вам свой функционирующий Exmaple, если хотите!
Привет, Фари и другие,
Я получил дисплей неделю назад и не смог его включить. Я использую этот пример https: // github.com/stevstrong/adafruit_ili9486_stm32.
Не могли бы вы помочь мне с проводкой? Я попытался подключиться с помощью ЖК -булавки, который вы опубликовали.

Стивестронг
Солнце 25 марта 2018 г. 16:46
[Стивестронг - Солнце 21 мая 2017 г. 15:48] - Я бы предложил использовать ЖК -экранинг тестового эскиза от Дэвида, это помогает проверить вашу проводку.
И вставьте здесь результат от серийного монитора.

Чиндуй
Пт 06 апреля 2018 г. 8:57 утра
Спасибо Стиву. Я недавно занят другим проектом, поэтому я попробую это позже.

Хейсан
Чт 31 мая 2018 г. 18:03
[Стивестронг - Солнце 25 июня 2017 г. 9:02] - Aleksey, вы используете это программное обеспечение
https: // github.com/stevstrong/arduino_s ... generic_f4
вместе с этим дисплеем lib
https: // github.com/stevstrong/adafruit_ili9486_stm32
?
Если да, пожалуйста, подробно опишите, что именно не работает.
К сожалению, у меня нет никакого совета по обнаружению F4, поэтому я не могу проверить его на этой доске.
Я знаю, что не должен надумать старую ветку - но так как это охватывает именно то, что я пытаюсь сделать, и заставило меня так далеко, это, вероятно, лучшее место для этого вопроса.

В любом случае, у меня есть один из этих общих 3.5 -дюймовые RPI LCDS. Вышеуказанная библиотека отлично работает для запуска ЖК -дисплея. Библиотека XPT_2046 также отлично подходит для вождения сенсорной панели. Но они не работают вместе. Вызовы отображения сломайте сенсорную панель и наоборот.

Эти две функции имеют разводки SPI, но имеют другую линию CS. Быстрый взгляд на код предполагает, что это, вероятно, единственная транзакция SPI в ЖК -драйвере. Прежде чем я начну вносить изменения, я хотел бы проверить следующее:
1) Я предполагаю причину правильное, и
2) В настоящее время никто не работает над этим.

Если это так, то я более чем рад добавить поддержку транзакций в публичные функции API и отправлять исправления.

Спасибо,
Джастин

Стивестронг
Чт 31 мая 2018 г., 19:38
Я не разработал либера.
Так что я даже не могу проверить либера.

В любом случае, любые улучшения, которые вы делаете, приветствуется.

Мадиас
Чт 31 мая 2018 г., 22:18
Может быть, другая вещь:
В файле CPP ILI9486 вы найдете много: SPI.setDataSize(DATA_SIZE_16BIT);

Хейсан
Пт, 01 июня 2018 г., 11:50 утра
[Мадиас - Чт 31 мая 2018 г., 22:18] - Может быть, другая вещь:
В файле CPP ILI9486 вы найдете много: SPI.setDataSize(DATA_SIZE_16BIT);

Хейсан
Пт, 01 июня 2018 г., 19:01
16843.jpg
16843.JPG (31.8 киб) просмотрено 614 раз

Мадиас
Пт, 01 июня 2018 г., 19:31
[Хейсан - Пт, 01 июня 2018 г., 19:01] - Подтверждено - оберните код TFT в StartTransaction .. Эндранзикция и все работает отлично : D .
Вы включили DMA? С DMA у меня есть несколько артефактов с графическими тестами (не только с этим дисплеем), то это в моем списке TODO, чтобы исследовать проблему (возможно, слишком много скорости для контроллера).
Можете ли вы прикрепить свой код/библиотеку, поэтому мне не нужно изобретать (переписать) колесо? (#define lazymode) :)

Другое дело:
Мне нужно быть свободным от выбора DC, RST, CS.... булавки, поэтому я изменил это в *.H Файл: (лучше вы используете PXX, чем «8» или «9» - это был мой быстрый разговор) Define pins and Output Data Registers */ //Control pins |RS |CS |RST| #define TFT_CNTRL GPIOA #define TFT_RST 8 #define TFT_RS 9 #define TFT_CS 10 #define TFT_CS_MASK BIT4 #define TFT_RS_MASK BIT0 /* extern gpio_reg_map *ctrlRegs; #define CS_ACTIVE ctrlRegs->BRR = TFT_CS_MASK //digitalWrite(TFT_CS, LOW); // #define CS_IDLE ctrlRegs->BSRR = TFT_CS_MASK //digitalWrite(TFT_CS, HIGH); // #define CD_COMMAND ctrlRegs->BRR = TFT_RS_MASK //digitalWrite(TFT_RS, LOW); // #define CD_DATA ctrlRegs->BSRR = TFT_RS_MASK //digitalWrite(TFT_RS, HIGH); // */ #define CS_ACTIVE digitalWrite(TFT_CS, LOW); // #define CS_IDLE digitalWrite(TFT_CS, HIGH); // #define CD_COMMAND digitalWrite(TFT_RS, LOW); // #define CD_DATA digitalWrite(TFT_RS, HIGH); // #define swap(a, b) { int16_t t = a; a = b; b = t; } /*****************************************************************************/

Хейсан
Пт, 01 июня 2018 г., 19:51
Не уверен, как отправить различия на этом совете - будет ли это работать?
diff -u ./Adafruit_ILI9486_STM32.cpp /home/justin/Arduino/libraries/Adafruit_ILI9486_STM32/Adafruit_ILI9486_STM32.cpp --- ./Adafruit_ILI9486_STM32.cpp 2017-02-02 14:40:50.000000000 +0200 +++ /home/justin/Arduino/libraries/Adafruit_ILI9486_STM32/Adafruit_ILI9486_STM32.cpp 2018-06-01 21:37:20.659070014 +0200 @@ -12,7 +12,7 @@ /*****************************************************************************/ // Constructor uses hardware SPI, the pins being specific to each device /*****************************************************************************/ -Adafruit_ILI9486_STM32::Adafruit_ILI9486_STM32(void) : Adafruit_GFX(TFTWIDTH, TFTHEIGHT){} +Adafruit_ILI9486_STM32::Adafruit_ILI9486_STM32(void) : Adafruit_GFX(TFTWIDTH, TFTHEIGHT), spiSet(SPISettings(36000000)), _trans(0) {} /*****************************************************************************/ void writedata16(uint16_t c) { @@ -117,6 +117,21 @@ } } /*****************************************************************************/ +void Adafruit_ILI9486_STM32::startSPI(void) +{ + if(_trans == 0) + SPI.beginTransaction(TFT_CS, spiSet); + _trans++; +} + +void Adafruit_ILI9486_STM32::endSPI(void) +{ + _trans--; + if(_trans == 0) + SPI.endTransaction(); + if(_trans < 0) _trans = 0; // sanity check if we end too many times, at least the next start will work... +} + void Adafruit_ILI9486_STM32::begin(void) { ctrlRegs = TFT_CNTRL->regs; @@ -137,14 +152,17 @@ digitalWrite(TFT_RST, HIGH); delay(200); } - SPI.beginTransaction(TFT_CS, SPISettings(36000000)); + startSPI(); + //SPI.beginTransaction(TFT_CS, SPISettings(36000000)); // init registers commandList(ili9486_init_sequence); useDMA = 0; + endSPI(); } /*****************************************************************************/ void Adafruit_ILI9486_STM32::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { + startSPI(); writecommand(ILI9486_CASET); // Column addr set writedata(x0 >> 8); writedata(x0 & 0xFF); // XSTART @@ -158,19 +176,24 @@ writedata(y1); // YEND writecommand(ILI9486_RAMWR); // write to RAM + endSPI(); } /*****************************************************************************/ void Adafruit_ILI9486_STM32::pushColor(uint16_t color) { + startSPI(); writedata16(color); + endSPI(); } /*****************************************************************************/ void Adafruit_ILI9486_STM32::drawPixel(int16_t x, int16_t y, uint16_t color) { if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return; + startSPI(); setAddrWindow(x, y, x + 1, y + 1); pushColor(color); + endSPI(); } /*****************************************************************************/ void Adafruit_ILI9486_STM32::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) @@ -178,10 +201,12 @@ // Rudimentary clipping if ((x >= _width) || (y >= _height || h < 1)) return; if ((y + h - 1) >= _height) { h = _height - y; } - if (h < 2 ) { drawPixel(x, y, color); return; } + if (h < 2 ) { drawPixel(x, y, color); return; } // drawpixel already wrapped + startSPI(); setAddrWindow(x, y, x, y + h - 1); writedata16(color, h); + endSPI(); } /*****************************************************************************/ void Adafruit_ILI9486_STM32::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) @@ -189,17 +214,21 @@ // Rudimentary clipping if ((x >= _width) || (y >= _height || w < 1)) return; if ((x + w - 1) >= _width) { w = _width - x; } - if (w < 2 ) { drawPixel(x, y, color); return; } + if (w < 2 ) { drawPixel(x, y, color); return; } // drawPixel already wrapped + startSPI(); setAddrWindow(x, y, x + w - 1, y); writedata16(color, w); + endSPI(); } /*****************************************************************************/ void Adafruit_ILI9486_STM32::fillScreen(uint16_t color) { + startSPI(); setAddrWindow(0, 0, _width, _height); writedata16(color, (_width*_height)); + endSPI(); } /*****************************************************************************/ @@ -210,12 +239,14 @@ if ((x + w - 1) >= _width) { w = _width - x; } if ((y + h - 1) >= _height) { h = _height - y; } if (w == 1 && h == 1) { - drawPixel(x, y, color); + drawPixel(x, y, color); // already wrapped return; } + startSPI(); setAddrWindow(x, y, x + w - 1, y + h - 1); writedata16(color, (w*h)); + endSPI(); } /* @@ -336,6 +367,7 @@ /*****************************************************************************/ void Adafruit_ILI9486_STM32::setRotation(uint8_t m) { + startSPI(); writecommand(ILI9486_MADCTL); rotation = m & 3; // can't be higher than 3 switch (rotation) { @@ -360,9 +392,12 @@ _height = TFTWIDTH; break; } + endSPI(); } /*****************************************************************************/ void Adafruit_ILI9486_STM32::invertDisplay(boolean i) { + startSPI(); writecommand(i ? ILI9486_INVON : ILI9486_INVOFF); + endSPI(); } diff -u ./Adafruit_ILI9486_STM32.h /home/justin/Arduino/libraries/Adafruit_ILI9486_STM32/Adafruit_ILI9486_STM32.h --- ./Adafruit_ILI9486_STM32.h 2017-02-02 14:40:50.000000000 +0200 +++ /home/justin/Arduino/libraries/Adafruit_ILI9486_STM32/Adafruit_ILI9486_STM32.h 2018-06-01 21:42:04.965356555 +0200 @@ -80,6 +80,8 @@ Adafruit_ILI9486_STM32(void); void begin(void), + startSPI(void), // these two are public - if you are going to do a bunch of consecutive display calls + endSPI(void), // wrap them in a startSPI..endSPI pair, so that each individual function does not do the same setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1), pushColor(uint16_t color), fillScreen(uint16_t color), @@ -95,7 +97,8 @@ void reset(void); private: - uint8_t tabcolor; + SPISettings spiSet; + int _trans; }; void writecommand(uint8_t c), writedata(uint8_t d), Common subdirectories: ./examples and /home/justin/Arduino/libraries/Adafruit_ILI9486_STM32/examples

Мадиас
Пт, 01 июня 2018 г., 8:00 вечера
Я не владею/использую инструменты DIFF, потому что они мне не нужны регулярно (я просто использую блокнот ++ с плагином Compare на Windows или Xcode на OSX для таких вещей (частные)). Всегда лучше опубликовать весь код/библиотека как *.Zip или *.rar файл в качестве вложений, иначе многие люди будут плакать », как это использовать?" -особенно под окнами (нет" патча "без дальнейшей установки чего -либо) :) .

Хейсан
Пт, 01 июня 2018 г. 20:14
Разные стандарты для разных форумов... Прилагается полная библиотека (которая застрелит вас на большинство досок, на которые я вкладываю, на :ржу не могу: ).

Пса. Нет коррупции DMA на моей стороне - но также не реальная скорость, за исключением наполнения экрана.

Мадиас
Пт, 01 июня 2018 г., 22:58
ОК, спасибо :)
Но: все еще графические ошибки: вы можете ясно видеть их на:
Последний зеленый округлый прямоугольник (и другие прямоугольники/треугольники, заполненные градиентом, но вы должны очень внимательно смотреть)
У них должен быть хороший цветовой градиент.

Смотрите сравнения (я использовал Teensy (но и на Maple Mini! ) библиотека для второго (без DMA), которая основана на коде Стивеса):
фактическое:
Изображение
Teensy One (извините, немного смешивается):
Изображение

Вы можете попробовать библиотеку Teensy здесь, но вы должны изменить булавки внутри *.час:
https: // github.com/palmerr23/ili9486_teensy_library

Стивестронг
SAT 02 июня 2018 г. 7:11
[Мадиас - Пт, 01 июня 2018 г. 22:58] - Но: все еще графические ошибки: вы можете ясно видеть их на:
Последний зеленый округлый прямоугольник (и другие прямоугольники/треугольники, заполненные градиентом, но вы должны очень внимательно смотреть)
У них должен быть хороший цветовой градиент.
Я думаю, что это ошибка SW, но не на 100% уверен.

Мадиас
SAT 02 июня 2018 г., 7:35 утра
[Стивестронг - SAT 02 июня 2018 г., 7:11]] -
Я думаю, что это ошибка SW, но не на 100% уверен.
Библиотека Teensy основана на вашем коде - без ошибок.
Но это не проблема DMA (даже с отключенным DMA -> те же ошибки).
Библиотека Teensy намного медленнее - может быть, ошибки, вызванные высокой скоростью (SPI или низкоуровневые манипуляции с выводами) - не должно быть трудно найти проблему, так как у нас есть два - почти одинаковые библиотеки

Мадиас
SAT 02 июня 2018 г., 7:42
Хорошо: #define CS_ACTIVE ctrlRegs->BRR = TFT_CS_MASK //digitalWrite(TFT_CS, LOW); // #define CS_IDLE ctrlRegs->BSRR = TFT_CS_MASK //digitalWrite(TFT_CS, HIGH); // #define CD_COMMAND ctrlRegs->BRR = TFT_RS_MASK //digitalWrite(TFT_RS, LOW); // #define CD_DATA ctrlRegs->BSRR = TFT_RS_MASK //digitalWrite(TFT_RS, HIGH); //

Стивестронг
SAT 02 июня 2018 г., 7:50 утра
Извините, не ясно, я имел в виду эскиз GraphicStest.
Был тот же набросок?

Мадиас
SAT 02 июня 2018 г. 8:05 утра
[Стивестронг - Сб, 02 июня 2018 г., 7:50 утра] - Извините, не ясно, я имел в виду эскиз GraphicStest.
Был тот же набросок?
Это тот же набросок. Я только что использовал Teensy Graphictest и только заменил библиотеку.

Стивестронг
SAT 02 июня 2018 г. 8:08
HM, это интересно. Кажется, это небольшая ошибка где -то в либе.

Мадиас
SAT 02 июня 2018 г. 8:19
Понятно!
изменил скорость SPI на: Adafruit_ILI9486_STM32::Adafruit_ILI9486_STM32(void) : Adafruit_GFX(TFTWIDTH, TFTHEIGHT), spiSet(SPISettings(24000000)), _trans(0) {}