E32 0 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба Пробую запустить 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 Больше никаких запросов хост не передает. Не понимаю, почему хост сбрасывает после установки адреса? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба Помнится мне все затыки были в правильной обработке прерываний. Читать FIFO и обрабатывать пакет надо в разных прерываниях. С F7 не работал, но что-то мне подсказывает что USB OTG у него не должен отличаться от F4. Глянь проект, если интересно. USB-CDC F411 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 1 hour ago, E32 said: После этого пауза на несколько секунд, затем usb reset -> Setup (Get Desc Device) После этого опять надо отдавать дескриптор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 8 минут назад, GenaSPB сказал: После этого опять надо отдавать дескриптор. Дескриптор надо отдавать только когда тебя об этом попросят. Причём, отдавать столько сколько попросили, но не больше дескриптора, само собой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 1 час назад, E32 сказал: Setup (Set Address) -> пишу адрес в рег DCFG, отправляю ZLP. А надо наоборот - сначала послать ZLP и только после его успешной отправки установить новый адрес в DCFG. Host спрашивает этот ZLP по нулевому адресу, а вы его уже сменили и этот запрос ZLP пропускаете, ваш ZLP просто не уходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба Сергей всё верно говорит. Но мне кажется, что контроллер часть работы делает сам. Я в прерывании USB_OTG_GINTSTS_RXFLVL читаю FIFO, а в USB_OTG_GINTSTS_OEPINT устанавливаю DCFG и фактически с нового адреса ZLP-юсь. Мне кажется после чтения FIFO и возникновением USB_OTG_GINTSTS_OEPINT контроллер успевает подтвердить хосту, что пакет принят и ZLP-ться тут лишний раз не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
E32 0 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба VladislavS, спасибо большое за пример! Вы совершенно правы! Моя ошибка заключалась в том, что я пытался обработать Setup сразу в прерывании RxFIFO not empty, а нужно включить прерывание STUP OUTEP0 и обрабатывать уже там. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба Ну, здОрово. Удачи в борьбе с OTG :) PS: Вот на F103 и F0, действительно, надо было по полной от-ZLP-аться, а только потом SetAdress делать. А тут сильней автоматизировано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
E32 0 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба Это из RM на stm32f767 Endpoint initialization on SetAddress commandThis 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 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 отправляется уже с новым адресом. И это как-то работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться