Как подключить usb к микроконтроллеру

Интерфейс USB в схемах на микроконтроллере

USB (Universal Serial Bus) — это универсальный последовательный интерфейс, позволяющий подключать к компьютеру разнообразные периферийные устройства и одновременно обеспечивать их питанием +5 В. Интерфейс USB в быту часто называют «шиной», но это тавтология, поскольку слово «Bus» переводится с технического английского языка как «шина».

Днем рождения USB считают 15 января 1996 г., когда вышла в свет первая спецификация параметров USB-1.0. Инициировали создание интерефейса фирмы Compaq Computer, DEC, IBM, Intel, Microsoft, NEC, Nortel. Известно несколько спецификаций USB, но для MK общего назначения из них годятся только USB-1.1 и USB-2.0 (Табл. 4.4).

Таблица 4.4. Хронология спецификаций интерфейса USB

Исправлены неточности начальной версии

Увеличена скорость, добавлены разъёмы miniUSB

Беспроводной USB на расстоянии 3…10 м

Увеличена скорость и ток питания, изменён разъём

Почему же интерфейс USB вытесняет из компьютеров привычные СОМ- и LPT-порты, переводя их в разряд «legacy» (устаревшие)? Причин несколько:

• повышенная в 10… 1000 раз скорость передачи данных;

• улучшенная помехозащищённость (дифференциальные сигналы);

• простота организации питания и возможность «горячего» подключения;

• высокая достоверность, ввиду аппаратного исправления ошибок;

• возможность разветвления сигналов от одного разъёма через хабы.

Недостатки USB: относительно малый радиус действия 1.8…5 м (без хабов), необходимость установки специфических драйверов в операционной системе, сложность программирования, особенно, для неподготовленных пользователей.

Разъёмы USB-1.1 и USB-2.0 бывают двух типов «А» и «В» (Рис. 4.14, a…r), Тип «А» обозначает принадлежность к ведущему устройству (компьютер, хаб), тип «В» — к ведомому устройству (MK, принтер, «мышь», модем). В самодельных конструкциях, как правило, используются разъёмы «Standard-А», «Standard-В».

Рис. 4.14. Внешний вид USB-разъёмов: а) «Standard» в компьютере; б) «Standard» в удалённом устройстве; в) miniUSB; г) microUSB.

Назначение контактов разъёмов USB-1.1, USB-2.0 показано в Табл. 4.5. Здесь учтено существование миниатюрных пятиконтактных (5-pin) разъёмов miniUSB и microUSB, применяемых, в частности, в мобильныхтелефонах.

Таблица 4.5. Раскладка сигналов интерфейса USB

Электрические параметры и функциональное назначение всех цепей одинаково вне зависимости от типа разъёма. Стандартная длина USB-кабелей: «А-А»—1.5; 3.0; 5.0 м, «А-В» — 0.5; 1.0; 1.8; 3.0; 5.0 м. Разъёмы выдерживают ток 1…1.5 А, ёмкость между контактами составляет 2 пФ, сопротивление контактов 30…50 мОм.

Цепь «VBus» согласно стандарту рассчитана на ток не более 100 мА. Программно его можно повысить до 500 мА, если аппаратная часть позволяет это сделать. На практике во многих материнских платах цепь «VBus» соединяется напрямую с блоком питания +5 В компьютера. Поэтому надо соблюдать осторожность, чтобы не случилось короткое замыкание на общий провод. В противном случае сработает защита и компьютер аварийно выключится, не сохранив информацию.

Различают режимы с низкой LS (Low Speed, до 1.5 Мбит/с) и полной FS (Fast Speed, до 12 Мбит/с) скоростью передачи данных. Каждый из режимов имеет свои схемотехнические и программные особенности (Рис. 4.15, a…y).

Рис. 4.15. Схемы подключения компьютера через интерфейс USB к MK (начало):

