|
Хочу писать в 16 линеек WS2812B на макс. скорости., Хочу весь буфер без участия процессора с минимумом накладных. |
|
|
|
Dec 13 2017, 17:25
|

Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 24-10-07
Из: zp.ua
Пользователь №: 31 690

|
Сразу предупреждаю, в STM32 я полный новичек, пока знакомлюсь. Все чего пока добился, это моргать в кейле светодиодом на двухдолларовой плате с stm32f103c8t6. До этого частенько писал для авр на бейсике и ассемблере, так что освоение stm32 вопрос времени. Вопрос мой будет не столько про код, а про возможность выполнения нужного мне алгоритма переферией автономно. Не буду скрывать, хочу без участия процессора выдавать поток данных сразу в 16 длинных линеек светодиодов WS2812B. Для выдачи одного бита нужно на отдельном выводе сначала ~ на треть периода выставить 1, потом на треть данные, и на треть 0. В принципе при помощи DMA данная задача реализуема, но вот этот ноль в начале и еденица в конце утроят размер буфера (и добавят неудобства работы с ним).
Поэтому возник вопрос, а можно ли как то внутренними или наружными выходами таймеров переводить (или заполнить) весь 16 битный порт GPIO в высокий и низкий уровни? Вероятно можно было бы задействовать второй DMA для цикличной выдачи двух констант (с нулями и еденицами) в тот же порт, но думаю целый ДМА для этого жирновато. Возможно не зная завязок и возможностей переферии я узковато мыслю, и есть более красивые решения, был бы рад услышать.
|
|
|
|
|
 |
Ответов
|
Dec 13 2017, 18:05
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(-=TRO=- @ Dec 13 2017, 19:25)  Возможно не зная завязок и возможностей переферии я узковато мыслю, и есть более красивые решения, был бы рад услышать. Можно взять другой МК, имеющий внешнюю 16-разрядную шину и выдавать на неё при помощи DMA требуемый поток. А если в этом МК ещё и стоит хороший контроллер DMA, умеющий передачи "свЯзным списком", то его вообще можно запрограммировать так, чтобы он брал скажем два первых 16-битных слова с фиксированного адреса, а третье слово - из вашего кольцевого буфера. Либо взять LPC43xx и на его SGPIO-интерфейсе (с DMA) реализовать требуемую диаграмму работы. Цитата(DeNi @ Dec 13 2017, 19:54)  Да и с 3 каналами DMA нормальное решение от одного таймера, первый настроить только на выдачу 1, второй по буферу, третий - 0. В STM32 таймер не может управлять целым портом. Автор не озвучил частоту выдачи. И требуемую максимальную фазовую погрешность. На высоких частотах (от МГц) такое будет работать неустойчиво. Ещё вариант - использовать Infineon XMC4700 или XMC4800. Он имеет до 3 USIC-ов. Каждый USIC - это два последовательных порта. Которые можно запрограммировать в режим quad-SPI и получить 3*2*4 последовательных битовых потока имеющих DMA-поддержку и FIFO-буфера глубиной до 32 слов. Размер слова запрограммировать кратным 3 (например 30 бит). Данные в слове кодировать так, чтобы шли: 0, 1, 1-й информационный бит, 0, 1, 2-й информационный бит, .... . Такое решение будет работать даже на нескольких десятках МГц без проблем с очень точным выдерживанием временных интервалов. Вобщем - на более-менее высоких частотах битового потока нормально будут работать только решения на каком-либо последовательном интерфейсе (с буферизацией). Например - несколько параллельных quad-SPI или SGPIO. Никакие решения на таймер+DMA+GPIO стабильно не будут работать пока процессор лазит по той же шине, где работают эти пересылки DMA->GPIO. Они будут сбивать времянку.
|
|
|
|
|
Dec 13 2017, 18:32
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 18-10-06
Из: Москва
Пользователь №: 21 459

|
Цитата(jcxz @ Dec 13 2017, 21:05)  Можно взять другой МК, имеющий внешнюю 16-разрядную шину и выдавать на неё при помощи DMA требуемый поток. А если в этом МК ещё и стоит хороший контроллер DMA, умеющий передачи "свЯзным списком", то его вообще можно запрограммировать так, чтобы он брал скажем два первых 16-битных слова с фиксированного адреса, а третье слово - из вашего кольцевого буфера. И чем выдача на шину выигрышние выдачи в порт GPIO через DMA? Цитата(jcxz @ Dec 13 2017, 21:05)  Автор не озвучил частоту выдачи. Он озвучил цену за плату в 2$. И этот светодиод где-то и работает до мегагерца максимум.
Сообщение отредактировал DeNi - Dec 13 2017, 18:35
|
|
|
|
|
Dec 13 2017, 19:38
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(DeNi @ Dec 13 2017, 20:32)  И чем выдача на шину выигрышние выдачи в порт GPIO через DMA? Ничем. Для низких частот и низких требований к стабильности длительностей фаз - и то и другое пойдёт одинаково. Моя фраза насчёт последовательных интерфейсов касалась высоких частот (от нескольких МГц). Цитата(DeNi @ Dec 13 2017, 20:32)  Он озвучил цену за плату в 2$. И этот светодиод где-то и работает до мегагерца максимум. Не знаю. Недавно на одном из форумов читал, что некто собирался тактировать такие линейки несколькими МГц. Или даже больше 10. Цитата(-=TRO=- @ Dec 13 2017, 21:32)  что если одному DMA дать задание через его один канал, то пока он весь свой цикл не отработает, по другим каналам его озадачивать нельзя Можно
|
|
|
|
|
Dec 13 2017, 21:07
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(-=TRO=- @ Dec 13 2017, 21:47)  У этих светодиодов четко 1.25мкс на битовый период, и довольно жесткие допуски по длительностям (около 10-20%, точно не вспомню, даташит надо открывать). https://hsto.org/files/d91/3c8/0f8/d913c80f...70f5eb4b897.pngЭт мой чертежик. Но хочу вас успокоить и разочаровать одновременно. Во-первых, у оригинального WS2112B, как оказалось, эти тайминги можно чуть ли не в два раза туда-сюда двигать и он надежно работает на линейке из 200 диодов. Но есть на рынке какие-то подделки которые даже с соблюдением всех допусков как на картинке нормально не работают. Так что джитер тут не самое опасное явление. Если посмотреть имульс на последнем диоде, то его длительность будет очень сильно искажена. Вам даже предискажения надо ввести чтобы нормально управлять длинными цепочками. Советую присмотреться к микроконтроллерам i.MX RT1050, там сделаете 16 каналов с бит-стримом без проблем.
|
|
|
|
Сообщений в этой теме
-=TRO=- Хочу писать в 16 линеек WS2812B на макс. скорости. Dec 13 2017, 17:25 DeNi Да и с 3 каналами DMA нормальное решение от одного... Dec 13 2017, 17:54 -=TRO=- Цитата(DeNi @ Dec 13 2017, 21:54) Да и с ... Dec 13 2017, 19:32  Огурцов Цитата(-=TRO=- @ Dec 13 2017, 20... Dec 14 2017, 01:50    jcxz Цитата(-=TRO=- @ Dec 13 2017, 21... Dec 13 2017, 20:08 Огурцов Цитата(-=TRO=- @ Dec 13 2017, 18... Dec 13 2017, 19:15 Plain А откуда задохлик STM32 будет брать такие объёмы в... Dec 13 2017, 19:55 -=TRO=- Plain, по началу с компа, потом с карточки.
К том... Dec 13 2017, 20:03 Plain Отсюда и решение — все данные форматировать на сил... Dec 13 2017, 20:07 -=TRO=- Цитата(Plain @ Dec 14 2017, 00:07) Отсюда... Dec 13 2017, 20:41  jcxz Цитата(-=TRO=- @ Dec 13 2017, 22... Dec 13 2017, 20:44 DeNi Здесь можно почитать подробней про DMA в STM32 - A... Dec 13 2017, 20:10 jcxz Цитата(DeNi @ Dec 13 2017, 22:10) По прио... Dec 13 2017, 20:12 -=TRO=- jcxz, в принципе я был готов, что под задачу понад... Dec 13 2017, 21:09 DeNi Цитата(-=TRO=- @ Dec 14 2017, 00... Dec 13 2017, 21:32  jcxz Цитата(DeNi @ Dec 13 2017, 23:32) Если хо... Dec 13 2017, 21:46 x893 А можно использовать APA102 и забыть про геморрой.... Dec 13 2017, 21:50 -=TRO=- x893, а я темнота и не знал что и такие бывают... ... Dec 13 2017, 22:43 x893 я на 3 канала spi цеплял через dma на 1 MHz Dec 13 2017, 23:58 -=TRO=- Огурцов, вы знаете, а вам таки удалось меня пнуть ... Dec 16 2017, 02:52
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|