Usb tmc что это

Обновлено: 05.07.2024

Иллюстрированная проекция модели сетевого взаимодействия OSI на универсальную последовательную шину.

Три «замечательных» уровня стека USB

Меня не устроил вид стека USB, который можно встретить чаще всего на просторах сети:

Уровень шины, логический, функциональный… Это, конечно, замечательные абстракции, но они скорее для тех, кто собирается делать драйвер или прикладной софт для хоста. На стороне же микроконтроллера я ожидаю шаблонный конечный автомат, в узлы которого мы обычно встраиваем свой полезный код, и он сперва будет по всем законам жанра глючить. Или же глючить будет софт на хосте. Или драйвер. В любом случае кто-то будет глючить. В библиотеках МК тоже с наскока не разобраться. И вот я смотрю на трафик по шине USB анализатором, где происходящие события на незнакомом языке с тремя замечательными уровнями вообще не вяжутся. Интересно, это у меня от гриппозной лихорадки в голове такой диссонанс?

Если у читателя бывали сходные ощущения, предлагаю альтернативное, явившееся мне неожиданно ясно в перегретом мозгу видение стека USB, по мотивам любимой 7-уровневой модели OSI. Я ограничился пятью уровнями:


Я не хочу сказать, что весь софт и библиотеки уже сделаны или должны проектироваться, исходя из этой модели. Из инженерных соображений код c уровнями будет сильно перемешан. Но я хочу помочь тем, кто начинает своё знакомство с шиной USB, кто хочет понять протоколы обмена устройств и терминологию предметной области, подобраться поближе к готовым примерам, библиотекам и лучше ориентироваться в них. Эта модель не для загрузки в МК, но в ваши блестящие умы, дорогие друзья. А ваши золотые руки потом всё сами сделают, я не сомневаюсь:)

Итак, поехали, поправляйте, если увидите косяки. Это draft-версия, и если уже такое где-то было нарисовано, прошу простить, я не нашёл и потому скрутил сам. Думаю, картинка никуда не убежит, а я пока объясню почтенной публике, зачем вообще взялся за эту публикацию.

Свой первый баг из чужого кода я вытряхнул в конце девяностых, будучи студентом на подработках. Это был pppd под FreeBSD, который мы тогда прикрутили на модемный пул. Мотороловские модемы залипали в отбое, дозвониться никто не мог, линия пропадала зазря, и единственный оставшийся способ через PPP keep-alive почему-то глючил. Вот тогда я и выяснил, что pppd зачем-то ждёт шесть ответных байтов LCP вместо положенных четырёх. Почувствовал я себя тогда эдаким лихим жукотрясом из девяностых:-) При чём тут PPP? Просто он на USB похож: пакетный и двухточечный. Правда, в отличие от USB 2.0, полнодуплексный.

Как пройти в библиотеку?

Получив на GitHub любезно выложенный автором проект RHIDDemo для Em::Blocks, я начал портировать его в Keil (мой отладчик CoLink на базе FTDI; кто-нибудь, подскажите плагин от Coocox для Em::Blocks). Но никак не мог понять: где, чёрт возьми, автор раздобыл SPL 3.6.1 выпуска 2012г, если на сайте выложен 3.5.0 от 2011г? Я прошёл довольно скучный квест, который к моему удивлению привёл… прямо на готовый проект Custom HID для Keil в составе библиотеки USB FS 4.0.0. Лежит у всех на виду, как мышь под веником. Ну и ладно. Зато я раскурил, наконец, релизы STMicroelectronics, нашёл описание библиотеки USB FS STSW-STM32121 (UM0424) и пресёк попытки разработчика свести меня с ума. Вот скажите, это нормально подкладывать винтажный CMSIS 1.30 образца 2009г в набор SPL 3.5.0 выпуска 2011г, новый SPL 3.6.1 релиза 2012г прятать в USB-FS 4.0.0 релиза 2013г (подложив туда же и CMSIS 3.0.1 от 2012г), при том, что у них же выложена актуальная версия CMSIS 3.30 релиза 2014г? Кстати, в SPL 3.6.x для STM32F10X исправили пару багов с USART, касающихся сигналов о переполнении буфера. Спасибо, хоть release notes оставили…

HID vs SNMP

Итак, взявшись за STM32F103C8T6, я тоже решил слегка задвинуться по теме USB HID, уж больно хорошо абстракция USB HID укладывается в концепцию всяческих датчиков, сенсоров и прочих ШИМ-управляемых драйверов питания. Чем-то напомнило мне SNMP, только в сильно упрощённом виде: дескрипторы HID играют роль SNMP MIB. Когда устройство инициализируется хостом: «Привет, хост! Я кофеварка. У меня есть кнопка [старт], регуляторы [сливки], [сахар], датчики [остаток кофе], [остаток воды], [остаток сахара], [остаток сливок]. Подтягивай драйвера, дави на кнопку, кофейку попьём». Ничего не напоминает? Пример диалога по SNMP: «Ну, привет, управляющая станция с софтом за $100000. А я шасси коммутатора за $200000, и на мне сидят ещё 4 модуля по $100000 за штуку; в каждом ещё по 16 портов с неприличной скоростью, и всех функций тут просто не перечислить… спрашивай отдельно по каждому пункту; ах, да загрузка процессора такая-то, памяти столько-то…». И ещё на дюжину страниц в таком же духе.