а) резистор R1 служит опознавательным знаком для компьютера, что удалённое устройство (в данном случае MK) работает в низкоскоростном LS-режиме. Элементы VD1, VD2, R2, R3 огричивают амплитуду сигналов от MK в компьютер до уровня +3.3…+3.6 В. Желательно применить стабилитроны VD1, VD2 с низкой ёмкостью, т.е. в стеклянном корпусе или SMD;

б) MK получает питание +5 В от компьютера через разъём XS1 и фильтр L1, C7, C2. Делитель R1, R2 эквивалентен опознавательному резистору R1, что на Рис. 4.15, а. Напряжение в средней точке делителя близко к +3.3 В, следовательно компьютер настраивается в режим с низкой скорости обмена данными LS. Резистор &2может отсутствовать, что проверяется экспериментально для каждой конкретной материнской платы компьютера;

в) особенность схемы — низковольтное питание MK. Конденсаторы С/, С2устраняют «звон» на фронтах сигналов. Резистор R2 не обязателен. Его ставят к питанию или к GND, чтобы вход MK «не висел в воздухе», если предусматривается работа при отключённом USB-кабеле;

READ  Как подключить модем мтс к роутеру дир 320

г) аналогично Рис.4.15, б, но с одним опознавательным резистором R3, который подключается к цепи «VBus» компьютера. Питание MK может отличаться от стандартных +5 В;

д) аналогично Рис. 4.15, б, но с одним опознавательным резистором R3, который физически подключается к источнику питания +5 В при ВЫСОКОМ уровне на выходной линии MK. Достоинство — возможность программного отключения устройства от USB, для чего на выходе MK надо установить НИЗКИЙ уровень;

е) специализированный MK с встроенным интерфейсом USB-2.0, например, из серии PIC18Fxx5x. Конденсатор C1 шунтирует узел внутреннего ИОН по высокой частоте. Опознавательные резисторы находятся внутри MK. Скорость обмена LS или FS задаётся программно;

ж) специализированный MK имеет встроенный аппаратный интерфейс USB-2.0. Напряжение на выводе KREF узла ИОН составляет +3.3 В. Это позволяет подключить к нему опознавательный резистор R3, который расценивается компьютером как знак того, что удалённое устройство (в данном случае MK) готово работать в высокоскоростном FS-режиме. Дроссель L1 устраняет высокочастотные помехи, генерируемые от MK в линию «VBus» и излучаемые через провода соединительного кабеля. Конденсаторы С/, C2 сглаживают «звон» на фронтах сигналов;

з) защита информационных цепей интерфейса USB сборкой сапрессоров DA1 (фирма Texas Instruments), которые выдерживают импульсы тока 3…9 А;

и) два способа уменьшения ВЧ-излучений — введение дросселей L1, L2 и экранирование разъёма XS1. Рекомендуемые парамеры дросселей: постоянный ток не менее 0.5 А, сопротивление 220…600 Ом на частоте 100 МГц. Иногда ставят дроссели упрощённой конструкции, например, в виде провода, пропущенного через ферритовую трубку («Koralik»), или же наматывают несколько витков провода ПЭВ-0.2 на ферритовое кольцо подходящего диаметра;

к) MK получает питание от разъёма USB через стабилизатор DA1. Остальным узлам устройства доступны на выбор два напряжения: +3.3 В или +5 В, при этом суммарная нагрузка по току не должна превышать 0.1 А. Вместо DA1 можно поставить два последовательных диода 1 N4148;

л) защита входных цепей интерфейса XS1 самовосстанавливающимся предохранителем FU1 и поверхностно-монтируемыми варисторами RUl…RU3\

м) предохранитель FU1 может быть обычным или Polyswitch. П-образный LC-фильтр на элементах L/, C1…C3снижает помехи по питанию от MK к компьютеру и от компьютера к MK;

Рис. 4.15. Схемы подключения компьютера через интерфейс USB к MK (продолжение):

н) фильтрация напряжения питания производится элементами C1…C4, R1\ о) светодиод HL1 выполняет две функции. Во-первых, индицирует рабочее состояние MK, во-вторых, снижает его напряжение питания с +5 до +3.3 В;

с) особенности — другой тип DA1 с другой цоколевкой выводов, светодиоды HL1, НЬ2цдя индикации приёма/передачи, местный (SB1) и удалённый (VT1) сброс MK;

т) конвертор USB-UART на микросхеме DA1 фирмы FTDI. Программно формируемый сигнал НИЗКОГО уровня на выводе RTS# удалённо сбрасывает MK через диод VD1;

у) конвертор USB-UART на микросхеме DA1 фирмы Silicon Laboratories. MK получает питание +3 В от внутреннего стабилизатора микросхемы DA1.

Источник: Рюмик, С. М., 1000 и одна микроконтроллерная схема. Вып. 2 / С. М. Рюмик. — М.:ЛР Додэка-ХХ1, 2011. — 400 с.: ил. + CD. — (Серия «Программируемые системы»).

Источник

Приобщение к миру USB-устройств на примере микроконтроллеров от Silicon Laboratories

Устройства от Silicon Laboratories не пользуются широкой популярностью в любительских кругах, им далеко до таких флагманов, как Atmel. Однако у них есть и вполне доступные простому смертному микроконтроллеры основных линеек в корпусе TQFP, и стартовые комплекты USB ToolStick (о чем совсем недавно упоминалось на хабре). Я сам начал свое знакомство с микропроцессорной техникой, работая с «силабсами», и вполне успешно.
В данной статье я расскажу, каким образом можно организовать связь компьютера с МК, используя USB-интерфейс, и как Silabs попытались сделать это простым для разработчика.
В качестве испытуемого будем использовать плату С8051F320DK, с микроконтроллером соответственно F32x серии, поддерживающей USB аппаратно, и Keil’овскую среду разработки uVision4.

READ  Logitech h800 как подключить по bluetooth

Перед тем, как начинать копать в сторону реализации связи по USB необходимо определиться с некоторыми базовыми аспектами протокола: какое место занимает устройство в топологии (хост или ведомое устройство) и какой характер будет иметь информация, передаваемая по интерфейсу.

Создание USB совместимого HID-устройства типа джойстик

Начинаем с дескриптора устройства

Для упрощения задачи составления дескриптора можно воспользоваться программой, лежащей на www.usb.org (HID Descriptor Tool). В комплекте с программой предоставляются примеры конфигураций некоторых HID-устройств, которые можно корректировать под свою задачу или создавать собственное HID-устройство.
На этом описание джойстика заканчивается и нужно подготовить данные для передачи в PC.

Процедуры передачи данных

Находим в примере следующий код:
void IN_Report(void)<

IN_PACKET[0] = VECTOR;
IN_PACKET[1] = BUTTONS;

// point IN_BUFFER pointer to data packet and set
// IN_BUFFER length to transmit correct report size
IN_BUFFER.Ptr = IN_PACKET;
IN_BUFFER.Length = 2;
>

В этой процедуре идет составление отправляемого пакета, который после через хитрый указатель (на самом деле это просто структура из указателя и его длины) и передается нашим устройством. Главное аккуратно составить пакет, о чем нам и намекает комментарий, а дальше уже с ним сделают все без нашего участия.
Теперь расскажу о том, как и откуда мы берем переменные VECTOR и BUTTONS (обе, к слову, имеют тип unsigned char размером в байт).
Глобальной переменной VECTOR присваиваются значения с АЦП во время возникновения прерывания от него:
void ADC_Conver_ISR(void) interrupt 10
<
AD0INT = 0;

VECTOR = ADC0H;
>

Глобальная переменная BUTTONS аналогично изменяет значение в зависимости от нажатия кнопок. Кнопки опрашиваются по прерыванию от таймера. Таймер настраивайте в соответствии с личными предпочтениями.
void Timer2_ISR (void) interrupt 5
<
P2 &=

if ((P2 & Sw1)==0) // Проверка нажатия кнопки #1
<
// pressed
BUTTONS = BUTTONS | (1

Дескриптор имени HID-устройства

Напоследок можем скорректировать строковые данные, чтобы устройство имело то название, какое мы хотим (в моем примере «JOYSTICK-HABR»).
Ищем строковый дескриптор String2Desc, переписываем
#define STR2LEN sizeof («JOYSTICK-HABR») * 2

Идентификация HID-устройства

После компиляции проекта и программирования микроконтроллера можно подключить устройство к USB-порту. Хост определяет, что устройство принадлежит к HID классу и передает управление устройством соответствующему драйверу.

Теперь в Windows идем в Панель управления->Игровые устройства и видим там нашего пассажира. Смотрим свойства и проверяем функциональность.

Низкая скорость передачи является главным ограничением HID-варианта построения устройства. Максимально возможная скорость передачи данных при такой организации обмена составляет 64 Кбит/сек. Такой показатель в сравнении с 12 Мбит/сек полной скорости USB-шины выглядит минусом HID-технологии в вопросе выбора конкретной USB-реализации. Однако для многих задач коммуникации указанной скорости вполне хватает и HID-архитектура как специализированный инструмент занимает достойное место среди способов организации обмена данными.

Вообще говоря, HID-устройства легки в реализации практически на любом МК с поддержкой USB. Как правило, достаточно одного работающего примера от разработчиков, корректируя который можно получать любой требуемый функционал.

Создание полноценного USB-устройства с использованием инструментария Silabs USBXpress

Но вот наступает момент, когда вам необходимо использовать свой протокол работы с устройством на МК. При этом хотелось бы передавать много данных на большой скорости, и делать все это с помощью своего ноутбука, в котором много USB и ни одного COM, да еще и ваше устройство должно быть не больше спичечного коробка, и лепить на плату USB-UART на микросхеме FT232RL нет никакой возможности.
Тут-то ребята из Silabs и решили облегчить всем жизнь и показать “дорогу в будущее”, без тяжелого ломанья зубов об написание собственных дров и прошивок.
USBXpress Development Kit – это законченное решение для МК и хоста (PC), обеспечивающее простую работу с протоколом USB с помощью высокоуровневого API для обоих сторон. Не требуется особых знаний ни самого протокола USB, ни написания драйверов. Так пишут силабовцы в своем гайде.

Кстати о Programmer’s Guid: занимая всего 30 страниц, он крайне прост и доходчив. Примеры же лично мне не нравятся, часто встречаются очень кривые места, программы же под PC вообще лучше не смотреть, крайне нечитабельны.
USBXpress DK предоставляется к микроконтроллерам линеек C8051F32x, C8051F34x и для CP210x (USB-to-UART Bridge Controller). Библиотека USBXpress включает в свой состав библиотеку нижнего уровня, драйверы USB для ПК и DLL-библиотеку для разработки приложений на верхнем уровне. Ну и, конечно же, набор документации и примеров.
В библиотеке реализована передача данных только в режиме BULK. При использовании всех функций библиотеки, их реализация займет всего 3 Кбайта Flash-памяти микроконтроллера.

READ  Как подключить удбо через интернет
Firmware
Написание USB-дескриптора

В отличие от HID с его хитро формализованной структурой тут все просто
code const UINT USB_VID = 0x10C4;
code const UINT USB_PID = 0xEA61;
code const BYTE USB_MfrStr[] = <0x1A,0x03,'S',0,'i',0,'l',0,'a,0,'b,0,'s,0>;
code const BYTE USB_ProductStr[] = <0x10,0x03,'U',0,'S',0,'B',0,'X',0,'_',0,'A',0,'P',0>;
code const BYTE USB_SerialStr[] = <0x0A,0x03,'H',0,'A',0,'B',0,'R',0>;
code const BYTE USB_MaxPower = 15;
code const BYTE USB_PwAttributes = 0x80;
code const UINT USB_bcdDevice = 0x0100;

С VID, PID и именами думаю все понятно, плюс еще можно задавать максимальный ток параметром MaxPower (макс.ток = _MaxPower*2), PwAttributes — параметр отвечающий за удаленный wake-up хоста, и bcdDevice — номер релиза устройства.

Нюанс инициализации устройства и USB на борту

0x40; // Disable Watchdog timer
USB_Clock_Start(); // Init USB clock *before* calling USB_Init
USB_Init(USB_VID,USB_PID,USB_MfrStr,USB_ProductStr,USB_SerialStr,USB_MaxPower,USB_PwAttributes,USB_bcdDevice);

Initialize();
USB_Int_Enable();
.

Здесь, как требует комментарий, в первую очередь необходимо инициализировать тактовый генератор для USB перед самой его инициализацией, только потом провести остальные стартовые операции для МК — Initialize(); — который настраивает порты, таймер и АЦП; затем разрешаем прерывания от USB.

Обработка входящих данных и формирование исходящего пакета

Вот подобрались к самому главному
//. продолжение main
while (1)
<
if (Out_Packet[0] == 1) Led1 = 1;
else Led1 = 0;
if (Out_Packet[1] == 1) Led2 = 1;
else Led2 = 0;

In_Packet[0] = Switch1State;
In_Packet[1] = Switch2State;
In_Packet[2] = Potentiometer;
In_Packet[3] = Temperature;
>
// конец main
>

Out_Packet – пакет, принятый от хоста;
In_Packet — пакет, отправляемый хосту;
Суть ясна, МК постоянно обновляет отправляемый пакет и считывает статус полученного.

Обработка прерываний

Теперь в 2-х словах о том, откуда получаем значения в отправляемый пакет. Как и в примере с HID, состояния кнопок получаем по прерываниям от таймера, а значения АЦП и термометра — по прерываниям от АЦП.
Вот здесь один тонкий момент — при инициализации АЦП настраиваем его так, чтобы конвертирование значений происходило по переполнению таймера (того же, который мы используем для кнопок), а само же прерывание от АЦП возникает по завершению конвертирования. И тут кроме получения значений преобразователя в конце процедуры вызываем API функцию
Block_Write(In_Packet, 8)
которая и отправляет собранные данные на компьютер.
Получение команд от компьютера происходит в процедуре обработки прерываний от USB:
void USB_API_TEST_ISR(void) interrupt 16
<
BYTE INTVAL = Get_Interrupt_Source();

if (INTVAL & DEV_CONFIGURED)
<
Initialize();
>
>

Этот момент подробно расписан в Programmer’s Guid. Суть в том, что вызывается API-функция Get_Interrupt_Source(), возвращающая код причины возникновения API прерывания. Далее код анализируется и выполняется необходимое действие.

Программ на PC

Разбирать программу для компьютера я не буду. Силабовцы предоставили примеры на Visual Basic и на C, но, даже не заглядывая в исходники, подключить библиотеку в используемой вами среде разработки и прочитать пару страниц о функциях сложности вызвать не должно.
Поэтому я воспользуюсь уже скомпилированной программой из примера.

Итак, компилируем проект для МК, зашиваем, устанавливаем универсальные драйвера для USBXpress и подключаем отладочную плату. Система определит новое устройство и установит для него драйвера.
Посмотрим после установки, что творится в диспетчере устройств Винды:

Теперь запускаем программу:

Видим, что она правильно нашла устройство.

Все, теперь можно тут потыкать кнопки, поморгать диодами, погреть МК руками, увидеть как растет температура.

Заключение

В целом создание USB устройства с помощью библиотек USBXpress оказалось более быстрым и прозрачным процессом, нежели используя HID-архитектуру. Да и скорость будет однозначно выше. Наиболее тонким местом является то, что библиотека закрыта, и узнать насколько надежным является это решение невозможно, к тому же доступен только BULK режим передачи данных.

Источник

Поделиться с друзьями
Как подключить и установить...
Adblock
detector