Перейти к содержанию
    

USB в LPC17**

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

 

Появилось время изучить как следует интерфейс 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 - насколько удобно ей пользоваться? Есть ли более функциональные (но бесплатные) аналоги?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть еще в кейле пример HID устройства. Может там будет что-то полезное. Keil\ARM\Boards\Keil\MCB1700\USBHID

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Проблема возникла с Endpoint прерываниями. Сами прерывания по конфигурационным Endpoint'ам у меня включены, но они не возникают вообще. Варианта вижу два:

1) неправильно сконфигурированы прерывания (должны быть на EP_SLOW)

2) хост не пытается ничего послать (но насколько я понял, такого быть в принципе не может - если хост видит изменение на шине, то должен спросить, что за устройство на ней появилось)

 

На всякий случай выкладываю свой код (инициализация USB, обработчик прерывания, функции для работы с SIE):

USB_lpc1768.7z

Изменено пользователем alvy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем alvy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отвлекался на другой проект, снова вернулся к ковырянию USB - файл скачало 14 человек и видимо серъезных ошибок в нем нет? В какую же сторону копать? :05:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

P.S. включение DMA на EP запрещает любые другие прерывания по EP, потому что прерывания будут обрабатывать DMA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...