Ещё одна замечательная схема


На просторах сети встретил ещё такую иллюстрацию (лежало в формате BMP, без шуток):

Сперва выглядит оптимистично. Наконец-то, стек в разобранном виде. Кадры, правда, обозначены неудачно: я бы нарисовал их вертикальными пунктирными линиями, а EOF — это просто пауза, реально данные не передаются. Но начинаем читать контекст и теряем понимаем истинный замысел автора (запутать нас):

Хост-контроллер интерфейса шины USB формирует кадры;
Кадры передаются последовательной передачей бит по методу NRZI.
каждый кадр состоит из наиболее приоритетных посылок, состав которых формирует драйвер хоста;
каждая передача состоит из одной или нескольких транзакций;
каждая транзакция состоит из пакетов;
каждый пакет состоит из идентификатора пакета, данных (если они есть) и контрольной суммы.

Вроде бы и нарисовано всё правильно, но по мере прочтения вопросов становится всё больше. Минимальная передаваемая структура данных по шине — это кадр или пакет? Вообще, это сверху вниз надо смотреть или наоборот? И что кодируется по методу NRZI — кадры, пакеты или просто весь битовый поток по шине? Из транзакций состоит посылка, передача, или, может быть, ценная бандероль какая?
Почему нельзя просто: хост группирует пакеты в транзакции и распределяет их по временным квантам, именуемым кадрами, чтобы давать приоритет критичным по времени данным (видео, аудио) исходя из текущей пропускной способности шины? Да, в USB есть нюансы с планированием передачи пакетов, я их пока не затрагиваю.

Моё видение стека USB

Хорошей документацией считаю упоминавшийся тут на хабре USB in a NutShell (ура, перевод), а также USB Made Simple. По ним я и собрал свою версию стека USB, нарисую её ещё раз.


Физический уровень

На физическом уровне используется набор электрических режимов дифференциальной пары проводников (вместе с землёй) для обозначения состояний, с помощью которых кодируется битовый поток по методу NRZI со вставкой битов (bit stuffing): здесь после шести идущих подряд «1» (ну захотелось передать, скажем, 0xffff) вставляется «0», чтобы приёмник подолгу не залипал в одном состоянии; приёмник узнает вставленный «0» и как данные не засчитает, это довольно распространённый приём в кодировании для лучшей автоподстройки частот. Пара проводов вместе с землёй даёт возможность сформировать, как минимум, четыре статических состояния (они обозначаются J, K, SE0, SE1). В USB 2.0 SE1 не используется, а три оставшихся дополнительно разыгрываются в динамике (с часами и переходами) для передачи ещё нескольких управляющих символов (границы пакетов, сброс, подключение/отключение, энергосбережение/выход). Хорошие иллюстрации есть в USB Made Simple, Part 3 — Data Flow.
Т.е. в итоге передаются данные в виде ноликов и единичек, плюс всякие управляющие символы, чтобы можно было из всей этой электродинамической кухни готовить нормальные пакеты данных.
(дополнено по просьбе читателей)

Пакетный уровень

На пакетном уровне между хостом и устройством передаются безадресные пакеты (пара устройств на полудуплексной линии может обойтись и без адресации). Пакет состоит из маркера SYNC для синхронизации тактов приёмника, последовательности байт и символа EOP. Длина пакета переменная, но оговаривается через верхние уровни стека. Первый байт называется Packet Identifier (PID), имеет простой избыточный формат для помехоустойчивости и пригоден для скармливания автомату следующего уровня (для сборки транзакций из пакетов). Пакеты с начинкой (длиннее одного байта PID) снабжаются контрольной суммой (короткой CRC5 или длинной CRC16, в зависимости от типа пакета). Анализатор протоколов должен, как минимум, показывать нам пакеты.

Уровень транзакций

На следующем уровне из пакетов собираются транзакции. Транзакция — это малый набор пакетов (в Full Speed USB 1, 2 или 3), следующих строго друг за другом, которыми (в полудуплексном режиме) хост обменивается с оконечной точкой (endpoint), и только с одной. Очень важно, что транзакцию открывает только хост, это специфика USB (нам в прошивке МК меньше мороки). На уровне транзакций можно говорить о канале (pipe) между хостом и одной из оконечных точек устройства, но я намеренно избегаю термина «канальный уровень» (Data Link) из модели OSI. Анализатор протоколов должен хотя бы декодировать транзакции.

Уровень передач

