реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32F407 и USB с BULK, Нужна помощь от бывалых
mic_arm
сообщение Feb 16 2018, 08:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 26-01-11
Пользователь №: 62 484



Привет всем! Понадобилось мне тут сделать девайс на STM32F407 и подключить его к хосту через USB. Но только чтобы контрольную точку содержал и конечные точки типа bulk. Помогите разобраться с чего начать и может есть какието примеры.
Спасибо!
Go to the top of the page
 
+Quote Post
mcheb
сообщение Feb 16 2018, 08:46
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Скачайте с сайта ST CubeMX и будет Вам счастье. На 407 Работает из коробки. На других может не заработать.
Go to the top of the page
 
+Quote Post
mic_arm
сообщение Feb 16 2018, 09:10
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 26-01-11
Пользователь №: 62 484



а какой класс необходимо выбрать при конфигкрации (CDC, HID, MSC...)?
Go to the top of the page
 
+Quote Post
mcheb
сообщение Feb 16 2018, 09:20
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



http://microsin.net USB in a NutShell
Чтение информации из интернета вслух - 100 евро в час

Сообщение отредактировал mcheb - Feb 16 2018, 09:21
Go to the top of the page
 
+Quote Post
DeNi
сообщение Feb 16 2018, 09:24
Сообщение #5


Участник
*

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



Для Bulk лучше использовать класс WinUSB. Тогда можно использовать драйвер winusb в Windows и linusb в Linux, и работать уже из пользовательского режима.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 16 2018, 14:40
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(mic_arm @ Feb 16 2018, 12:10) *
а какой класс необходимо выбрать при конфигкрации (CDC, HID, MSC...)?

Я брал MSC, выбрасывал реализацию SCSI, оставляя только две точки IN/OUT
Под Win можно и libusb использовать, драйвер генерится утилитой Zadig на счёт раз
Go to the top of the page
 
+Quote Post
mic_arm
сообщение Feb 16 2018, 15:36
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 26-01-11
Пользователь №: 62 484



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

Спасибо за наводку. Тут дело вот в чём... мне необходимо сделать клон некоего девайса. Сей девайс работает на булках (судя по перехвату пакетов дескрипторов) и не является каким либо стандартным устройством (устанавливается свой хитрый драйвер)... Есть небольшой опыт работы с HID и VCP, а вот с таким устройством впервые сталкиваюсь. По сути необходимо сделать реверс инжиниринг...
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 16 2018, 19:35
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Если идентичные дескрипторы, устройство одинаково реагирует на пакеты в булке OUT, то целевая программа и не заметит подмены, причём на любом контроллере, не только F407
Go to the top of the page
 
+Quote Post
dachny
сообщение Feb 17 2018, 08:59
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 7-07-04
Пользователь №: 284



QUOTE (mic_arm @ Feb 16 2018, 13:10) *
а какой класс необходимо выбрать при конфигкрации (CDC, HID, MSC...)?

WinUSB
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Feb 17 2018, 09:07
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

Прекрасный совет! Но там совершенно адский USB-стек. Мухи, котлеты активно замешаны с индусским рисом и карри в единое трудноделимое нечто.
Отрывать от него лишнее и подсовывать своё очень неудобно.
Я делал на основе LibOpenCM3 - пишем дескриптор (да, предварительно надо покурить USB in Nutshell), инициализируем нужные endpoint'ы - и всё, готово, можно обмениваться данными.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
картошка
сообщение Feb 20 2018, 12:58
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673



LibUSB32 под винду. И полная кастрация MSC реализации (как toweroff советовал)с STM32 Stdlib, чтоб осталось только 3 usb функции wink.gif. Собственно один раз чик и на долгое время хватит.

Сообщение отредактировал картошка - Feb 20 2018, 13:00
Go to the top of the page
 
+Quote Post
mic_arm
сообщение Feb 28 2018, 14:50
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 26-01-11
Пользователь №: 62 484



