реклама на сайте
подробности

 
 
> USB в LPC17**, разбираюсь с нуля
alvy
сообщение Jun 9 2010, 03:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 8-05-09
Из: Томск
Пользователь №: 48 809



Всем доброго времени суток.

Появилось время изучить как следует интерфейс 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 - насколько удобно ей пользоваться? Есть ли более функциональные (но бесплатные) аналоги?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
uriy
сообщение Jun 9 2010, 04:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Есть еще в кейле пример HID устройства. Может там будет что-то полезное. Keil\ARM\Boards\Keil\MCB1700\USBHID
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 9 2010, 05:01
Сообщение #3


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(alvy @ Jun 9 2010, 07:38) *
2) Если прерывания по FRAME имеют такую строгую периодичность и их все таки необходимо использовать, то можно ли туда добавить функцию тика ОС? (понимаю, что решение скорее всего бредовое, но вот грамотно обосновать не могу).


Это когда устройство (ваше) подключено к хосту( компьютеру) тогда и будут прерывания с интервалом 1 мсек. А когда вы свое устройство от хоста отключите и пустите в свободное плавание, что станется с вашей ОС ?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
alvy
сообщение Jun 9 2010, 05:08
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 8-05-09
Из: Томск
Пользователь №: 48 809



Цитата(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." - насколько я понял он взводится автоматически, а не хостом. Поправьте меня, если я неправильно понял этот момент.

Сообщение отредактировал alvy - Jun 9 2010, 05:13
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 9 2010, 07:46
Сообщение #5


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



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


Не знал. Я высказал свое предположение из общих соображений.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
alvy
сообщение Jun 10 2010, 08:31
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 8-05-09
Из: Томск
Пользователь №: 48 809



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

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

На всякий случай выкладываю свой код (инициализация USB, обработчик прерывания, функции для работы с SIE):
Прикрепленный файл  USB_lpc1768.7z ( 2.65 килобайт ) Кол-во скачиваний: 176


Сообщение отредактировал alvy - Jun 10 2010, 08:32
Go to the top of the page
 
+Quote Post
alvy
сообщение Jun 15 2010, 03:25
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 8-05-09
Из: Томск
Пользователь №: 48 809



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

Сообщение отредактировал alvy - Jun 15 2010, 03:25
Go to the top of the page
 
+Quote Post
alvy
сообщение Jul 8 2010, 04:29
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 8-05-09
Из: Томск
Пользователь №: 48 809



Отвлекался на другой проект, снова вернулся к ковырянию USB - файл скачало 14 человек и видимо серъезных ошибок в нем нет? В какую же сторону копать? 05.gif
Go to the top of the page
 
+Quote Post
andrey86
сообщение Jun 20 2011, 16:40
Сообщение #9





Группа: Новичок
Сообщений: 1
Регистрация: 20-06-11
Пользователь №: 65 787



возможно вопрос не в тему, но: какие адреса EP должны быть?

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

P.S. включение DMA на EP запрещает любые другие прерывания по EP, потому что прерывания будут обрабатывать DMA
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 02:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016