Поверх транзакций расположим уровень передач (transfers). Их в USB используется четыре типа: контрольные с оконечной точкой №0 (control transfers), передачи с прерываниями (interrupt transfers), изохронные (isochronous transfers) и крупноблочные передачи (bulk transfers). Последние три являются вариантами потоковых каналов (stream pipe), про которые я ещё скажу несколько слов. Этот уровень тоже должен отобразить хороший анализатор протоколов.

Прикладной уровень

Венчает стек, как обычно, прикладной уровень. Здесь происходят: установка адреса устройству хостом, рассказ устройства о себе на языке дескрипторов, команды хоста на выбор конфигурации (контрольные передачи), обмен данными с HID-устройствами (в примерах пока нашёл передачу с прерываниями, хочу попробовать контрольную), печать на принтере и сканирование, доступ к накопителю USB (крупноблочные), общение через гарнитуры и веб-камеры (изохронные) и многие другие замечательные вещи.

Последний штрих

Смотрим на трафик по USB

Итак, транзакция всегда инициируется хостом в отношении одной выбранной оконечной точки на устройстве (помимо специальной точки с номером 0, их может быть ещё до 15 штук на одном устройстве, например, комбинированная клавиатура с мышью, термометром, флэшкой, кофеваркой и кнопкой вызова сантехника заказа пиццы).
В случае приёма хостом данных с устройства последнее не может само открыть транзакцию, но может только дождаться нужного момента и поучаствовать в ней. Хост открывает транзакцию устройству пакетом с PID = IN (группа Token) и гарантирует на нужное время свободу шины, устройство вбрасывает пакет из группы Data, в зависимости от типа транзакции хост может подтвердить успех третьим пакетом из группы Handshake (ACK, NAK, STALL, NYET), транзакция закрыта.
При отправке данных на устройство (PID = OUT, группа Token) хост открывает транзакцию, отправляет пакет с данными (Data), также в зависимости от режима может принять пакет Handshake с подтверждением успешности транзакции.
По окончании транзакции всё вернётся на круги своя, устройство снова будет ждать управляющих пакетов от хоста.

Режимы передачи USB в примерах STM32 USB FS

DISCLAIMER

Дальше будут упоминаться примеры из той самой библиотеки UM0424 для работы с Full Speed USB от STMicroelectronics, но они рассчитаны под их родные демоплаты. Берите пример с автора Raja, проявляйте инженерную смекалку в адаптации проектов под свою демоплату.

По софту всё понятно: это примеры не для промышленного использования, там могут быть баги, некоторые части (типа таблицы ссылок в примере Mass storage) защищены патентом, и вы не имеете прав их использовать в коммерческом проекте. Но это ещё ничего, китайцы ухитряются потом продавать на рынке USB-изделия, у которых даже библиотечные VID и PID не удосужились поменять.

По железу, как я понял, надо начинать с кварца. У меня челябинский PinBoard II с кварцем 12Мгц (все библиотеки заточены под 8МГц), я менял умножитель ФАПЧ с 9 на 6 (ссылка с разъяснениями), иначе МК разгонится до 108МГц вместо 72МГц, а USB на 72МГц вместо положенных 48МГц вообще не поедет. Можно ещё сбавить обороты МК до 48МГц, поменяв делитель шины USB с полутора до единицы. Использовать внутренний генератор МК HSI спецы не любят: частота может слегка уплыть от нагрева, последствия для USB предсказать затрудняюсь. Ну и не забываем о периферии, конечно. Без флэш-памяти SPI/SDIO из примера Mass storage можно сделать разве что аналог /dev/null, но его ведь хрен отформатируешь:-)

Передачи с прерываниями

Эта разновидность (interrupt transfer) предназначена для обмена небольшими транзакциями, сходными с контрольными. Нет, устройство не может прерывать хоста, оно ждёт опроса, их частота и размеры пакетов оговариваются заранее в дескрипторе устройства. Хорошо подходят для всевозможных пультов, датчиков, сенсоров, мышек, светодиодов и прочих HID-кофеварок. Канал с прерываниями каждой точки однонаправленный.
Примеры: Custom HID, Joystick mouse, Virtual COM port

Передачи изохронные
Передачи крупноблочные

Что осталось нераскрытым

Я не имею цель сделать ещё один учебник по USB, их и без меня хватает, и там хорошо описаны: электрическая часть, подробности протоколов, работа с концентраторами, дескрипторный язык и уровень абстракции HID, проблемы с уникальностью VID/PID, USB 3.0 и многие другие замечательные возможности шины USB, как полезные нам, так и не очень. Айтишникам особо рекомендую экскурсию на тёмную сторону с обзором вражеских девайсов (флэшка с замаскированной HID-клавиатурой, которая будет делать страшные вещи).

Ссылки

P.S.
Читая публикации на хабре, посвящённые в той или иной степени микроэлектронике, я разглядел две инженерных касты, назовём их условно: Промэлектронщики и Айтишники. Это своего рода инженерный Инь и Ян, в каждом из нас есть доля того и другого.

