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

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

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

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

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


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

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

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

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


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

1 hour ago, E32 said:

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

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

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


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

8 минут назад, GenaSPB сказал:

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

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

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


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

1 час назад, E32 сказал:

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

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

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


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

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

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


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

VladislavS

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

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


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

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

 

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

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


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

Это из 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

 

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


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

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 отправляется уже с новым адресом. И это как-то работает.

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...