LINUX.ORG.RU

V-USB для AVR микроконтроллеров. Насколько стабильно для продакшена?

 , , , ,


0

1

https://ru.wikipedia.org/wiki/V-USB

Читал, что есть проблемы со стабильностью: могут внезапно отваливаться устройства, а также кабель должен быть очень короткий (не более 5 см).

Насколько правда? Кто-нибудь юзал в продакшене? Для каких задач и для каких МК?

Какие могут быть подводные камни при использовании ардуины (atmega328) и attiny?

Юзал на ATMEGA8 и ATTINY85. Нормально работает с кабелем умеренной длины (полметра-метр), совсем длинные не пробовал. Глюков, если соблюдать одно условие (во всех обработчиках прерываний делать первым делом sei, чтобы не пропустить ни одного прерывания от INT0, к которому подключен USB), не замечено.

Годится для задач, где не нужно передавать большие объёмы данных. Типа там релюшкой щёлкнуть с компьютера или раз в секунду слать пакет по NRF24L01 с компа и обратно. Также надо учитывать, что некоторые классы USB невозможно реализовать. Например, с USB CDC будут проблемы. Оптимально - HID или кастомный протокол.

Также V-USB не умеет в спящие режимы. Так что от греха подальше лучше отрубить всё энергосбережение USB и не уводить компьютер в сон с девайсом (точнее уводить можно, но после пробуждения скорее всего придётся его переткнуть).

Таким образом в некоторой области V-USB вполне юзателен. Но для чего-то серьёзного (не в плане требований к надёжности, но в плане требований к функционалу) лучше взять МК с аппаратным USB. Посмотри в сторону STM32. Они стоят не дороже AVR, но превосходят их по всем параметрам.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 3)
Ответ на: комментарий от KivApple

Юзал на ATMEGA8 и ATTINY85. Нормально работает с кабелем умеренной длины (полметра-метр).

А что со стабилизацией питания и экранированием? Просто на метре уже должна просесть напруга (если не отдельный БП). А также не понятно, куда крепить экран кабеля со стороны устройства с контроллером.

Например, с USB CDC будут проблемы

Дык есть же реалиция. Даже SD-кардридер делали (правда, там только 14 килобайт в секунду было) massstorage класса.

(точнее уводить можно, но после пробуждения скорее всего придётся его переткнуть).

Вот, кстати, очень хороший вопрос: можно ли как-то заставить девайс проверять, не отлетел ли он от линии? Или, например, слать из компьютера раз в 5 секунд пакеты в определённый эндпоинт для сброса вотчдога? И самое: можно ли переинициализовать V-USB без сброса состояния МК? Например, если у меня там сейчас ноги в определённом состоянии, и оно не должно меняться?

Но для чего-то серьёзного

Не логичнее ли тогда использовать старый-добрый UART с FTDI-USB? Большинство МК имеют аппаратную поддержку (с буферами) UART и в интернетах пишут, что atmega328 может эффективно работать на 500 000 бод, а с оптимизациями кода до 2 000 000 бод. Я думаю, что ситуаций, когда этого недостаточно не так уж много. А вот сделать такое решение будет куда проще.

Так что в сухом остатке то? Получается, что проще оставаться на UART, если устройство критично с внезапной смене состояний?

leretan
() автор топика
Ответ на: комментарий от leretan

старый-добрый UART с FTDI-USB

Мне кажется, что это будет дороже, чем СТМ.

Если очень простое устройство, то можно и на V-USB.

Про ноги — сохраняй состояние в EEPROM и ресеть сколько хочешь, либо софтварно чисти память и регистры и начинай с нулевого вектора.

должна просесть напруга

Иди книжку, что ли, почитай, разработчик.

anonymous
()
Ответ на: комментарий от anonymous

Иди книжку, что ли, почитай, разработчик.

При метровом кабеле то? Ещё как. USB-харды даже с полметрового не заводятся.

leretan
() автор топика
Ответ на: комментарий от leretan

Иди книжку прочитай[2].

У твоего устройства потребляемый ток какой будет?

intelfx ★★★★★
()

V-USB годно весьма условно. Если нужно что-то сложнее кнопки или датчика, или, тем более, всякое isochronous или много интерфейсов в одном девайсе - то лучше взять однокристалку с каким-нибудь USB-device железом. Начиная от PIC18F2550 и далее, лучше наверно всякие STM32, если один хрен плату разводить. Если быстренько на макетке один раз собрать - то PIC в DIP.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

stm32 минималистические демоборды довольно дешевы, формата дип40... одно но - на самых дешевых (те что по 2.5 бакса и с SOT-23-5 стабилизатором питания) могут быть грабли с RTC (долго инициализируется), фиксированная подтяжка юсб к +3.3 (т.е. рестартонуть соединение с другим классом не выйдет).

вроде stm32 leaf таки постабильнее будет.