Промэлектронщики имеют блестящие знания и навыки по железу, паяют радиодетали толщиной с волос левой рукой с закрытыми глазами (причём потом это работает). Взглянув на электронную схему, почти физически начинают ощущать все её токи с потенциалами, работают также и с силовыми схемами, и с (большими, быстрыми, опасными) промышленными изделиями. Подход к программированию МК соответствующий: он просто должен выдать нужные логические уровни на нужные ножки в нужное время, не столь важно каким способом. Консервативны в технологиях (не влезай — работает), тяжёлую периферию МК не особо жалуют. При обсуждении объектно-ориентированного программирования, информационной безопасности, гигантских проектов в миллион строк кода и всяких навороченных графических интерфейсов скучнеют. Вместо пакетно-ориентированной шины USB предпочитают потоковый режим USART, усиленный либо привычным RS-232, либо более брутальным RS-485 (последовательная шина для промышленных применений, до 10Мбит/с на 15м, до 100кБит/с на 1200м, до 32 устройств).

Айтишники воспитаны на понимании операционных систем, сетевой инфраструктуры и сложных взаимодействий, элита хорошо подкована в информационной безопасности и разбирается во всяких незримых способах проникновения в чужую систему. Некоторые при этом очень любят котиков (ну как их можно не любить? я, правда, не держу, не развожу и не готовлю:-). Многие любят свободу информации, ругать корпорации/правительства и побеждать силы природы усилием мысли. Паталогически ленивы, но обожают новые технологии и закрученные инженерные ребусы с дорогими игрушками (желательно решаемые на уровне софта или, в крайнем случае, перемычек). Отношения с паяльником настороженные: не спрашивайте у айтишника, любит ли он паяльник, может неправильно понять; лучше спросите, любит ли он паять электронные схемы.

К чему я? Мы просто видим этот мир по-разному… Ведь ядро Linux кроили такие же ребята, из модулей на С и ассемблерных вставок для конкретных платформ, и без холиваров вроде обошлись. По-настоящему серьёзный проект я вижу как многоядерную систему, сочетающую современнейшие МК с тяжёлой периферией, но не исключаю связки с классическими моделями типа AVR: ими можно обвесить какие-нибудь критичные быстровращающиеся острия технического прогресса. Если код проверенный годами, то почему нет?

Об Энциклопедии измерений

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

Не отстает от электронной техники и приборостроительная отрасль – ведь чтобы разработать и выпустить на рынок новые устройства, их необходимо тщательно протестировать, как на этапе проектирования и разработки, так и на этапе производства. Появляются новая измерительная техника и новые методы измерения, а, следовательно – новые термины и понятия.

Для тех, кто часто сталкивается с непонятными сокращениями, аббревиатурами и терминами и хотел бы глубже понимать их значения, и предназначена эта рубрика.

USBTMC

Интерфейс USBTMC состоит из конечных точек, которые представляют устройство и используются для предоставления физического/ сигнального/ пакетного соединения с хостом. Программное обеспечение USBTMC должно быть установлено на стороне хоста, взаимодействуя с драйверами USBоперационной системы обеспечивает обмен данными между компьютером и устройством.

Общая модель взаимодействия для интерфейса USBTMC представлена ниже на схеме:


Конечная точка Control требуется спецификацией USB 2.0.

Конечная точка Interrupt-IN используется устройством, чтобы послать оповещение хосту. Спецификация подкласса USBTMC может потребовать наличие конечной точки Interrupt-IN. Если у дискриптора интерфейса поле bInterfaceProtocol = 0, то спецификация такого подкласса не применяется, и интерфейс USBTMC не обязан иметь конечную точку Interrupt-IN.

Usb type: a что это

USB (Universal Serial Bus) расшифровывается как универсальная последовательная шина передачи данных между устройствами. Например, между компьютером и его периферией – клавиатурой, мышкой, флешкой, принтером, сканером, веб-камерой и т. д.

Через USB подключенные девайсы получают энергию для работы и зарядки, поэтому гнездами такого типа оснащают power-банки и зарядные устройства. За питание отвечает пара или две пары контактов, которые на схемах условно обозначают VCC или +5 V и GND (земля). Если внимательно взглянуть на разъем, можно увидеть, что эти контакты длиннее остальных. Так сделано для того, чтобы соединение/разъединение силовых и информационных линий происходило с разбежкой во времени, иначе данные могут передаваться с ошибками.

Линии питания и данных USB.

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

Интерфейс USB поддерживает технологию Plug and Play («подключаю и использую»). При соединении с хостом, например, компьютером, периферийное устройство сообщает ему, что оно собой представляет, а хост подбирает подходящий драйвер. «Общение» происходит по линиям данных.

Девайсы, выпущенные в последнее десятилетие, оснащены USB-интерфейсами версий 2.0, 3.0, 3.1, 3.2. Редко, но еще встречаются старые устройства с USB 1.1. Интерфейсы разных поколений передают информацию с различной быстротой.

Теоретически достижимые скорости передачи данных по шине USB актуальных версий представлены в таблице:

