Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 114

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 108 109 110 111 112 113 < 114 > 115 116 117 118 119 120 .. 166 >> Следующая

}
Глава 13. НЮ-устройство на основе Atmel АТ89С5131
351
/* если устройство подключено к шине */ } else '{
/* если получен сигнал "засыпания" */
if (Usb_suspend())
{
usb__connected = FALSE; Usb_clear_suspend(); Usb_set_suspend_clock();
}
/* если получен сигнал сброса */
if (Usb_reset () )
{
Usb_clear_reset() ;
}
/* сигнал SOF */ if (Usb_sof()) {
Usb_clear_sof();
}
/* обнаружено прерывание от конечной точки */
if (Usb_endpoint_interrupt())
{
/* переключиться на О конечную точку */ Usb_select_ep(EP_CONTROL);
/* если получен пакет SETUP (см. разд. 4.1.1) */
if (Usb_setup_received())
{
/* начать процесс нумерации */ usb_enumeration_process();
}
}
// переключиться на первую конечную точку // переключиться на вторую конечную точку
//.......................................
}
) /* end for ; ; */
)
352
Часть IV. Создание USB-устройств
В начале работы программы вызывается функция usbinit (ее код показан в листинге 13.15). Эта функция достаточно проста и заключается в выполнении такой последовательности действий:
1. Инициализация внутреннего генератора (его функции описаны в документации на микросхему).
2. Включение USB-интерфейса.
3. Инициирование процесса нумерации (для этого устройство отключается от шины и не ранее чем через 5 мс подключается).
4. Конфигурирование нулевой конечной точки (разумеется, нулевая точка конфигурируется как управляющая).
5. Сброс нулевой конечной точки (Reset).
6. Разрешение прерываний от нулевой конечной точки (при этом прерывание как таковое не вызывается, т. к. бит IE сброшен, но соответствующие биты в регистре UEPiNT выставляются).
7. Инициализация других переменных.
После выполнения этих операций устройство готово к конфигурированию через канал нулевой конечной точки.
// Описание делителей PLL в зависі
!define PLL_ 3MHz OxFO
!define PLL_ JMHz OxCO
!define PLL_ _6MHz 0x70
!define PLL_ _8MHz 0x50
!define PLL_ 12MHz 0x30
!define PLL_ _16MHz 0x20
!define PLL_ _18MHz 0x72
!define PLL_ 20MHz 0xB4
!define PLL_ _24MHz 0x10
!define PLL_ _32MHz 0x21
!define PLL 40MHz 0xB9
Il Функция инициализации USB
void usb_init()
{
/* конфигурирование синхронизатора */
Pll_set_div(PLL_24MHz); /* используется кварц 24 МГц */ Pll_enable(); /* включение генератора */
гпава 13. НЮ-устройство на основе Atmel АТ89С5131
353
/* Включение USB */ Usb_enable();
/* Отключиться-подключиться для начала нумерации */ Usb_detach(); delay5(); Usb_attach(); delay5();
/* Конфигурирование нулевой конечной точки */
usb_configure_endpoint(0, CONTROL IMSK_EPEN); /* Сброс нулевой конечной точки */
usb_reset_endpoint(0) ; /* Разрешение прерываний от нулевой конечной точки */"
osb_enable_ep_int(0);
/* Инициализация переменных */ usb_configuration_nb = 0x00; /* номер активной конфигурации */
}
После инициализации программа циклически выполняет обработку сигналов побудки, прерываний, сброса и т. д. При этом контролируется возникновение прерываний от конечных точек с помощью проверки регистра UEPINT. Конечно, основной цикл можно заменить на пустышку for (;;){ }, а всю работу перенести в обработчики прерываний, но, как нам кажется, линейная структура программы более читабельна и понятна.
Принцип обработки USB-сигналов легко понять из листинга, а мы займемся Процедурой нумерации usbenumeration process (ЛИСТИНГ 13.16).
. Листинг 13.16. Процедура нумерации
void usb_enumeration_process() {
/* Выбрать нулевую конечную точку */ Usb_select_ep(0); /* Обработка запроса */ usb_read_request();
354
Часть IV. Создание USB-устроиств
Со стороны микроконтроллера процедура нумерации заключается в обработке стандартных запросов. Для формирования корректного ответа с FIFO-буфера нулевой конечной точки последовательно считываются все поля и данные запроса, согласно структуре, описанной в разд. 4.1.1, и в соответствии с типом запроса выполняются действия (листинг 13.17).
IMr13-1Tv.^H"e.r.!?^?..SS.Pc"
/* коды запросов */
!define GET_STATUS_DEVICE 0x8000
!define GET_STATUS_INTERF 0x8100
!define GET_STATUS_ENDPNT 0x8200
!define CLEAR_FEATURE_DEVTCE 0x0001
!define CLEAR_FEATURE_INTERF 0x0101
!define CLEAR_FEATURE_EN DPNT 0x0201
!define SET_FEATURE_DEVICE 0x0003
!define SET_FEATURE_INTERF 0x0103
!define SET_FEATURE_ENDPNT 0x0203
!define SET_ADDRESS 0x0005
!define GET_DESCRIPTOR_DEVICE 0x8006
!define GET_DESCRIPTOR_INTERF 0x8106
!define GET_DES CRIPTOR_ENDPNT 0x8206
!define SET_DESCRIPTOR 0x0007
!define GET_CONFIGURATION 0x8008
!define SET-CON FIGURATION 0x0009
!define GET_INTERFACE 0x810A
!define SET_INTERFACE OxOlOB
!define SYNCH_FRAME 0x820C
!define GET REPORT OxAlOl
Il Чтение и анализ запроса void usb_read_request() {
data uintlo wReguest;
/* чтение bmRequestType */
((byte*)&wRequest)[0] = Usb_read_byte();
/* чтение bRequest */
((byte*)&wRequest)[1] = Usb_read_byte();
Глава 13. HID-устройство на основе Atmel АТ89С5131
355
switch (wRequest) {
case GET_STATUS_DEVICE: usb_get_status_device(); break;
case GET_STATUS_INTERF: usb_get_status_interface() ; break;
Предыдущая << 1 .. 108 109 110 111 112 113 < 114 > 115 116 117 118 119 120 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100