NiTr0 ★★★★★
()

Для чего-то серьезного не годится. Возьми лучше STM32F103C8T6 (к примеру), там аппаратный USB есть, а по цене выходит дешевле, чем AVR.

Meyer ★★★★★
()
Ответ на: комментарий от leretan

Просто на метре уже должна просесть напруга

Если у тебя девайс из одной атмеги, которая жрёт несколько десятков миллиампер, то ничего не просядет. Точнее просядет, но слишком незначительно. Да и просесть должно на 0.5В, чтобы МК что-то заметил (у ATMEGA8 минимальное рабочее напряжение по даташиту 4.5В, по факту заработает и при большей просадке). USB HDD, 3G-модемы жрут сотни миллиампер, поэтому просадка сильнее.

А также не понятно, куда крепить экран кабеля со стороны устройства с контроллером.

Соединять экран с GND, не? И как это зависит от используемого микроконтроллера? Разве есть микроконтроллеры с отдельным входом для экрана кабеля USB? Вроде у всех только D+, D-, VBUS и GND. Ну максимум ещё ID, если умеет OTG.

И самое: можно ли переинициализовать V-USB без сброса состояния МК?

Должно быть можно. Ну вообще запретить прерывание INT0, перевести какую-то ногу (не помню то ли D+, то ли D-) в режим выхода и выдать ноль в течении 250 мс. Это по сути дела будет имитацией отключения девайса от компьютера (в хосте есть подтяжка линии к земле резистором 15 кОм, в девайсе по схеме V-USB надо поставить подтяжку 1.5 кОм к плюсу, если принудительно прижать линию к земле, то это будет выглядеть как пропадание подтяжки 1.5 кОм). Не по стандарту, но всегда работает. Если не жалко ног, то можно резистор подтяжки 1.5 кОм подключить не к плюсу, а к ещё одной ножке МК. Тогда надо просто выдавать 0 на эту ножку, чтобы отключить подтяжку. Это будет уже полностью по стандарту. Когда подтяжка вернётся хост пошлёт USB RESET (вызывает сброс машины состояний USB, а не всего МК). V-USB это корректно обработает.

Дык есть же реалиция.

Реализация есть, но она сильно нарушает стандарт USB (Interrupt endpoint вроде как нельзя создавать на Low Speed устройстве). И поэтому не работает на многих ОС. И нет гарантий, что не перестанет работать с обновлениями на остальных. Хотя где-то работает, да.

Так что в сухом остатке то? Получается, что проще оставаться на UART, если устройство критично с внезапной смене состояний?

STM32F103C8 стоит дешевле, чем ATMEGA8 + FT232. Причём значительно дешевле. При этом имеет раз в 10 большую производительность ядра, в несколько раз больше флеша и ОЗУ, а скорость USB до 12 МБит/сек (полноценное Full Speed устройство + поддежка всех типов endpoint - реализуй любой класс и это не будет нарушать никаких стандартов). Ну и нормальная фон-неймановская архитектура вместо ущербной гарвардской (последняя вызывает сильное раздувание кода, если активно использовать указатели + указатели сами по себе бывают двух типов и это постоянно надо держать в голове).

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от leretan

А также не понятно, куда крепить экран кабеля со стороны устройства с контроллером.

Для low speed экран не обязателен.

А вообще, с подключением сигнальной земли и экрана в USB все очень неоднозначно.
Разные производители чипов дают разные рекомендации, зачастую противоречащие друг другу. Intel - одно, TI - другое, FTDI - третье.

dvl36
()
8 ноября 2017 г.

Поделюсь своим опытом сборки устройства с V-USB

В рекомендуемой схеме подключения используются стабилитрон 3,6в, которые вешаются на D+/D-. это просто мистика какая-то. Я перепробовал несколько различных серий (включая те, про которые говорили, что они точно рабочие) с необходимой мощностью, все по фен-шую, но все-равно USB заводился через раз.

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

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

1. Запитал atmega8 от стабилизатора на 3.3в, выкинул подальше стабилитроны 2. Поставил кварц на 12мгц, благо есть ассемблерная реализация для этой частоты и МК с питанием 3.3в стабильно работает на этой частоте

И все стало отлично. Месяц без сбоев. Кабель для устройства хилый и на 2 метра!

LitLageR
()

Если нужно полноценное USB и максимально просто - то PIC18F2550 в руки и вперёд. Там даже isochronous работает. И примеров использования полно.

Так-то V-USB неплох для какой-нибудь затычки имитирующей клавиатуру, или чтоб светодиодиком моргать/релюшкой щёлкать, но если надо что-то посерьёзне, да ещё и в продакшен, то лучше всё-же на PIC сделать. Ну или на каком другом uC где USB в железе сделано.

Stanson ★★★★★
()

Чувак, сейчас аврки только 90-летние пердуны используют!

Зачем тебе это говно мамонта?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.