USB1.112 Мбит/с
USB2.0480 Мбит/с
USB3.05 Гбит/с
USB3.110 Гбит/с
USB3.220 Гбит/с

Дабы не путать читателя, здесь приведены только максимальные скорости, согласно спецификациям USB различных версий без учета режимов их работы. Значит, реальная скорость обмена данными между устройствами, соединенными этой шиной, может быть в разы ниже.

USB-разъемы разных поколений совместимы друг с другом, но быстрота передачи данных между ними всегда ограничивается потенциалом более медленной стороны.

USB последнего – третьего поколения выдерживает бОльшую силу тока, нежели предшественники, что влияет на скорость зарядки и поддержание работы подключенных устройств, особенно потребляющих много энергии, вроде внешних жестких дисков.

Максимальный выходной ток USB-порта зарядного или хостового устройства составляет:

  • Для версий 1.1-0 – 0,5 А.
  • Для версии 3.0 – 0,9-1,5 А.
  • Для версий 3.1-3.2 – 1,5-3 А с возможностью повышения до 5A.

Стандартное напряжение выходного USB-порта – 5 V. Отдельные спецификации версий 3.1-3.2, ориентированные на подключение энергоемких девайсов, выдерживают до 20 V.

Это интересно: Компьютер не видит Android через USB

USB гнезда.

Внешне USB-разъемы разных поколений отличаются цветами. Третье – самое молодое, имеет голубой или синий оттенок, это его типовой признак. Первое и второе могут быть окрашены в черный, белый, серый и другие цвета, их раскраска никак не связана с характеристиками.

Виды разъемов

Виды USB-разъемов зависят от выполняемой функции и скорости с который передаются данные. Благодаря существованию нескольких типов ЮСБ-разъемов охватывается расширенный функционал, который позволяет пользователю упрощать связь компьютера с устройством (мышка, клавиатура, iPad, МФУ, сканер и другие).

По назначению любой USB-порт можно отнести к одному из трех типов:

  • Стандартному или обычному, который обеспечивает питание и информационный обмен между девайсами. Такими портами оборудованы компьютеры, ноутбуки, смартфоны, телевизоры и т. д.
  • Зарядному. Они встречаются на зарядных устройствах, power-банках и некоторых системных блоках, предназначены только для питания периферии.
  • Выделенному зарядному. Эти гнезда служат для зарядки USB-гаджетов от бытовой электросети. Их встраивают в электрические розетки. Пример такого решения показан на фото ниже.

Зарядный порт USB.

Первый тип может быть любой версии, второй и третий чаще относится к версиям 2.0 или 3.0. Последние различаются между собой цветами.

Конфигурация разъемов тоже «завязана» на поколение интерфейса. USB-штекеры и гнезда версий 1.1 и 2.0 бывают следующих типоразмеров и форм:

  • Типа А (стандартные). Такие порты устанавливают на хостовые и зарядные устройства. Они бывают трех размеров: обычного (самый распространенный – 12×4 мм, 4 контакта), среднего (miniUSB 7×3 мм, 5 контактов) и маленького (microUSB 7×2 мм, 5 контактов).

Разъемы USB 2.0

  • Типа B (узкие). Гнездами этого вида оснащают периферийное оборудование. Они также могут быть обычными (7×8 мм, 4 контакта), мини (3×7 мм, 5 контактов) и микро (2×7 мм, 5 контактов).

Разъемы микро обоих типов визуально очень похожи. Отличие лишь в том, что А имеет форму прямоугольника, а у B скошены верхние углы.

Разъемы microUSB.

Редко, но встречаются USB-кабели, которые оборудованы комбинированными разъемами: mini-AB и micro-AB. Их можно подключать к гнездам того и другого вида.

Разъемы USB третьего поколения имеют следующие типоразмеры:

  • A – стандартный. Он отличается от предшественника цветом и количеством контактов, здесь их 9. Разъем микро-A имеет 10 контактов и разделен на 2 части. Половина идентична microUSB 2.0 (для совместимости), остальные 5 контактов расположены в другой части. Так сделано потому, что компактный размер не позволил уместить все выводы в одном месте. Разъемов типа мини-A 3.0 не существует.
  • В – его стандартный и мини-разъемы идентичны по конфигурации USB-B версии 2.0, но также имеют по 9 контактов. Micro-В отличится от micro-А формой совмещаемой половины. Она, как и microUSB-B 2.0, имеет срезанные углы.

Разъемы USB 3.0.

Интерфейсы microUSB третьего поколения распространены мало, поскольку крайне неудобны в использовании. Кроме того, гнезда этого типа зачастую не выдерживают многократных рывков туда-сюда и отламываются от носителя. Таким же недостатком страдают и их предшественники, но здесь проблема возникает чаще.

Однако это не значит, что от миниатюрных разъемов USB-3 придется отказаться. Замена неудачному решению уже найдена – новый и кардинально непохожий на прототип интерфейс USB Type C.

