Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB в LPC17**
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
alvy
Всем доброго времени суток.

Появилось время изучить как следует интерфейс USB на подопытной плате SK-MLPC1768. Задача - реализация HID устройства. В данный момент написал код инициализации USB (все по шагам - в строгом соответствии с даташитом). USB блок заработал, прерывания есть.
Дальше - обработчик прерывания. И тут основные вопросы:

1) читаю даташит (для режима Slave): "Enable device interrupts using USBDevIntEn (normally DEV_STAT, EP_SLOW, and possibly EP_FAST).". Замечательно, но для чего тогда в примере RDB1768_usbstack включено еще и прерывание по FRAME (которые шпарят раз в мс)? Как правильно должен выглядеть обработчик прерывания?

2) Если прерывания по FRAME имеют такую строгую периодичность и их все таки необходимо использовать, то можно ли туда добавить функцию тика ОС? (понимаю, что решение скорее всего бредовое, но вот грамотно обосновать не могу).

3) Для мониторинга шины USB скачал SniffUSB - насколько удобно ей пользоваться? Есть ли более функциональные (но бесплатные) аналоги?
uriy
Есть еще в кейле пример HID устройства. Может там будет что-то полезное. Keil\ARM\Boards\Keil\MCB1700\USBHID
dimka76
Цитата(alvy @ Jun 9 2010, 07:38) *
2) Если прерывания по FRAME имеют такую строгую периодичность и их все таки необходимо использовать, то можно ли туда добавить функцию тика ОС? (понимаю, что решение скорее всего бредовое, но вот грамотно обосновать не могу).


Это когда устройство (ваше) подключено к хосту( компьютеру) тогда и будут прерывания с интервалом 1 мсек. А когда вы свое устройство от хоста отключите и пустите в свободное плавание, что станется с вашей ОС ?
alvy
Цитата(uriy @ Jun 9 2010, 11:46) *
Есть еще в кейле пример HID устройства. Может там будет что-то полезное. Keil\ARM\Boards\Keil\MCB1700\USBHID

Смотрел этот пример там все еще более запутано (по крайней мере для меня):
кусок обработчика прерывания:
Код
#if USB_SOF_EVENT
  /* Start of Frame Interrupt */
  if (disr & FRAME_INT) {
    USB_SOF_Event();
  }
#endif

функция USB_SOF_Event():
Код
/*
*  USB Start of Frame Event Callback
*   Called automatically on USB Start of Frame Event
*/

#if USB_SOF_EVENT
void USB_SOF_Event (void) {
}
#endif

Что именно необходимо делать в этом прерывании остается загадкой...

Цитата(dimka76 @ Jun 9 2010, 12:01) *
Это когда устройство (ваше) подключено к хосту( компьютеру) тогда и будут прерывания с интервалом 1 мсек. А когда вы свое устройство от хоста отключите и пустите в свободное плавание, что станется с вашей ОС ?
у меня в данный момент USB кабель отключен от макетной платы, а прерывания по FRAME возникают (правда пока нечем измерить периодичность, но за секунду несколько сотен набирается). Да и в даташите: "For isochronous endpoints, the FRAME bit in USBDevIntSt is set every 1 ms." - насколько я понял он взводится автоматически, а не хостом. Поправьте меня, если я неправильно понял этот момент.
dimka76
Цитата(alvy @ Jun 9 2010, 09:08) *
у меня в данный момент USB кабель отключен от макетной платы, а прерывания по FRAME возникают (правда пока нечем измерить периодичность, но за секунду несколько сотен набирается). Да и в даташите: "For isochronous endpoints, the FRAME bit in USBDevIntSt is set every 1 ms." - насколько я понял он взводится автоматически, а не хостом. Поправьте меня, если я неправильно понял этот момент.


Не знал. Я высказал свое предположение из общих соображений.
alvy
Пока убрал прерывания по FRAME (может по ходу дела появится необходимость в них). Дальше прерывания по DEVSTATE - тут все отлично: воткнули usb-кабель - состояние изменилось (по Get Device Status получаю бит CON = 1), разъединяю кабель - получаю состояние SUSPEND.

Проблема возникла с Endpoint прерываниями. Сами прерывания по конфигурационным Endpoint'ам у меня включены, но они не возникают вообще. Варианта вижу два:
1) неправильно сконфигурированы прерывания (должны быть на EP_SLOW)
2) хост не пытается ничего послать (но насколько я понял, такого быть в принципе не может - если хост видит изменение на шине, то должен спросить, что за устройство на ней появилось)

На всякий случай выкладываю свой код (инициализация USB, обработчик прерывания, функции для работы с SIE):
Нажмите для просмотра прикрепленного файла
alvy
Вывел в прерывании состояние регистра SIE Select Endpoint для EP0/EP1 - оба возвращают значение 0x02, что означает согласно документации "The selected endpoint is stalled" (UserManual, стр 248). Причем такое значение возвращается и при подключенном и при отключенном USB кабеле. У меня уже варианты в каком направлении копать закончились. Причем подозреваю, что решение лежит на поверхности...
alvy
Отвлекался на другой проект, снова вернулся к ковырянию USB - файл скачало 14 человек и видимо серъезных ошибок в нем нет? В какую же сторону копать? 05.gif
andrey86
возможно вопрос не в тему, но: какие адреса EP должны быть?

формально в примерах написаны 0х81 и 0х91, 0х81 - первая точка (interrupt) на выдачу данных, 0х91 - первая EP (interrupt) на прием данных. Меняю статус регистра на включение прерываний по другим EP, но при попытке обратится прерывания не возникает. Уже и отладчиком смотрел..... в общем не появляются флаги прерываний EP USB. В общем я так понимаю что адреса должны быть стандартными, но в стандарте USB этот момент не нашел. Если нестандартные, то напишите где их указывать.... или где посмотреть адресацию EP...

P.S. включение DMA на EP запрещает любые другие прерывания по EP, потому что прерывания будут обрабатывать DMA
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.