|
usb stm32f401 |
|
|
|
Apr 2 2016, 15:28
|

Профессионал
    
Группа: Свой
Сообщений: 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-ом. Демопроект работает, а свой не могу поднять.
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 2 2016, 19:59
|
Участник

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

|
Как работает usb можно почитать на usb.org как вариант, вывод отладочной информации в уарт в процессе инициализации usb мешает работе usb?
|
|
|
|
|
Apr 4 2016, 12:59
|

Профессионал
    
Группа: Свой
Сообщений: 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? Почему так происходит?
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 4 2016, 18:07
|
Участник

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

|
Цитата(juvf @ Apr 4 2016, 15:59)  Кто нибудь разбирался на низком уровне с USB? Почему так происходит? Поизучайте код,встаньте на отладку на то место,где происходит прием control ep0 в фазе setup,и далее идите пошагово и анализируйте ,что и сколько байт вы передаете хосту,и то ли вы передаете согласно спецификации USB
|
|
|
|
|
Apr 4 2016, 19:14
|

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

|
Reset - это команда со стороны хоста. Виндовс при подключении устройства делает reset, потом считывает дескрипторы, потом снова reset, снова считывает дескрипторы, и только потом считает, что процедура подключения завершена. Почему так, видел какое-то внятное описание, но забыл где...
PS должно сильно поспособствовать сравнение рабочего и нерабочего вариантов каким-нибудь сниффером. Я крайний раз пользовался "free usb analyzer". Не очень удобно, зато совесть чиста :-)
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Apr 5 2016, 04:32
|
Участник

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

|
Компилятор Keil? Начальный код кубе генерили? Если да, установите Heap_Size 0x400
|
|
|
|
|
Apr 5 2016, 10:21
|

Профессионал
    
Группа: Свой
Сообщений: 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..... как подсмотреть обмен компьютера с новым подключаемым нераспознанным устройством?
|
|
|
|
|
Apr 5 2016, 11:11
|
Местный
  
Группа: Свой
Сообщений: 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\Еще по сети гуляет док файл под авторством Мисячного, там этот вопрос освещен явно
|
|
|
|
|
Apr 5 2016, 12:15
|

Профессионал
    
Группа: Свой
Сообщений: 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?
|
|
|
|
|
Apr 5 2016, 15:01
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(juvf @ Apr 5 2016, 18:15)  Где-то битик наверно в МК в ядре USB не тот стоит..... не могу понять где и какой? Почему хост постоянно ресетит девайс? Есть сниферы для USB? Есть, но аппаратные - дорогие, а программные - ничего не дадут в данном случае. Мы свою проблему решили без снифера, как я описывал. Тоже было - вход в энумерацию и сразу ресет от хоста. Оказалось, что генератор для PLL USB неправильный стоял - похоже что хост просто ничего не получал от нашего устройства кроме дёрганья подтяжкой +Vusb. Дёргал ресет, видел коннект устройства (подтяжка +Vusb), слал стартовый пакет энумерации, а потом ничего не дожидался в ответ и делал опять сброс. И так по кругу. Подробностей за давностью лет уже не помню, но примерно так. Так что у Вас тоже может быть, что хост не получает просто ничего от устройства на свои запросы. Но у нас было сложнее - новое железо и ошибка в нём аппаратная. У вас проще, так как есть работающее ПО и Ваше нерабочее - просто надо сравнить все записи в регистры. Можете например после получения первого кадра от хоста после сброса, сравнить содержимое регистров конфигурации USB (а также его тактирования и пр.) в Вашем и в рабочем ПО. Можно сравнивать по шагам обмена.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|