Type-C или просто USB-C – это компактный разъем USB третьего поколения (8,4 x 2,6 мм, 24 контакта), который предназначен для тех же задач, что и его предшественники. В отличие от всех прочих интерфейсов этого типа, он симметричный или двусторонний, то есть поддерживает подключения кабеля и верхней, и нижней сторонами, как разъемы Lightning на устройствах Apple.

Гнездо USB-C.

Отсутствие нужды ориентировать кабель в нужном положении уменьшает риск поломки гнезда, продлевает срок его службы и упрощает жизнь людям с ослабленным зрением и нарушенной координацией движений, которые в силу этих причин не могут пользоваться устройствами с разъемами microUSB-B.

Спецификация Type-C соответствует USB 3.1 и обеспечивает полную совместимость с ранними версиями этого интерфейса, как того требует стандарт. Поэтому мобильные гаджеты, оснащенные такими гнездами, не всегда поддерживают скорости третьего поколения: новомодный разъем вполне способен уживаться с USB-контроллером версии 2.0.

Основные отличия Micro и Mini USB

Перечисленные виды ЮСБ разъемов имеют как общие сходства, так и различия. Связано это в основном с линейными размерами.

  1. Размеры устройства. Инженеры считают данную деталь важной, поэтому микро ЮСБ используется практически во всех мобильных устройствах. Micro занимает меньше места в устройстве, поэтому разработчики останавливают выбор на нем. Mini же имеет расширенную форму. Некоторые аналитики предрекают скорую гибель Mini ЮСБ, они говорят о том, что скоро он просто перестанет существовать. Micro тип выходит на лидирующие позиции.
  2. Micro USB создан из прочных материалов на основе Mini. Поэтому Микро считается улучшенной версией предыдущего поколения. Они реже ломаются.

Сегодня Микро тип используется в большинстве выпускаемых мобильных устройств. Использование Mini постепенно сокращается.

usb разъемы

Немного о USB-кабелях

Различия между кабелями USB не только в конфигурации разъемов, но и в количестве жил. Самый распространённый тип кабеля – четырехжильный USB 2.0, предназначен для передачи данных и питания периферийного оборудования. В нем каждая из линий связана с парой идентичных контактов на противоположных штепселях. Данные по такому кабелю передаются по очереди – или в одну, или в другую сторону.

Существуют USB-кабели только для зарядки. В них всего 2 жилы – плюс и земля, а контакты информационных линий просто соединены между собой. Они обычно тоньше 4-жильных. В магазинах их, как правило, не продают, но включают в комплекты поставки разных девайсов с поддержкой питания 5 V (например, электрических зубных щеток).

Кабели USB третьего поколения обычно окрашены в синий цвет (хотя не всегда) и более толстые. Ведь помимо стандартных четырех жил, в них включено столько же дополнительных. За счет добавочных линий поддерживается одновременная передача данных в оба направления.

Кабели USB-OTG.

Для подключения к смартфонам и планшетам периферийного оборудования (клавиатур, флешек, мышей и т. д.) разработан еще один тип кабелей – OTG. В кабеле OTG-2.0 всего 4 жилы и 5 контактов. На стороне хоста дополнительный – пятый контакт (ID) соединяется с землей – так устройства определяют, какое из них выступает в роли хоста. В OTG-3, соответственно, на 4 линии данных больше.

Кабели USB Type-C с противоположной стороны чаще имеют штепсель другого вида, например, USB-A, HDMI, DP и т. д. Конфигурация второго разъема, количество жил и связь с определенными выводами, поддержка силы тока разных уровней определяют их назначение и функциональность.

Выбор кабеля влияет на скорость зарядки и обмена информацией между устройствами. Некачественный или неправильно подобранный, он может быть «бутылочным горлом» подключения. Так, если соединить телефон и компьютер через порты USB-3.0 – USB-C кабелем USB-2.0, связь будет медленнее в разы, чем если бы использовался соединитель версии 3.

Питание через USB-разъем

Изначально стандарт USB был «заточен» на питание и зарядку маломощных девайсов с током потребления до 0,5 A при напряжении 5 V. Однако с появлением смартфонов и планшетов с батареями повышенной емкости этот предел стал бы непреодолимым барьером к массовому выпуску их на рынок. Ведь заряжать такие устройства малыми токами можно сутки напролет, а кому это понравится.

Так появилось еще несколько спецификаций, в том числе Quick Charge (быстрая зарядка) – технология передачи энергии, которая превышает штатные возможности USB, посредством USB-интерфейса.

Зарядное устройство Quick Charge.

Сегодня актуальны следующие версии этого стандарта:

  1. Quick Charge 2.0. Она предусматривает ступенчатое повышение выходного напряжения от 5 V до 9 V, 12 V и 20 V.
  2. Quick Charge 3.0. Также поддерживает повышение напряжения до 20 V, но с интервалом 0,2 V.
  3. Quick Charge 4.0 и 4+. Базируется на еще одной технологии электропитания – Power Delivery, и обеспечивает быструю зарядку аккумуляторов через разъемы USB-C.

