Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: usb stm32f401
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
juvf
Что то не получается USB FS поднять. Как работает USB?
1) Подключается к компу кабелем USB Device
2)устройство на шине создает эффект присутствия.
3)Комп(хост) видит что на усб кто-то появился на начинает процедуру енумерации
4)в девайсе срабатывае прерывание УСБ. Сначало сработает такое прерыванеи, на него девайс должен ответить то и то
5)потом комп сделает то и то
6).... и т.д....

У меня комп видит девайс.... в уарт выводится отладочная информация
Код
USB Device Library v1.1.0 [FS]..
DCD_HandleUsbReset_ISR..
DCD_HandleEnumDone_ISR..
USB Device Library v1.1.0 [FS]..
DCD_HandleUsbReset_ISR..
DCD_HandleEnumDone_ISR..
USB Device Library v1.1.0 [FS]..
DCD_HandleUsbReset_ISR..
DCD_HandleEnumDone_ISR..
USB Device Library v1.1.0 [FS]..
DCD_HandleUsbReset_ISR..
DCD_HandleEnumDone_ISR..
DCD_HandleUSBSuspend_ISR..
> USB Device in Suspend Mode....


и комп не может выичитать пид и вид. USB постоянно ресетиться. почему? Плата дискавери на 401-ом. Демопроект работает, а свой не могу поднять.
Fedor
Как работает usb можно почитать на usb.org
как вариант, вывод отладочной информации в уарт в процессе инициализации usb мешает работе usb?
ViKo
Лучшая книга для изучения USB - Михаил Гук. Шины PCI, USB, FireWire.
juvf
Цитата(Fedor @ Apr 3 2016, 00:59) *
вывод отладочной информации в уарт в процессе инициализации usb мешает работе usb?
не должен. в прерывании в очередь отправляется указатель на сообщение, в фоновой задаче идет вывод сообщений в уарт
Цитата
Как работает usb можно почитать на usb.org
ну это все равно что "Почитай в инете"

На скрине вывод отладочной информации.....
1)>USB Device Connected... - устройство подключено
2)DCD_SessionRequest_ISR - попал в обработчик прерывания усб по флагу OTG_FS_GINTSTS.SRQINT. Вызывается из библиотеки DCD_SessionRequest_ISR()
3) DCD_HandleUsbReset_ISR - попал в обработчик прерывания усб по флагу OTG_FS_GINTSTS.USBRST
4) DCD_HandleEnumDone_ISR - попал в обработчик прерывания усб по флагу OTG_FS_GINTSTS.ENUMDNE
здесь вызвается обработчик этого прерывания в котором вызывается USB_OTG_EP0Activate(). USB_OTG_EP0Activate() возвращяет USB_OTG_OK. Вроде всё нормально...

ВНЕЗАПНО!!!
5)DCD_HandleUsbReset_ISR - опять попал в обработчик прерывания усб по флагу OTG_FS_GINTSTS.USBRST
в даташите на этот бит "The core sets this bit to indicate that a reset is detected on the USB." Почему ядро ресетится? Ему хост присылает команду отресетиться? Или у ядра какой вачдок срабатывает? Не могу понять.... Ну и далее всё по кругу.... емумдан-ресет-енумдан-ресет..... и в конце USB in SuspendMode!!!

Кто нибудь разбирался на низком уровне с USB? Почему так происходит?
romas2010
Цитата(juvf @ Apr 4 2016, 15:59) *
Кто нибудь разбирался на низком уровне с USB? Почему так происходит?


Поизучайте код,встаньте на отладку на то место,где происходит прием control ep0 в фазе setup,и далее идите пошагово и анализируйте ,что и сколько байт вы передаете хосту,и то ли вы передаете согласно спецификации USB
esaulenka
Reset - это команда со стороны хоста.
Виндовс при подключении устройства делает reset, потом считывает дескрипторы, потом снова reset, снова считывает дескрипторы, и только потом считает, что процедура подключения завершена.
Почему так, видел какое-то внятное описание, но забыл где...

PS должно сильно поспособствовать сравнение рабочего и нерабочего вариантов каким-нибудь сниффером. Я крайний раз пользовался "free usb analyzer". Не очень удобно, зато совесть чиста :-)
www...
Компилятор Keil? Начальный код кубе генерили?
Если да, установите Heap_Size 0x400
juvf
Цитата(www... @ Apr 5 2016, 09:32) *
Компилятор Keil? Начальный код кубе генерили?
Если да, установите Heap_Size 0x400

IAR. нет не в кубе, код взят из библиотеки STM32F401-Discovery_FW_V1.0.0. стоит cstack = 0x400, heap = 0x1000

Цитата
встаньте на отладку на то место,где происходит прием control ep0 в фазе setup
Не попадает туда код. Вот нашел отличия между рабочим кодом из демо проекта с моим.

Последовательность усб-ишных прерываний в процессоре.... в рабочем демо
Сначало происходит прерывание по флагу OTG_FS_GINTSTS.USBRST (usb rerset)
далее OTG_FS_GINTSTS.ENUMDNE
OTG_FS_GINTSTS.RXFLVL
OTG_FS_GINTSTS.RXFLVL
OTG_FS_GINTSTS.OEPINT
OTG_FS_GINTSTS.IEPINT
OTG_FS_GINTSTS.IEPINT
OTG_FS_GINTSTS.IEPINT
OTG_FS_GINTSTS.IEPINT
OTG_FS_GINTSTS.IEPINT
OTG_FS_GINTSTS.RXFLVL
....
и т.д. Нормальный обмен

Какие прерывания и в какой последовательности срабатывают при подключении усб к компу в нерабочем коде:
OTG_FS_GINTSTS.USBRST
OTG_FS_GINTSTS.ENUMDNE
OTG_FS_GINTSTS.USBRST
OTG_FS_GINTSTS.ENUMDNE
OTG_FS_GINTSTS.USBRST
OTG_FS_GINTSTS.ENUMDNE
OTG_FS_GINTSTS.USBRST
OTG_FS_GINTSTS.ENUMDNE
OTG_FS_GINTSTS.ESUSP

что не нравиться хосту? почему он постоянно ресетит девайс? Посмотрел что в обработчике на енумДан.... и в том и в том проекте один т тот же код.... вычитывает регистр GUSBCFG, выставлает в его поле usbtrdtim = 5, и записывает обратно в GUSBCFG. И там и там значения регистра одинаковы. Почему хост после опять запрашивает ресет?
OTG_FS_GINTSTS.USBSUSP


Цитата
должно сильно поспособствовать сравнение рабочего и нерабочего вариантов каким-нибудь сниффером. Я крайний раз пользовался "free usb analyzer". Не очень удобно, зато совесть чиста :-)
А как оно работает? Можно наверно под\смотреть обмен с распознанным устройством. А если устройство не распознано и его нет в дерево в окошке Devices..... как подсмотреть обмен компьютера с новым подключаемым нераспознанным устройством?
jcxz
Цитата(juvf @ Apr 5 2016, 16:21) *
А как оно работает? Можно наверно под\смотреть обмен с распознанным устройством. А если устройство не распознано и его нет в дерево в окошке Devices..... как подсмотреть обмен компьютера с новым подключаемым нераспознанным устройством?

Сделать лог обмена на UART. Только конечно буферизованный лог - чтоб не тормозил сам обмен.
В своё время, при проблемах на фазе энумерации устройства на своём USB-стеке на L-137, мне именно только такой метод и помог.
juvf
Цитата(jcxz @ Apr 5 2016, 15:34) *
Сделать лог обмена на UART. Только конечно буферизованный лог - чтоб не тормозил сам обмен.
В своё время, при проблемах на фазе энумерации устройства на своём USB-стеке на L-137, мне именно только такой метод и помог.
Так он у меня есть. Я этот лог в самом начале показывал..... или вернее не лог обмена, а лог срабатываний прерывани. а как получить лог обмена? Там же контроллер усб аппаратный. Вот попал в прерывание про ресету усб - это мне хост послал запрос на ресет. а что конкретно он послал? какой фрейм? чем на этот фрейм ответит процессор? как до этого обмена добраться из кода?
jcxz
Даже аппаратный USB-контроллер сам никакие фреймы не отправляет. Всё это делаете Вы (ну или библиотека, которую Вы где-то нарыли).
Лог должен включать: какие события происходят на шине (прерывания, причина, флаги состояний и т.п.) и как Ваш код на эти события реагирует (что-то отправляет или устанавливает флаги управления и т.п.).
И дальше с этим логом и мауалом на USB Вашего МК и описанием USB-шины (я пользовался Гуком) сидеть и разбираться, что не так.
ig_z
QUOTE (esaulenka @ Apr 4 2016, 22:14) *
Виндовс при подключении устройства делает reset, потом считывает дескрипторы, потом снова reset, снова считывает дескрипторы, и только потом считает, что процедура подключения завершена.
Почему так, видел какое-то внятное описание, но забыл где...

