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

 
 
2 страниц V   1 2 >  
Closed TopicStart new topic
> usb stm32f401
juvf
сообщение Apr 2 2016, 15:28
Сообщение #1


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Что то не получается 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-ом. Демопроект работает, а свой не могу поднять.

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Fedor
сообщение Apr 2 2016, 19:59
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 26-10-05
Пользователь №: 10 125



Как работает usb можно почитать на usb.org
как вариант, вывод отладочной информации в уарт в процессе инициализации usb мешает работе usb?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 3 2016, 06:05
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Лучшая книга для изучения USB - Михаил Гук. Шины PCI, USB, FireWire.
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 4 2016, 12:59
Сообщение #4


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(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? Почему так происходит?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
romas2010
сообщение Apr 4 2016, 18:07
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515



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


Поизучайте код,встаньте на отладку на то место,где происходит прием control ep0 в фазе setup,и далее идите пошагово и анализируйте ,что и сколько байт вы передаете хосту,и то ли вы передаете согласно спецификации USB
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 4 2016, 19:14
Сообщение #6


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

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



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

PS должно сильно поспособствовать сравнение рабочего и нерабочего вариантов каким-нибудь сниффером. Я крайний раз пользовался "free usb analyzer". Не очень удобно, зато совесть чиста :-)


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
www...
сообщение Apr 5 2016, 04:32
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 26-10-14
Из: Екатеринбург
Пользователь №: 83 345



Компилятор Keil? Начальный код кубе генерили?
Если да, установите Heap_Size 0x400
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 5 2016, 10:21
Сообщение #8


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(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..... как подсмотреть обмен компьютера с новым подключаемым нераспознанным устройством?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 5 2016, 10:34
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Сделать лог обмена на UART. Только конечно буферизованный лог - чтоб не тормозил сам обмен.
В своё время, при проблемах на фазе энумерации устройства на своём USB-стеке на L-137, мне именно только такой метод и помог.
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 5 2016, 10:44
Сообщение #10


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(jcxz @ Apr 5 2016, 15:34) *
Сделать лог обмена на UART. Только конечно буферизованный лог - чтоб не тормозил сам обмен.
В своё время, при проблемах на фазе энумерации устройства на своём USB-стеке на L-137, мне именно только такой метод и помог.
Так он у меня есть. Я этот лог в самом начале показывал..... или вернее не лог обмена, а лог срабатываний прерывани. а как получить лог обмена? Там же контроллер усб аппаратный. Вот попал в прерывание про ресету усб - это мне хост послал запрос на ресет. а что конкретно он послал? какой фрейм? чем на этот фрейм ответит процессор? как до этого обмена добраться из кода?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 5 2016, 10:55
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Даже аппаратный USB-контроллер сам никакие фреймы не отправляет. Всё это делаете Вы (ну или библиотека, которую Вы где-то нарыли).
Лог должен включать: какие события происходят на шине (прерывания, причина, флаги состояний и т.п.) и как Ваш код на эти события реагирует (что-то отправляет или устанавливает флаги управления и т.п.).
И дальше с этим логом и мауалом на USB Вашего МК и описанием USB-шины (я пользовался Гуком) сидеть и разбираться, что не так.
Go to the top of the page
 
+Quote Post
ig_z
сообщение Apr 5 2016, 11:11
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



QUOTE (esaulenka @ Apr 4 2016, 22:14) *
Виндовс при подключении устройства делает reset, потом считывает дескрипторы, потом снова reset, снова считывает дескрипторы, и только потом считает, что процедура подключения завершена.
Почему так, видел какое-то внятное описание, но забыл где...

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

Еще по сети гуляет док файл под авторством Мисячного, там этот вопрос освещен явно
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 5 2016, 12:15
Сообщение #13


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(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?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 5 2016, 15:01
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Есть, но аппаратные - дорогие, а программные - ничего не дадут в данном случае.
Мы свою проблему решили без снифера, как я описывал. Тоже было - вход в энумерацию и сразу ресет от хоста.
Оказалось, что генератор для PLL USB неправильный стоял - похоже что хост просто ничего не получал от нашего устройства кроме дёрганья подтяжкой +Vusb. Дёргал ресет, видел коннект устройства (подтяжка +Vusb), слал стартовый пакет энумерации, а потом ничего не дожидался в ответ и делал опять сброс. И так по кругу. Подробностей за давностью лет уже не помню, но примерно так.
Так что у Вас тоже может быть, что хост не получает просто ничего от устройства на свои запросы.
Но у нас было сложнее - новое железо и ошибка в нём аппаратная. У вас проще, так как есть работающее ПО и Ваше нерабочее - просто надо сравнить все записи в регистры. Можете например после получения первого кадра от хоста после сброса, сравнить содержимое регистров конфигурации USB (а также его тактирования и пр.) в Вашем и в рабочем ПО. Можно сравнивать по шагам обмена.
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 6 2016, 12:44
Сообщение #15


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



где можно взять рабочий пример usb device cdc для stm32f4xx?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 07:06
Рейтинг@Mail.ru


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