Вроде что-то начало получаться. Демоплата встала под драйвера libusb... но вот новая напасть, ктонить знает чем отлаживать всё это дело? В смысле есть ли в природе что-то типа терминалок, чтобы принимать/отправлять bulk-пакеты? Я в сети ничего подобного найти не смог.
Заранее спасибо!
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 28 2018, 14:56
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(mic_arm @ Feb 28 2018, 17:50) *
Вроде что-то начало получаться. Демоплата встала под драйвера libusb... но вот новая напасть, ктонить знает чем отлаживать всё это дело? В смысле есть ли в природе что-то типа терминалок, чтобы принимать/отправлять bulk-пакеты? Я в сети ничего подобного найти не смог.
Заранее спасибо!

Так в примерах libusb было же. Открываем устройство, интерфейс и шлем в булку
Строк на сях работы с девайсом десятка два
Go to the top of the page
 
+Quote Post
mic_arm
сообщение Feb 28 2018, 15:55
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 26-01-11
Пользователь №: 62 484



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

В примерах да, исходники есть. Я надеялся, что есть уже собраные утилитки для этого, как для ком-порта.
Go to the top of the page
 
+Quote Post
mic_arm
сообщение Mar 4 2018, 12:59
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 26-01-11
Пользователь №: 62 484



И вновь здрасти!!! Воюю с булками с переменным успехом... утилитку для приёма / отправки сообщений собрал в Qt, вроде работает... По ходу пьесы возникло вот такое наблюдение, если я посылаю с компа пакет OUT и в обработчике пакета OUT на стороне микроконтроллера выкладываю в буфер IN данные для передачи на комп, то всё работает как часы. Но если я просто хочу забрать пакет с контроллера (читаю конечную точку IN ), то ничего не читается. Изучая материалы по USB я понял что хост может просто читать конечную точку IN без предварительной записи точки OUT... Подскажите где я ошибаюсь? Спасибо!

Сообщение отредактировал mic_arm - Mar 4 2018, 13:01
Go to the top of the page
 
+Quote Post
toweroff
сообщение Mar 4 2018, 13:50
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Так точки ж абсолютно независимые
Нужно принять - проверяем буфер точки OUT. А в её прерывании просто складываем в буфер
Нужно передать - проверяем активность передачи и или докладываем в буфер передачи, или сразу вызываем передачу. В прерывании точки IN, если в буфере что-то есть, опять вызываем передачу. Нечего передавать - сбрасываем флаг
Как-то так
Go to the top of the page
 
+Quote Post
mic_arm
сообщение Mar 4 2018, 19:08
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 26-01-11
Пользователь №: 62 484



Цитата(toweroff @ Mar 4 2018, 16:50) *
Так точки ж абсолютно независимые
Нужно принять - проверяем буфер точки OUT. А в её прерывании просто складываем в буфер
Нужно передать - проверяем активность передачи и или докладываем в буфер передачи, или сразу вызываем передачу. В прерывании точки IN, если в буфере что-то есть, опять вызываем передачу. Нечего передавать - сбрасываем флаг
Как-то так

Точку OUT я и обрабатываю в прерывании. В нём же я складываю партию данных для передачи через точку IN, они благополучно уходят на хост ( длина пакета не более 32 байт) . Это происходит при вызове функций на хосте: ЗАПИСЬ В OUT -- ЧТЕНИЕ ИЗ IN.
Но если на хосте вызвать только ЧТЕНИЕ ИЗ IN, то чтение не происходит (даже прерывание не возникает).
Или... вы хотите сказать, что для того, чтобы хост забрал данные с помощью ЧТЕНИЕ ИЗ IN, эти данные необходимо сначала записать в буфер отправки точки IN, а хост когда ему надо будет заберёт их?
Go to the top of the page
 
+Quote Post
alexunder
сообщение Mar 4 2018, 21:43
Сообщение #18


unexpected token
****

Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987



Цитата(mic_arm @ Mar 4 2018, 20:08) *
Или... вы хотите сказать, что для того, чтобы хост забрал данные с помощью ЧТЕНИЕ ИЗ IN, эти данные необходимо сначала записать в буфер отправки точки IN, а хост когда ему надо будет заберёт их?

Конечно. Данные на нижнем уровне должны быть готовы.


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
EugenyAM
сообщение Mar 19 2018, 11:10
Сообщение #19


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 14-10-08
Из: Omsk
Пользователь №: 40 929



Цитата(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 в проекте не используется.
Есть ли известное решение данной проблемы?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th August 2025 - 09:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01523 секунд с 7
ELECTRONIX ©2004-2016