Возможность пополнять запасы энергии от зарядных устройств с поддержкой Quick Charge имеют только те гаджеты, где она реализована на аппаратном уровне. Технология QC, как и USB, полностью поддерживает обратную совместимость.

Power Delivery – стандарт питания энергоемких устройств с поддержкой мощности до 100 W посредством обычного кабеля и разъемов USB версии 2.0 или 3.0-3.2. Источником энергии в такой системе может быть не только зарядник или power bank, но и девайс, выступающий в роли хоста. А хостом может назначаться любой гаджет с аккумулятором, например, смартфон, подключенный к другому смартфону.

Передача тока в системах Power Delivery идет в обоих направлениях, поэтому хост и периферия в процессе зарядки могут меняться местами. Кроме того, стандартом предусмотрена возможность изменения уровней токов и напряжений по пяти профилям:

  • менее 5 V и 2 А;
  • 5-12 V и 1.5 А;
  • 5-12 V и 3 А;
  • 12-20 V и 3 А;
  • 12-20 V и 4.75-5 А.

Power Delivery уже сейчас позволяет питать через разъемы USB такие мощные устройства, как ноутбуки и моноблоки. Дальнейшее развитее технологии, надо ожидать, перешагнет 100-ваттный порог и найдет применение в умных TV, бытовой технике, осветительных приборах и везде, где только можно. Словом, у USB большое будущее, и нам предстоит сосуществовать с ним еще много-много лет.

Особенности и преимущества

Раньше внешние сторонние устройства общались с ПК посредством таких средств коммутации, как PS/2, последовательный и параллельный вход-порт, отдельный разъем для подсоединения игровых манипуляторов, и что такое USB, никто даже не слышал. При разработке новых гаджетов появилась острая необходимость унифицировать коммутационные возможности. Презентация нового стандарта привела к расширению функциональности компьютера и стимулировала разработку сторонних продуктов с шиной USB.

Простота и удобство в использовании стали синонимами USB-технологии. Она позволила взаимодействие со спецификацией «Plug and Play», которая предполагала надежную, быструю и дружественную коммутацию внешних источников.

подключение переферии по разъему USB

Недостатки интерфейса USB

Разъемы mini USB и micro USB из-за конструктивных особенностей часто выходят из строя раньше своего эксплуатационного срока службы. Это обусловлено тем, что такие разъемы обычно находятся в гаджетах, которые очень часто приходится подсоединять к компьютеру или заряжать (телефоны, смартфоны, КПК, МР3-плееры). При этом стоит отметить, что технология USB позволяет не только обмениваться данными, но и дает возможность заряжать устройства через свое соединение.

гнездо смартфона

Заявленная пропускная способность у спецификации 2.0 в 480 Мбит/с не соответствует действительности. Это происходит потому, что данные передаются в обе стороны по одной витой паре кабеля. Для достижения максимальной скорости требуется 2 такта при обмене информацией, что, кстати, реализовано в USB 3.0.

Альтернативы USB

Переходник кабеля FireWire. Порты USB это альтернатива последовательным и параллельным портам, доступным на старых компьютерах. Порты USB поддерживают намного более быструю (часто 100-кратную или более) передачу данных, чем последовательную или параллельную.

Для компьютерных сетей вместо USB иногда используются порты Ethernet. Для некоторых типов компьютерных периферийных устройств порты FIreWire также иногда доступны. И Ethernet, и FireWire могут предложить более высокую производительность, чем USB, хотя эти интерфейсы не обеспечивают питание по проводам.

Коротко о USB - откуда все начинается. D+ и D- это дифференциальная пара, данные передаются в противофазе с одной лишь целью уменьшить помехи. То есть линия передачи по сути одна ! Есть ведущее устройство (Хост) и ведомое (Device).

Ведущее и ведомое могут одновременно что-то посылать в канал. Поэтому протокол USB очень требовательно распределяет , что ведущий и когда посылает и что (и когда) ведомый должен ответить. Иначе никак нельзя.

Вот на картинке ниже все отчетливо видно (один пакет от ведомого):

фотка 1

Сначала все просто:

Пакет всегда начинается с SYN (10000000).

Завершается пакет всегда EOP (End Of Packet ) . На картинке выше видна единственная ассиметрия в конце пакета, когда : 2 линии DP и DM различаются.

Примерная последовательность пакетов.

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

Периодические пакеты "НЕ СПАТЬ" SOF (Start Of Frame) - это примерно 1раз/1мс посылка от хоста ведомому ("не спи"). Их лучше сразу как-то отфильтровывать для понимания.

Далее остается три типа пакетов типа . Ниже их PID (Packet Identificator) , он же токен :
SETUP это служебные пакеты стандартного протокола настройки устройства
OUT это хост передает данные
IN это хост запрашивает данные от девайса

Эти пакеты вкладываются между SYNK и EOP .

фотка 2

Получается примерно такая структура [SYNC] [PID] [Address(7 бит)] [EndPoint] (4 бит) [EOP ]. На картинке выше видно как девайс отвечает NAK практически сразу и это нормально. Это означает , что девайсу надо подумать и сразу он не может ответить на команду.

PID это токен или (Program Identificator) SETUP, IN , OUT.

Address - это адрес нашего устройства на шине USB . Сначала он всегда 0 после подключения USB. Потом хост перенумеровывает все устройства на шине и присваивает каждому устройству уникальный адрес (размер всего 1 байт).

EndPoint - хост всегда общается не просто с устройством по адресу , а еще и с конкретной конечной точкой (end-point) устройства , которых может быть несколько. Как же хост узнает какие значения у конечных точек (EP) ? Правильно для этого зарезервировано значение 0 (конечная точка EP0), служебный end-point , через который хост получает первичную информацию от других конечных точках. Как всегда все просто.

Допустим наш хост уже получил всю информацию о конечных точках , интерфейсах, конфигурациях через EP0.

Как происходит дальше работа на примере обычной клавиатуры

Хост долбит периодически PID IN по адресу устройства плюс Endpoint устройства (у нас EndP 0x01), который отвечает за прием данных от клавиатуры (IN для хоста).

фотка 3

Если никакая клавиша не нажата ведомый обязан ответить и отвечает NAK. Такие пакеты хост передает примерно 1 раз в 10ms и устройство если не нажата клавиша передает NAK.

А вот когда на клавиатуре нажимается какая-нибудь клавиша, ведомый ответит сначала DATA0 пакетом и следом пакет ACK.

фотка 4

Количество передаваемых байт в DATA0 зависит от типа клавиатуры, то есть каждый решает сколько использовать байт для передачи скан кода нажатой клавиши. Клавиатура сообщает по стандартному протоколу через EP0 о своих настройках.

Тут есть нюанс , что хост всегда посылает запрос устройству на конкретный EP. Если запрос идет на EP для передачи данных (у нас EP1 ) это одно , если запрос идет на служебный EP0 - это хост хочет подключить , настроить устройство. То есть хост всегда определяет логику обмена , а девайс обязан подстраиваться под запрос.

Вообще кто есть хост? Это драйвер например клавиатура или сетевого адаптера и у каждого драйвера соответственно свой протокол , своя логика.

Таким образом если вы разрабатываете USB устройство и ПК шлет вам все пакеты на EP0 , а до других EP не доходит дело, то значит что-то еще не закончено с настройками устройства, что-то хосту не нравится.

Хост вообще говоря может ждать ответ одновременно от 2 и более конечных точек . Это абсолютно нормально. Выглядит это в логах анализатора LA1010 примерно так:

Видно как хост тупо чередует EP0 и EP2.

Если не возникает какого-то прерывания у девайса

То есть если на шине пакеты бегут, а прерывание необходимое не возникает. Например тупо не возникает прерывание IN bulk у RNDIS адаптера (DataIn у EP2). То есть на шине вижу , что девайс отсылает NAK на IN EP2, но самого прерывания в девайсе не возникает.

Тут надо в регистры лезть и отсрочки уже не будет. Какие мысли возникают в первую очередь. Прерывания маскируются вроде (надо проверить).

Так как у нас есть один рабочий проект но без FreeRTOS , то сначала тупо начинаем сверять регистры USB ( OTG_FS_GLOBAL и OTG_FS_DEVICE ): после инициализации , после открытия конечных точек, после приема нужного пакета и т.д. Эти регистры кстати удобно просматривать на закладке SFRS (в Atollic true Studio), тут видна их внутренняя структура. И еще с момента последней точки остановки подсвечиваются изменения.

фотка 1

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

На самом деле не знач - не ведая мы подошли к главному моменту. Мы наконец-то обратили внимание на USBD_LL_Init, а точнее на загадочные функции HAL_PCDEx_SetRxFiFo(..) и HAL_PCDEx_SetTxFiFo(..) .

Момент истины

И выяснилось , что мы не понимаем и половины логики работы USB . Не зная регистры вообще нет возможности понять что делать. В данном случае HAL это вред.

Итак HAL_PCDEx_SetRxFiFo / HAL_PCDEx_SetTxFiFo создает таблицу во внутренней памяти контроллера USB. Да именно контроллера USB , а не контроллера STM32. Так как у STM32F имеется как-бы свой встроенный контроллер , отвечающий за USB. И у него есть своя память 512К, в которой надо создать таблицу с буферами приема / передачи для каждой конечной точки.

Где эта таблица, где ее адреса.

А вот сама структура USB_OTG_GlobalTypeDef .

HAL - кий код становится намного прозрачнее теперь.

Опять момент истины

Дальше , если интересно немного о передаваемых скан кода клавиатуры . Проводная клавиатура Low Speed

Скан коды USB HID клавиатур это не ASCII коды и не не коды PS/2 клавы.

Читайте также: