Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F407 и USB с BULK
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
mic_arm
Привет всем! Понадобилось мне тут сделать девайс на STM32F407 и подключить его к хосту через USB. Но только чтобы контрольную точку содержал и конечные точки типа bulk. Помогите разобраться с чего начать и может есть какието примеры.
Спасибо!
mcheb
Скачайте с сайта ST CubeMX и будет Вам счастье. На 407 Работает из коробки. На других может не заработать.
mic_arm
а какой класс необходимо выбрать при конфигкрации (CDC, HID, MSC...)?
mcheb
http://microsin.net USB in a NutShell
Чтение информации из интернета вслух - 100 евро в час
DeNi
Для Bulk лучше использовать класс WinUSB. Тогда можно использовать драйвер winusb в Windows и linusb в Linux, и работать уже из пользовательского режима.
toweroff
Цитата(mic_arm @ Feb 16 2018, 12:10) *
а какой класс необходимо выбрать при конфигкрации (CDC, HID, MSC...)?

Я брал MSC, выбрасывал реализацию SCSI, оставляя только две точки IN/OUT
Под Win можно и libusb использовать, драйвер генерится утилитой Zadig на счёт раз
mic_arm
Цитата(toweroff @ Feb 16 2018, 17:40) *
Я брал MSC, выбрасывал реализацию SCSI, оставляя только две точки IN/OUT
Под Win можно и libusb использовать, драйвер генерится утилитой Zadig на счёт раз

Спасибо за наводку. Тут дело вот в чём... мне необходимо сделать клон некоего девайса. Сей девайс работает на булках (судя по перехвату пакетов дескрипторов) и не является каким либо стандартным устройством (устанавливается свой хитрый драйвер)... Есть небольшой опыт работы с HID и VCP, а вот с таким устройством впервые сталкиваюсь. По сути необходимо сделать реверс инжиниринг...
toweroff
Если идентичные дескрипторы, устройство одинаково реагирует на пакеты в булке OUT, то целевая программа и не заметит подмены, причём на любом контроллере, не только F407
dachny
QUOTE (mic_arm @ Feb 16 2018, 13:10) *
а какой класс необходимо выбрать при конфигкрации (CDC, HID, MSC...)?

WinUSB
esaulenka
Цитата(mcheb @ Feb 16 2018, 11:46) *
Скачайте с сайта ST CubeMX и будет Вам счастье. На 407 Работает из коробки. На других может не заработать.

Прекрасный совет! Но там совершенно адский USB-стек. Мухи, котлеты активно замешаны с индусским рисом и карри в единое трудноделимое нечто.
Отрывать от него лишнее и подсовывать своё очень неудобно.
Я делал на основе LibOpenCM3 - пишем дескриптор (да, предварительно надо покурить USB in Nutshell), инициализируем нужные endpoint'ы - и всё, готово, можно обмениваться данными.
картошка
LibUSB32 под винду. И полная кастрация MSC реализации (как toweroff советовал)с STM32 Stdlib, чтоб осталось только 3 usb функции wink.gif. Собственно один раз чик и на долгое время хватит.
mic_arm
Вроде что-то начало получаться. Демоплата встала под драйвера libusb... но вот новая напасть, ктонить знает чем отлаживать всё это дело? В смысле есть ли в природе что-то типа терминалок, чтобы принимать/отправлять bulk-пакеты? Я в сети ничего подобного найти не смог.
Заранее спасибо!
toweroff
Цитата(mic_arm @ Feb 28 2018, 17:50) *
Вроде что-то начало получаться. Демоплата встала под драйвера libusb... но вот новая напасть, ктонить знает чем отлаживать всё это дело? В смысле есть ли в природе что-то типа терминалок, чтобы принимать/отправлять bulk-пакеты? Я в сети ничего подобного найти не смог.
Заранее спасибо!

