Jump to content

    

STM32F7 USB OTG Device не проходит энумерация

Пробую запустить USB Device на stm32f767. Используется USB OTG HS модуль в режиме Full Speed.

Затык в следующем

Получаю от хоста под Win7  first usb reset -> Setup (Get Desc Device) -> отправляю дескриптор -> получаю подтверждение -> second usb reset -> Setup (Set Address) -> пишу адрес в рег DCFG, отправляю ZLP.

После этого пауза на несколько секунд, затем usb reset -> Setup (Get Desc Device) -> пауза несколько сек -> usb reset -> Setup (Get Desc Device) -> пауза несколько сек -> usb reset

Больше никаких запросов хост не передает.

Не понимаю, почему хост сбрасывает после установки адреса?

Share this post


Link to post
Share on other sites

Помнится мне все затыки были в правильной обработке прерываний. Читать FIFO и обрабатывать пакет надо в разных прерываниях. С F7 не работал, но что-то мне подсказывает что USB OTG у него не должен отличаться от F4.

Глянь проект, если интересно. USB-CDC F411

Share this post


Link to post
Share on other sites
1 hour ago, E32 said:

После этого пауза на несколько секунд, затем usb reset -> Setup (Get Desc Device)

После этого опять надо отдавать дескриптор.

Share this post


Link to post
Share on other sites
8 минут назад, GenaSPB сказал:

После этого опять надо отдавать дескриптор.

Дескриптор надо отдавать только когда тебя об этом попросят. Причём, отдавать столько сколько попросили, но не больше дескриптора, само собой.

Share this post


Link to post
Share on other sites
1 час назад, E32 сказал:

Setup (Set Address) -> пишу адрес в рег DCFG, отправляю ZLP.

А надо наоборот - сначала послать ZLP и только после его успешной отправки установить новый адрес в DCFG. Host спрашивает этот ZLP по нулевому адресу, а вы его уже сменили и этот запрос ZLP пропускаете, ваш ZLP просто не уходит.

Share this post


Link to post
Share on other sites

Сергей всё верно говорит. Но мне кажется, что контроллер часть работы делает сам. Я в прерывании USB_OTG_GINTSTS_RXFLVL читаю FIFO, а в USB_OTG_GINTSTS_OEPINT устанавливаю DCFG и фактически с нового адреса ZLP-юсь. Мне кажется после чтения FIFO и возникновением USB_OTG_GINTSTS_OEPINT контроллер успевает подтвердить хосту, что пакет принят и ZLP-ться тут лишний раз не надо.

Share this post


Link to post
Share on other sites

VladislavS

спасибо большое за пример! Вы совершенно правы! Моя ошибка заключалась в том, что я пытался обработать Setup сразу в прерывании  RxFIFO not empty, а нужно включить прерывание STUP OUTEP0 и обрабатывать уже там.

Share this post


Link to post
Share on other sites

Ну, здОрово. Удачи в борьбе с OTG :)

 

PS: Вот на F103 и F0, действительно, надо было по полной от-ZLP-аться, а только потом SetAdress делать. А тут сильней автоматизировано.

Share this post


Link to post
Share on other sites

Это из RM на stm32f767

Endpoint initialization on SetAddress command
This section describes what the application must do when it receives a SetAddress
command in a SETUP packet.
1. Program the OTG_DCFG register with the device address received in the SetAddress
command
2. Program the core to send out a status IN packet

 

Share this post


Link to post
Share on other sites
33 минуты назад, VladislavS сказал:

Но мне кажется, что контроллер часть работы делает сам. Я в прерывании USB_OTG_GINTSTS_RXFLVL читаю FIFO, а в USB_OTG_GINTSTS_OEPINT устанавливаю DCFG и фактически с нового адреса ZLP-юсь.

Да, каюсь, с F0/L0/L1 попутал. Посмотрел свои исходник для F1/F2/F4 - и FIFO выгребаю и разбор setup-пакета (с установкой DCFG) делаю в USB_OTG_GINTSTS_RXFLVL, но выгребаю по GRXSTSP == SETUP_DATA_RECEIVED, а разбираю по GRXSTSP == SETUP_TRANSACTION_COMPLETED (фактически в этот момент генерится используемое вами OTG_FS_DOEPINT0_STUP, я его не использую и не разрешаю). А ведь правда, получается, что ZLP в status stage отправляется уже с новым адресом. И это как-то работает.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now