Возможно это USB in a NutShell
http://www.beyondlogic.org/usbnutshell/usb1.shtml\

Еще по сети гуляет док файл под авторством Мисячного, там этот вопрос освещен явно
juvf
Цитата(jcxz @ Apr 5 2016, 15:55) *
Лог должен включать: какие события происходят на шине (прерывания, причина, флаги состояний и т.п.) и как Ваш код на эти события реагирует (что-то отправляет или устанавливает флаги управления и т.п.).
Это сделано. На прерывание OTG_FS_GINTSTS.ENUMDNE одинаковая реакция в рабочем и не рабочем коде. одно и тоже пишется в регистр GUSBCFG и выход из прерывания. после, почему то, в нерабочем коде хост присылает ресет. Почему - не могу понять.

Цитата
я пользовался Гуком

Гук тольком ни чего не говорит....
Цитата
Автоматическое конфигурирование
Все устройства подключаются через порты хабов. Хабы определяют подключение
и отключение устройств к своим портам (см. главу 14) и сообщают состояние пор$
тов по запросу от контроллера. Хост своим управляющим запросом Port_Reset к
хабу выполняет сброс и разрешает работу порта (одного!), на котором обнаружено
новое подключение. При начальном подключении или после сброса устройство
находится в «дежурном» состоянии (Default State) — отзывается только на обра$
щения по основному каналу сообщений (EP0) и имеет нулевой адрес (USB Default
Address). Таким образом, обращаясь к устройству по нулевому адресу, хост взаи$
модействует только с одним новоподключенным устройством.
Port_Reset прошел.... потом прерывание енумдан. почему? хост прислал скорость? ..... далее в нерабочей проге опять ресет. а рабочей прерывание по OTG_FS_GINTSTS.RXFLVL. Почему? Как должно быть?

Где-то битик наверно в МК в ядре USB не тот стоит..... не могу понять где и какой? Почему хост постоянно ресетит девайс? Есть сниферы для USB?
jcxz
Цитата(juvf @ Apr 5 2016, 18:15) *
Где-то битик наверно в МК в ядре USB не тот стоит..... не могу понять где и какой? Почему хост постоянно ресетит девайс? Есть сниферы для USB?

Есть, но аппаратные - дорогие, а программные - ничего не дадут в данном случае.
Мы свою проблему решили без снифера, как я описывал. Тоже было - вход в энумерацию и сразу ресет от хоста.
Оказалось, что генератор для PLL USB неправильный стоял - похоже что хост просто ничего не получал от нашего устройства кроме дёрганья подтяжкой +Vusb. Дёргал ресет, видел коннект устройства (подтяжка +Vusb), слал стартовый пакет энумерации, а потом ничего не дожидался в ответ и делал опять сброс. И так по кругу. Подробностей за давностью лет уже не помню, но примерно так.
Так что у Вас тоже может быть, что хост не получает просто ничего от устройства на свои запросы.
Но у нас было сложнее - новое железо и ошибка в нём аппаратная. У вас проще, так как есть работающее ПО и Ваше нерабочее - просто надо сравнить все записи в регистры. Можете например после получения первого кадра от хоста после сброса, сравнить содержимое регистров конфигурации USB (а также его тактирования и пр.) в Вашем и в рабочем ПО. Можно сравнивать по шагам обмена.
juvf
где можно взять рабочий пример usb device cdc для stm32f4xx?
juvf
Разобрался я с усб....
Цитата
Оказалось, что генератор для PLL USB неправильный стоял - похоже что хост просто ничего
таже проблема была.... не правильно был настроен PLL для усб, не было 48 МГц.

Пример взял из STM32_USB-Host-Device_Lib_V2.2.0 - VCP и допилил его до нужного мне. Всем спасибо за помощь

ps хорошая статья по усб. Мне кажется лучше Гука.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.