Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Аппаратное обеспечение -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 115

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

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

конечную точку II...........................................
}
) /* end for ; ; */
)
352
Часть IV. Создание USB-устройств
В начале работы программы вызывается функция usb init (ее код показан
в листинге 13.15). Эта функция достаточно проста и заключается в
выполнении такой последовательности действий:
1. Инициализация внутреннего генератора (его функции описаны в
документации на микросхему).
2. Включение USB-интерфейса.
3. Инициирование процесса нумерации (для этого устройство отключается от
шины и не ранее чем через 5 мс подключается).
4. Конфигурирование нулевой конечной точки (разумеется, нулевая точка
конфигурируется как управляющая).
5. Сброс нулевой конечной точки (Reset).
6. Разрешение прерываний от нулевой конечной точки (при этом прерывание
как таковое не вызывается, т. к. бит ie сброшен, но соответствующие биты
в регистре uepint выставляются).
7. Инициализация других переменных.
После выполнения этих операций устройство готово к конфигурированию
через канал нулевой конечной точки.
II Описание делителей PLL в зависимости от используемого кварца
Idefine PLL_ _3MHz OxFO
Idefine PLL_ _4MHz OxCO
Idefine PLL_ _6MHz 0x70
Idefine PLL_ _8MHz 0x50
Idefine PLL_ _12MHz 0x30
Idefine PLL_ _16MHz 0x20
Idefine PLL_ _18MHz 0x72
Idefine PLL_ _20MHz 0xB4
Idefine PLL__ _24MHz 0x10
Idefine PLL_ _32MHz 0x21
Idefine PLL 40MHz 0xB9
// Функция инициализации 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);
/* Разрешение прерываний от нулевой конечной точки */'
Usb_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).
/* колы запросов */
Idefine GET_STATUS_DEVICE 0x8000
Idefine GET_STATUS_INTERF 0x8100
Idefine GET_STATUS_ENDPNT 0x8200
Idefine CLEAR_FEATURE_DEVICE 0x0001
Idefine CLEAR_FEATURE_INTERF 0x0101
Idefine CLEAR_FEATURE_ENDPNT 0x0201
Idefine SET_FEATURE_DEVICE 0x0003
Idefine SET_FEATURE_INTERF 0x0103
Idefine SET_FEATURE_ENDPNT 0x0203
Idefine SET_ADDRESS 0x0005
Idefine GET_DESCRIPTOR_DEVICE 0x8006
Idefine GET_DESCRIPTOR_INTERF 0x8106
Idefine GET_DESCRIPTOR_ENDPNT 0x8206
Idefine SET_DESCRIPTOR 0x0007
Idefine GET_CONFIGURATION 0x8008
Idefine SET_CONFIGURATION 0x0009
Idefine GET_INTERFACE 0x810A
Idefine SET_INTERFACE 0x010В
Idefine SYNCH_FRAME 0x820C
Idefine GET REPORT OxAlOl
II Чтение и анализ запроса void usb_read_request()
{
data uintl6 wRequest;
/* чтение bmRequestType */
((byte*)&wRequest)[0] = Usb_read_byte(); /* чтение bRequest */
((byte*)&wRequest)[1] = Usb_read_byte();
Глава 13. НЮ-устройство на основе Atmel АТ89С5131
355
switch (wRequest)
{
case GET_STATUS_DEVICE: usb_get_status_device(); break;
case GET_STATUS_INTERF; usb_get_status_interface(); break;
case GET_STATUS_ENDPNT: usb_get_status_endpoint() ; break;
case SET_ADDRESS: usb_set_address(); break;
case GET_DESCRIPTOR_DEVICE:
case GET_DESCRIPTOR_INTERF:
case GET_DESCRIPTOR_ENDPNT: usb_get._descriptor () ; break;
case GET_CONFIGORATION: usb_get_configuration(); break;
case SET_CONFIGURATION: usb_set_configuration(); break;
default;
STALL(); break;
}
}
356
Часть IV. Создание USB-устройств
Важно отметить, что если запрос не поддерживается устройством, то для
него обязательно должна быть выполнена процедура отклонения stall (),
как, например, в ветке default. Код этой процедуры приведен в листинге
13.18.
J58L
void STALL(){
Usb_clear_rx_setup();
Usb_set_stall_request(); while (!Usb_stall_sent());
Предыдущая << 1 .. 109 110 111 112 113 114 < 115 > 116 117 118 119 120 121 .. 168 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.