Easyelectronics.ru

Электроника для всех
Текущее время: 29 окт 2020, 21:49

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: РЕШЕНО: Проблемы с таймингом по завершению Control Request
СообщениеДобавлено: 09 май 2012, 17:23 
Старожил

Зарегистрирован: 14 мар 2012, 13:58
Сообщения: 1727
Ваяю USB хост под некий прибор, переделывая библиотеку STM про MSC Host. С протоколом управления прибором разобрался с помощью разных усбшных сниферов. Тут вопросов нет. Кроме того, могу управлять прибором через "Cypress USB Console" (Там стоит CY7C68013A), а также на платформах на основе PIC32 (full-speed) и LPC4350 (hi-speed).
Сейчас пробую на STM32F407, который на плате discovery. Для высокоскоростного USB примотал к ней внешнюю PHY (USB3320, можно почитать в разделе "Я делаю"). На данный момент, подключаемый к плате прибор правильно энумерируется.

Отвечает бодро на запросы, касающиеся всяких внутренних функций, как, например, вычитка из EEPROM, приём данных по BULK и проч.

Теперь собственно о проблеме. Посылаю control request такого типа:
Код:
  phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_VENDOR | USB_REQ_RECIPIENT_DEVICE; // 0x40
 
  phost->Control.setup.b.bRequest = 0xAA;
  phost->Control.setup.b.wValue.w = 0xFFFF;
  phost->Control.setup.b.wIndex.w = 0xFFFF;
  phost->Control.setup.b.wLength.w = 0;           
 
  return USBH_CtlReq(pdev, phost, 0 , 0 );
После этого могу вычитывать по BULK, что получается. Кстати, могу послать эту команду несколько раз. Проходит без проблем и последствий.

Но мне также необходим такой запрос (см. ниже), ничем по структуре не отличающийся от предыдущего. Он проходит с USBH_OK, но при попытке послать после него ещё какой-либо control request, всё вешается.
Код:
  phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_VENDOR | USB_REQ_RECIPIENT_DEVICE; // 0x40
 
  phost->Control.setup.b.bRequest = 0xA3;
  phost->Control.setup.b.wValue.w = 0x0000;
  phost->Control.setup.b.wIndex.w = 0x0000;
  phost->Control.setup.b.wLength.w = 0;           
 
  return USBH_CtlReq(pdev, phost, 0 , 0 );
Не пойму, кто мне тут гадит. И опять же: все эти запросы проходят на других платформах (комп и МК) без проблем. Создаётся впечатление, что надо что-то ресетнуть в этой ужасной state machine, придуманной STM для своего хоста, чтобы начало/продолжило работать.

Возврат к LPC350 к сожалению невозможен. Программа большая, в ОЗУ вся не влезет, а вычитка из внешней памяти всё очень тормозит.


Последний раз редактировалось dima2611 10 май 2012, 13:59, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокада в USB host после отправки VENDOR запроса
СообщениеДобавлено: 09 май 2012, 20:19 
Старожил

Зарегистрирован: 14 мар 2012, 13:58
Сообщения: 1727
Вот, выговорился - сразу помогло. Тут какие-то траблы с таймингом. Если ставлю Breakpoint на состояние CTRL_SETUP_WAIT в подпрограмме USBH_HandleControl (usbh_core.c), то зависания прекращаются. Не понятна роль "таймера", что устанавливается в последней строчке (phost->Control.timer = HCD_GetCurrentFrame(pdev);).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РЕШЕНО: Проблемы с таймингом по завершению Control Request
СообщениеДобавлено: 10 май 2012, 14:09 
Старожил

Зарегистрирован: 14 мар 2012, 13:58
Сообщения: 1727
А ларчик просто открывался :) Вот эта штука (phost->Control.timer = HCD_GetCurrentFrame(pdev);) имела (как мне каааца, а я с возрастом стал осторожен в оценках) прямое отношение к проблеме.С её помощью задаётся таймаут на выполнение команды. В моём случае это команда, при которой не передаются данные, т.е. для неё действует NODATA_STAGE_TIMEOUT из usbh_def.h. Но я знаю, что на выполнение её внутри девайса нужно время, и оно дольше, чем 50 мсек.

Поменял 50 на 500 и лёд тронулся (usbh_def.h).
Код:
/* As per USB specs 9.2.6.4 :Standard request with data request timeout: 5sec
   Standard request with no data stage timeout : 50ms */
#define DATA_STAGE_TIMEOUT                              5000
#define NODATA_STAGE_TIMEOUT                            500

Иной раз приходится пройти такими буераками к простейшему выходу из тупиковой ситуации :)

PS Спасибо всем, кто прочитал, и, так сказать, проникнулся моей болью :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Atomic-dm


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB