Комментарии 23
Идея с UART хорошая, SPI конкретно на STM32 работает хуже. DMA не обязателен, достаточно включения буферизации у UART. Скорость должна быть 3.75 Мбод, 8-N-1, отправляются два бита в одном байте. Формат байта: 0xx100yy, где xx - первый бит, yy - второй бит (каждый бит повторяется дважды). Алгоритм проверен на WS2812 и SK6812. Моя реализация.
По-колхозному можно подавать на WS2812 и 3-вольтовую логику, в большинстве случаев они ее воспринимают, хотя это не гарантируется. Преобразовывать уровень в случае, если между диодами и схемой есть провод, надежнее не подтяжкой, а любым 74LVT. Если диодов очень много, то в качестве этого 74-го можно использовать демультиплексор, чтобы разбить светодиоды на несколько независимых групп, а не ставить все одной цепью.
Собрал как раз на SPI. Частота ядра - 20МГц, предделитель SPI - /4 (5МГц). 8 бит-слотов занимают 12.8мкс, 1 бит-слот - 1.6мкс (по какой-то причине светодиоды лучше всего заработали именно с этой скоростью). Данные отправляются по DMA. Используется 48 байт. 0x70 = '1', 0x40 = 0. Буфер кольцевой, 2*24 байта (бита). По прерыванию DMA уже отправленная половина буфера заполняется новыми значениями для передачи. 20 светодиодов вообще без сбоев приёма обновляются.
Диоды работают от того же питания 3.3В и чувствуют себя хорошо, как минимум, не отключаются и даже выходят на полную яркость (но ток потребления в батарейном устройстве для такого режима черезмерен, как и яркость для индикаторов).
На SPI пакость в том, что SPI довольно значительно различается между разными STM32 и местами даже между ревизиями одного и того же чипа, про него много Errata. Поэтому код получается плохо переносим. Это не значит, что он не будет работать, но с UART просто проще и переносимее. Код для UART вообще можно написать полностью переносимым и не зависящим от архитектуры контроллера, если его параметризовать функцией "послать байт".
повторители ставят обычно что бы защитить нежные порты от агрессивного внешнего мира, а схема с OD внутри корпуса вполне нормальная, все I2C шины так и цепляются, и никто им логику дополнительно не ставит. В демультиплексорах смысл отпал, портов у современных контроллеров как котов у поехавшей старушки.
I2C работает на очень небольших дистанциях и чувствительна к помехам из-за большого сопротивления подтяжки и отсутствия согласования линии как класса. Повторитель с push-pull выходом имеет меньшее выходное сопротивление и допускает более длинные кабели, что как раз для светодиодов актуально.
Простое решение для длинного кабеля без отдельного повторителя - поставить первый светодиод на саму плату с контроллером, а кабель уже после него.
Демультиплексоры актуальны, если процессор рулит не только светодиодами. Израсходовать 100+ пинов гораздо проще, чем кажется, особенно если нужно вешать внешнюю память и/или дисплей. Если не уложиться в 176 пинов, придется паять BGA.
Сперва покажи мне проект со 100+ матрицами на 1024 светодиода на длинных проводах подключенных к обычному контроллеру, потом уже говори что так нельзя. Пока что ваше решение разве что дороже, но не лучше.
Жирный минус этих светиков - слишком яркие на минимальной яркости и эффектов не получишь кроме вкл/выкл, т.к. яркость "регулируется цветом". Потому, для ламп-ночников не годятся.
Это да, но есть аналоги с отдельным байтом под яркость.
Вот бы сейчас в 2023-м красить и плёнку колхозить. В 80-е накрасились и наколхозились.
Правильно. Лучше мерзотный ШИМ вкорячить на частоте поменьше.
в те же 80е все газоразрядники прикрывались тонированным прозрачным пластиком, что бы яркие цвета стали загадочными полутонами. Кстати светодиодные индикаторы в китайских дивидишниках и тв dvbt приставках до сих пор тонированные, норм решение.
слишком яркие на минимальной яркости и эффектов не получишь кроме вкл/выкл, т.к. яркость "регулируется цветом". Потому, для ламп-ночников не годятся.
какая-то ересь. нет такого.
закажи сразу круг, и будет тебе развлечение
А зачем вам копировать рандом из AVR-libc? У gcc-arm свой должен быть (скорее всего примерно такой же). Точнее у newlib-nano или что там
Я сперва себе для проекта с attiny вот эту функцию написал, https://github.com/dltech/desk_lamp/blob/main/lib/random127.c . А тут уже чисто по привычке скопировал, щас заглянул в исходники libnewlib, понял что тупанул.
Я В своё время пытался сделать HAL для светодиодов. В качестве исходных кодов для переписывания нашел работу через DMA и bit-banding и библиотеку для Ардуино от Алекса Гивера.
https://www.martinhubacek.cz/blog/stm32-ws2812b-dma-library/
На rp2040 с их PIO совершенно замечательно пилить мозги для таких светодиодов
WS2812B/WS2811 + STM32