Перейти к содержанию
    

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

post-49045-1459610098_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как работает usb можно почитать на usb.org

как вариант, вывод отладочной информации в уарт в процессе инициализации usb мешает работе usb?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучшая книга для изучения USB - Михаил Гук. Шины PCI, USB, FireWire.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вывод отладочной информации в уарт в процессе инициализации 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? Почему так происходит?

post-49045-1459774706_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто нибудь разбирался на низком уровне с USB? Почему так происходит?

 

Поизучайте код,встаньте на отладку на то место,где происходит прием control ep0 в фазе setup,и далее идите пошагово и анализируйте ,что и сколько байт вы передаете хосту,и то ли вы передаете согласно спецификации USB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Reset - это команда со стороны хоста.

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

Почему так, видел какое-то внятное описание, но забыл где...

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор Keil? Начальный код кубе генерили?

Если да, установите Heap_Size 0x400

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор 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..... как подсмотреть обмен компьютера с новым подключаемым нераспознанным устройством?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как оно работает? Можно наверно под\смотреть обмен с распознанным устройством. А если устройство не распознано и его нет в дерево в окошке Devices..... как подсмотреть обмен компьютера с новым подключаемым нераспознанным устройством?

Сделать лог обмена на UART. Только конечно буферизованный лог - чтоб не тормозил сам обмен.

В своё время, при проблемах на фазе энумерации устройства на своём USB-стеке на L-137, мне именно только такой метод и помог.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделать лог обмена на UART. Только конечно буферизованный лог - чтоб не тормозил сам обмен.

В своё время, при проблемах на фазе энумерации устройства на своём USB-стеке на L-137, мне именно только такой метод и помог.

Так он у меня есть. Я этот лог в самом начале показывал..... или вернее не лог обмена, а лог срабатываний прерывани. а как получить лог обмена? Там же контроллер усб аппаратный. Вот попал в прерывание про ресету усб - это мне хост послал запрос на ресет. а что конкретно он послал? какой фрейм? чем на этот фрейм ответит процессор? как до этого обмена добраться из кода?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Даже аппаратный USB-контроллер сам никакие фреймы не отправляет. Всё это делаете Вы (ну или библиотека, которую Вы где-то нарыли).

Лог должен включать: какие события происходят на шине (прерывания, причина, флаги состояний и т.п.) и как Ваш код на эти события реагирует (что-то отправляет или устанавливает флаги управления и т.п.).

И дальше с этим логом и мауалом на USB Вашего МК и описанием USB-шины (я пользовался Гуком) сидеть и разбираться, что не так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Почему так, видел какое-то внятное описание, но забыл где...

Возможно это USB in a NutShell

http://www.beyondlogic.org/usbnutshell/usb1.shtml\

 

Еще по сети гуляет док файл под авторством Мисячного, там этот вопрос освещен явно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лог должен включать: какие события происходят на шине (прерывания, причина, флаги состояний и т.п.) и как Ваш код на эти события реагирует (что-то отправляет или устанавливает флаги управления и т.п.).
Это сделано. На прерывание OTG_FS_GINTSTS.ENUMDNE одинаковая реакция в рабочем и не рабочем коде. одно и тоже пишется в регистр GUSBCFG и выход из прерывания. после, почему то, в нерабочем коде хост присылает ресет. Почему - не могу понять.

 

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

Гук тольком ни чего не говорит....

Автоматическое конфигурирование

Все устройства подключаются через порты хабов. Хабы определяют подключение

и отключение устройств к своим портам (см. главу 14) и сообщают состояние пор$

тов по запросу от контроллера. Хост своим управляющим запросом Port_Reset к

хабу выполняет сброс и разрешает работу порта (одного!), на котором обнаружено

новое подключение. При начальном подключении или после сброса устройство

находится в «дежурном» состоянии (Default State) — отзывается только на обра$

щения по основному каналу сообщений (EP0) и имеет нулевой адрес (USB Default

Address). Таким образом, обращаясь к устройству по нулевому адресу, хост взаи$

модействует только с одним новоподключенным устройством.

Port_Reset прошел.... потом прерывание енумдан. почему? хост прислал скорость? ..... далее в нерабочей проге опять ресет. а рабочей прерывание по OTG_FS_GINTSTS.RXFLVL. Почему? Как должно быть?

 

Где-то битик наверно в МК в ядре USB не тот стоит..... не могу понять где и какой? Почему хост постоянно ресетит девайс? Есть сниферы для USB?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где-то битик наверно в МК в ядре USB не тот стоит..... не могу понять где и какой? Почему хост постоянно ресетит девайс? Есть сниферы для USB?

Есть, но аппаратные - дорогие, а программные - ничего не дадут в данном случае.

Мы свою проблему решили без снифера, как я описывал. Тоже было - вход в энумерацию и сразу ресет от хоста.

Оказалось, что генератор для PLL USB неправильный стоял - похоже что хост просто ничего не получал от нашего устройства кроме дёрганья подтяжкой +Vusb. Дёргал ресет, видел коннект устройства (подтяжка +Vusb), слал стартовый пакет энумерации, а потом ничего не дожидался в ответ и делал опять сброс. И так по кругу. Подробностей за давностью лет уже не помню, но примерно так.

Так что у Вас тоже может быть, что хост не получает просто ничего от устройства на свои запросы.

Но у нас было сложнее - новое железо и ошибка в нём аппаратная. У вас проще, так как есть работающее ПО и Ваше нерабочее - просто надо сравнить все записи в регистры. Можете например после получения первого кадра от хоста после сброса, сравнить содержимое регистров конфигурации USB (а также его тактирования и пр.) в Вашем и в рабочем ПО. Можно сравнивать по шагам обмена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...