alvy 0 9 июня, 2010 Опубликовано 9 июня, 2010 · Жалоба Всем доброго времени суток. Появилось время изучить как следует интерфейс 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 5 9 июня, 2010 Опубликовано 9 июня, 2010 · Жалоба Есть еще в кейле пример HID устройства. Может там будет что-то полезное. Keil\ARM\Boards\Keil\MCB1700\USBHID Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 9 июня, 2010 Опубликовано 9 июня, 2010 · Жалоба 2) Если прерывания по FRAME имеют такую строгую периодичность и их все таки необходимо использовать, то можно ли туда добавить функцию тика ОС? (понимаю, что решение скорее всего бредовое, но вот грамотно обосновать не могу). Это когда устройство (ваше) подключено к хосту( компьютеру) тогда и будут прерывания с интервалом 1 мсек. А когда вы свое устройство от хоста отключите и пустите в свободное плавание, что станется с вашей ОС ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alvy 0 9 июня, 2010 Опубликовано 9 июня, 2010 (изменено) · Жалоба Есть еще в кейле пример 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 Что именно необходимо делать в этом прерывании остается загадкой... Это когда устройство (ваше) подключено к хосту( компьютеру) тогда и будут прерывания с интервалом 1 мсек. А когда вы свое устройство от хоста отключите и пустите в свободное плавание, что станется с вашей ОС ? у меня в данный момент USB кабель отключен от макетной платы, а прерывания по FRAME возникают (правда пока нечем измерить периодичность, но за секунду несколько сотен набирается). Да и в даташите: "For isochronous endpoints, the FRAME bit in USBDevIntSt is set every 1 ms." - насколько я понял он взводится автоматически, а не хостом. Поправьте меня, если я неправильно понял этот момент. Изменено 9 июня, 2010 пользователем alvy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 9 июня, 2010 Опубликовано 9 июня, 2010 · Жалоба у меня в данный момент USB кабель отключен от макетной платы, а прерывания по FRAME возникают (правда пока нечем измерить периодичность, но за секунду несколько сотен набирается). Да и в даташите: "For isochronous endpoints, the FRAME bit in USBDevIntSt is set every 1 ms." - насколько я понял он взводится автоматически, а не хостом. Поправьте меня, если я неправильно понял этот момент. Не знал. Я высказал свое предположение из общих соображений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alvy 0 10 июня, 2010 Опубликовано 10 июня, 2010 (изменено) · Жалоба Пока убрал прерывания по FRAME (может по ходу дела появится необходимость в них). Дальше прерывания по DEVSTATE - тут все отлично: воткнули usb-кабель - состояние изменилось (по Get Device Status получаю бит CON = 1), разъединяю кабель - получаю состояние SUSPEND. Проблема возникла с Endpoint прерываниями. Сами прерывания по конфигурационным Endpoint'ам у меня включены, но они не возникают вообще. Варианта вижу два: 1) неправильно сконфигурированы прерывания (должны быть на EP_SLOW) 2) хост не пытается ничего послать (но насколько я понял, такого быть в принципе не может - если хост видит изменение на шине, то должен спросить, что за устройство на ней появилось) На всякий случай выкладываю свой код (инициализация USB, обработчик прерывания, функции для работы с SIE): USB_lpc1768.7z Изменено 10 июня, 2010 пользователем alvy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alvy 0 15 июня, 2010 Опубликовано 15 июня, 2010 (изменено) · Жалоба Вывел в прерывании состояние регистра SIE Select Endpoint для EP0/EP1 - оба возвращают значение 0x02, что означает согласно документации "The selected endpoint is stalled" (UserManual, стр 248). Причем такое значение возвращается и при подключенном и при отключенном USB кабеле. У меня уже варианты в каком направлении копать закончились. Причем подозреваю, что решение лежит на поверхности... Изменено 15 июня, 2010 пользователем alvy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alvy 0 8 июля, 2010 Опубликовано 8 июля, 2010 · Жалоба Отвлекался на другой проект, снова вернулся к ковырянию USB - файл скачало 14 человек и видимо серъезных ошибок в нем нет? В какую же сторону копать? :05: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreysamoilov1986 0 20 июня, 2011 Опубликовано 20 июня, 2011 · Жалоба возможно вопрос не в тему, но: какие адреса EP должны быть? формально в примерах написаны 0х81 и 0х91, 0х81 - первая точка (interrupt) на выдачу данных, 0х91 - первая EP (interrupt) на прием данных. Меняю статус регистра на включение прерываний по другим EP, но при попытке обратится прерывания не возникает. Уже и отладчиком смотрел..... в общем не появляются флаги прерываний EP USB. В общем я так понимаю что адреса должны быть стандартными, но в стандарте USB этот момент не нашел. Если нестандартные, то напишите где их указывать.... или где посмотреть адресацию EP... P.S. включение DMA на EP запрещает любые другие прерывания по EP, потому что прерывания будут обрабатывать DMA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться