Pull to refresh

Comments 23

Из-за разницы питающих напряжений, сигнал следует поднять до уровня 5 вольт с помощью специальной микросхемы-транслятора логики или с помощью настройки GPIO-пина в режиме Open Drain, подтянув его резистором.

Сколько подключал WS281*, прекрасно работают и от 3-вольтовой логики
(ниже уже прочитал в чем проблема)

Это ещё от дохлости ЛДО или нагруженности цепи питания МК зависит. Бывает, что до <3.0 Вольт просаживается, тогда точно не работает

А что Вы используете для согласования уровней? Я обычно использую обычную (HCT/ACT) логику с ТТЛ-входами, интересно узнать, что другие используют)

74HCT245 (и производные от неё, типа 74LVC4245) сам б-г велел. LVC245 можно надёргать с плат от старых струйников с LPT-портами, но у неё питание до 3.6В.

HC в принципе тоже нормально работает, так как Vih для нее заявлен typ. 2.4V при Vcc 4.5V. Хотя при этом же Vih завлен 3.15V (т.е. Vcc x 0.7). Но, тем не менее, работает стабильно.

Для преобразования одной-двух линий раньше пользовался транзистором с резисторами, но потом стал использовать одноканальную логику в корпусах SOT-353, типа NL17SZ17, NC7S14 и пр. Вообще их там в каталоге несколько десятков разновидностей: инвертирующие, неинвертирующие, с триггером Шмитта; c CMOS выходом, 3-state, open-drain, с TTL-входом и т.д.

Ну, с HC - это прямо пограничное состояние, при совпадении обстоятельств может быть фейл

Транслятор уровней не обязателен. Этот адресный светодиод нормально воспринимает сигнал 3.3В. В даташите можете посмотреть в таблице минимальных и максимальных уровней лог. 1 и лог. 0. Так что можно спокойно настраивать ножку микроконтроллера как push-pull и таких завалов фронтов не будет.

В даташите как раз написано "0,7 VDD". И я, вероятно, как и вы думал что это 0.7В, но на деле это оказывается 0.7 * VDD = 0.7 * 5В = 3.5В, что уже не укладывается в 3.3В. И об этом примерно в середине статьи описывается.

Сейчас глянул даташит на свежие WS2812, и там действительно указано 0.7VDD, я когда этими диодами занимался, у меня был даташит, где были указаны пороги именно в напряжении максимальном и минимальном. Так вот там пороги были как у ттл логики. Я написал комментарий по этой теме исходя из личного опыта. У меня адресная лента с такими светодиодами при питании светодиодов от 5 вольт, а питании МК от 3.0Вольт, прекрасно работала.
"Бюрократически" я не прав, каюсь. Но вот на практике я испытывал, и все работало. Но лучше все делать так как указано в даташите, подавая напряжение на вход в указанных рамках.
Но опять же, если верить на 100% даташиту, и реализовать все по даташиту, то эти светодиоды не заработают. Я реализовал протокол на таймере с DMA, и долго не мог понять почему не работает, почему светодиоды совсем не светятся... Хотя по осциллографу все временные интервалы и задержки строго по тому как описано в даташите. Оказалось что параметр "reset", который должен быть по даташиту более 50мкс, на самом деле должен быть более 100мск... А я ставил 80мкс, и светодиоды не принимали команду...

Вероятнее всего (ИМХО) диоды разные бывают.
Под общей торговой маркой каждый подвал что-то своё делает. Мы же не знаем при заказе с алика, оригинальный ли там чип именно от Worldsemi.
Поэтому само собой характеристики будут отличаться от эталонных

https://www.youtube.com/watch?v=mg7p_1fIyy4

Уже давно для адресных светодиодов использую SPI (сигнал MOSI) +DMA. Так экономится память, т.к. одним байтом SPI можно передать сразу 2 бита WS-ки. Предделитель у SPI не такой продвинутый, как у таймеров, но в требуемые тайминги получается уложиться. Главный момент - в конце всегда надо передавать 0x00, иначе на линии MOSI установится высокий уровень от старшего бита последнего переданного байта

В бытовом использовании думаю да, имеет смысл. Право на жизнь имеет, я не спорю =)
НО, SPI всё ещё расходует 2 ножки, что может быть критично на мелких корпусах, если МК как буферный драйвер используется.
Да и SPI как канал управления можно использовать, он шустрее чем UART и I2C будет. В некоторых камнях он всего один, что тоже критично.

Так с SPI в этом смысле как раз никаких проблем не будет (в отличие от i2c, например, если бы его так же применить для сторонней задачи): снять СS со всех устройств и гнать по шине все, что угодно. Или в реальных задачах надо беспрерывно менять состояние диодов?

Так у светодиодов CS нет, когда вы начнете общаться с другими устройствами, светодиоды могут вас и не понять. Или ставить И-НЕ перед светодиодами, чтобы выключать сигнал для них.

Точно, не в ту сторону думал:)

В случае с STM32 можно ремапить SPI MOSI между двумя пинами - с одного дорожка уходит на ленту, с другого - на остальные SPI устройства, нужно только ещё руками доинициализировать GPIO, чтобы при переключении с альтернейта на гпио на линии был правильный уровень

В STM32 можно настроить GPIO так, чтобы от SPI только MOSI наружу торчал, но для этого надо в код, сгенеренный кубом, ручками влезть) И при некоторых ухищрениях и с некоторыми ограничениями можно SPI, используемый для ленты, шарить между другими устройствами. Но тут уже надо по-хорошему контроллер под задачу выбирать, а не наоборот

Я управляю WS2812 непосредственно через UART. Мой крейт для Rust:
https://crates.io/crates/ws2812-uart
Принцип управления тот же, что и на SPI, требуется всего один пин. Сигнал следует инвертировать (STM32 умеет). Старт-бит и стоп-бит UART используются как часть сигнала.

Хммм... Очень интересно, честно говоря, не додумался до такого... Надо испробовать, ибо иногда бывает, что SPI не хватает, а уарты простаивают... Хотя так не получится работать с лентами с синхронным интерфейсом, но они и встречаются сильно реже

UART, видимо, оправдывает букву 'U' в своём названии:) Через него, как оказалось, удобно также реализовать 1-wire путем включения полудуплексного режима.

Разрешите докопаться?

Все методы возвращают enum-статусы.

Для чего? Давайте взглянем, например, на метод ARGB_Clear. В нём вызывается либо ARGB_FillRGB либо ARGB_FillWhite. Но их возвращаемые значения утрачены. Они никуда не сохраняются. Даже если вызванная функция как-то сообщит о проблеме, всё равно вернётся ARGB_OK. В чём тогда смысл тратить такт на запись возвращаемого значения в регистр, когда можно просто вернуть void?

Согласен, косяк, проглядел видимо. Спасибо, что обратили внимание
Issue создал, позже поправлю

Такой подход я вообще в ST-шном HAL-е подсмотрел. Долго думал, имеет ли он смысл, пришёл к выводу, что имеет, при использовании RTOS, например.
Тут вопрос, конечно, к программисту, как он логику тасков будет прописывать, но с общим ресурсом-статусом есть риск ошибиться

Ну и оптимизировать 1-2 такта, используя при этом HAL, как-то странно )

Sign up to leave a comment.

Articles