Так в примерах libusb было же. Открываем устройство, интерфейс и шлем в булку
Строк на сях работы с девайсом десятка два
mic_arm
Цитата(toweroff @ Feb 28 2018, 17:56) *
Так в примерах libusb было же. Открываем устройство, интерфейс и шлем в булку
Строк на сях работы с девайсом десятка два

В примерах да, исходники есть. Я надеялся, что есть уже собраные утилитки для этого, как для ком-порта.
mic_arm
И вновь здрасти!!! Воюю с булками с переменным успехом... утилитку для приёма / отправки сообщений собрал в Qt, вроде работает... По ходу пьесы возникло вот такое наблюдение, если я посылаю с компа пакет OUT и в обработчике пакета OUT на стороне микроконтроллера выкладываю в буфер IN данные для передачи на комп, то всё работает как часы. Но если я просто хочу забрать пакет с контроллера (читаю конечную точку IN ), то ничего не читается. Изучая материалы по USB я понял что хост может просто читать конечную точку IN без предварительной записи точки OUT... Подскажите где я ошибаюсь? Спасибо!
toweroff
Так точки ж абсолютно независимые
Нужно принять - проверяем буфер точки OUT. А в её прерывании просто складываем в буфер
Нужно передать - проверяем активность передачи и или докладываем в буфер передачи, или сразу вызываем передачу. В прерывании точки IN, если в буфере что-то есть, опять вызываем передачу. Нечего передавать - сбрасываем флаг
Как-то так
mic_arm
Цитата(toweroff @ Mar 4 2018, 16:50) *
Так точки ж абсолютно независимые
Нужно принять - проверяем буфер точки OUT. А в её прерывании просто складываем в буфер
Нужно передать - проверяем активность передачи и или докладываем в буфер передачи, или сразу вызываем передачу. В прерывании точки IN, если в буфере что-то есть, опять вызываем передачу. Нечего передавать - сбрасываем флаг
Как-то так

Точку OUT я и обрабатываю в прерывании. В нём же я складываю партию данных для передачи через точку IN, они благополучно уходят на хост ( длина пакета не более 32 байт) . Это происходит при вызове функций на хосте: ЗАПИСЬ В OUT -- ЧТЕНИЕ ИЗ IN.
Но если на хосте вызвать только ЧТЕНИЕ ИЗ IN, то чтение не происходит (даже прерывание не возникает).
Или... вы хотите сказать, что для того, чтобы хост забрал данные с помощью ЧТЕНИЕ ИЗ IN, эти данные необходимо сначала записать в буфер отправки точки IN, а хост когда ему надо будет заберёт их?
alexunder
Цитата(mic_arm @ Mar 4 2018, 20:08) *
Или... вы хотите сказать, что для того, чтобы хост забрал данные с помощью ЧТЕНИЕ ИЗ IN, эти данные необходимо сначала записать в буфер отправки точки IN, а хост когда ему надо будет заберёт их?

Конечно. Данные на нижнем уровне должны быть готовы.
EugenyAM
Цитата(DeNi @ Feb 16 2018, 15:24) *
Для Bulk лучше использовать класс WinUSB. Тогда можно использовать драйвер winusb в Windows и linusb в Linux, и работать уже из пользовательского режима.


А как сконфигурировать в CubeMX этот класс? В списке для USB Device его нет.
Пытаюсь поднять USB_OTG_HS в режиме FS с внутренним phy. Нужно задействовать 5 конечных точек bulk и interrupt.
До этого работал на F103 с SPL - проблем с реализацией USB не было.
Сгенерил проект на F207 с классом CDC, под IAR, начал переконфигурировать конечные точки и получил интересный результат - конечная точка типа IN передает данные только
в том случае, когда ее номер равен 0x81. Если изменить номер на 0x82, 0x83 и.т.д. данные не передаются.
Если задать две точки 0x81, 0x82 передает данные только через 0x81.
Выделенное прерывание на EP1 в проекте не используется.
Есть ли известное решение данной проблемы?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.