Главная » Настройки » Usb 2.0 описание. Технические характеристики Возможности usb. Контакты разъёма и разводка кабеля USB Type-C

Usb 2.0 описание. Технические характеристики Возможности usb. Контакты разъёма и разводка кабеля USB Type-C

USB (Universal Serial Bus - «универсальная последовательная шина») - последовательный интерфейс передачи данных для среднескоростных и низкоскоростных периферийных устройств. Для подключения используется 4-х проводный кабель, при этом два провода используются для приёма и передачи данных, а 2 провода - для питания периферийного устройства. Благодаря встроенным линиям питания USB позволяет подключать периферийные устройства без собственного источника питания.

Основные сведения

Кабель USB состоит из 4 медных проводников - 2 проводника питания и 2 проводника данных в витой паре, и заземленной оплётки (экрана).

Кабели USB имеют физически разные наконечники «к устройству» и «к хосту». Возможна реализация USB устройства без кабеля, со встроенным в корпус наконечником «к хосту». Возможно и неразъёмное встраивание кабеля в устройство (например, USB-клавиатура, Web-камера, USB-мышь) , хотя стандарт запрещает это для устройств full и high speed.

Шина USB строго ориентирована, т. е. имеет понятие «главное устройство» (хост, он же USB контроллер, обычно встроен в микросхему южного моста на материнской плате) и «периферийные устройства».

Устройства могут получать питание +5 В от шины, но могут и требовать внешний источник питания. Поддерживается и дежурный режим для устройств и разветвителей по команде с шины со снятием основного питания при сохранении дежурного питания и включением по команде с шины.

USB поддерживает «горячее» подключение и отключение устройств . Это возможно благодаря увеличения длинны проводника заземляющего контакта по отношению к сигнальным. При подключении разъёма USB первыми замыкаются заземляющие контакты , потенциалы корпусов двух устройств становятся равны и дальнейшее соединение сигнальных проводников не приводит к перенапряжениям, даже если устройства питаются от разных фаз силовой трёхфазной сети.

На логическом уровне устройство USB поддерживает транзакции приема и передачи данных. Каждый пакет каждой транзакции содержит в себе номер оконечной точки (endpoint) на устройстве. При подключении устройства драйверы в ядре ОС читают с устройства список оконечных точек и создают управляющие структуры данных для общения с каждой оконечной точкой устройства. Совокупность оконечной точки и структур данных в ядре ОС называется каналом (pipe) .

Оконечные точки , а значит, и каналы, относятся к одному из 4 классов:

1) поточный (bulk),

2) управляющий (control),

3) изохронный (isoch),

4) прерывание (interrupt).

Низкоскоростные устройства, такие, как мышь, не могут иметь изохронные и поточные каналы .

Управляющий канал предназначен для обмена с устройством короткими пакетами «вопрос-ответ». Любое устройство имеет управляющий канал 0, который позволяет программному обеспечению ОС прочитать краткую информацию об устройстве, в том числе коды производителя и модели, используемые для выбора драйвера, и список других оконечных точек.

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

Изохронный канал позволяет доставлять пакеты без гарантии доставки и без ответов/подтверждений, но с гарантированной скоростью доставки в N пакетов на один период шины (1 КГц у low и full speed, 8 КГц у high speed). Используется для передачи аудио- и видеоинформации.

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

Время шины делится на периоды, в начале периода контроллер передает всей шине пакет «начало периода». Далее в течение периода передаются пакеты прерываний, потом изохронные в требуемом количестве, в оставшееся время в периоде передаются управляющие пакеты и в последнюю очередь поточные.

Активной стороной шины всегда является контроллер, передача пакета данных от устройства к контроллеру реализована как короткий вопрос контроллера и длинный, содержащий данные, ответ устройства. Расписание движения пакетов для каждого периода шины создается совместным усилием аппаратуры контроллера и ПО драйвера, для этого многие контроллеры используют Прямой доступ к памяти DMA (Direct Memory Access ) - режим обмена данными между устройствами или же между устройством и основной памятью, без участия Центрального Процессора (ЦП). В результате скорость передачи увеличивается, так как данные не пересылаются в ЦП и обратно.

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


Технические характеристики

Возможности USB:

Высокая скорость обмена (full-speed signaling bit rate) - 12 Мб/с
- Максимальная длина кабеля для высокой скорости обмена - 5 м
- Низкая скорость обмена (low-speed signaling bit rate) - 1.5 Мб/с
- Максимальная длина кабеля для низкой скорости обмена - 3 м
- Максимум подключенных устройств (включая размножители) - 127
- Возможно подключение устройств с различными скоростями обмена
- Отсутствие необходимости в установке пользователем дополнительных элементов, таких как терминаторы для SCSI
- Напряжение питания для периферийных устройств - 5 В
- Максимальный ток потребления на одно устройство - 500 mA

Распайка разъема USB 1.1 и 2.0

Сигналы USB передаются по двум проводам экранированного четырёхпроводного кабеля.

Здесь:

GND - цепь «корпуса» для питания периферийных устройств
V BUS - +5V также для цепей питания
Шина D+ предназначена для передачи данных

Шина D- для приема данных.

Недостатки USB 2.0

Хотя максимальная скорость передачи данных USB 2.0 составляет 480 Мбит/с (60 Мбайт/с), в реальной жизни достичь таких скоростей нереально (~33,5 Мбайт/сек на практике). Это объясняется большими задержками шины USB между запросом на передачу данных и собственно началом передачи. Например, шина FireWire , хотя и обладает меньшей пиковой пропускной способностью 400 Мбит/с, что на 80 Мбит/с (10 Мбайт/с) меньше, чем у USB 2.0, в реальности позволяет обеспечить бо́льшую пропускную способность для обмена данными с жёсткими дисками и другими устройствами хранения информации. В связи с этим разнообразные мобильные накопители уже давно «упираются» в недостаточную практическую пропускную способность USB 2.0.

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

Существует ряд различных спецификаций USB . Началось все с USB 1.0 и USB 1.1 , затем интерфейс эволюционировал в USB 2.0 , относительно недавно появилась окончательная спецификация USB 3.0 . Но на данный момент наиболее распространенной является реализация USB 2. 0.

Ну и для начала основные моменты и характеристики. USB 2.0 поддерживает три режима работы:

  • High Speed – до 480 Мб/с
  • Full Speed – до 12 Мб/с
  • Low Speed – до 1.5 Мб/с

Командует на шине USB хост (например, ПК), к которому можно подключить до 127 различных устройств. Если этого мало, то нужно добавить еще один хост. Причем немаловажно, что устройство не может само послать/принять данные хосту/от хоста, необходимо, чтобы хост сам обратился к устройству.

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

Давайте немного отвлечемся и поговорим о “железной части” интерфейса.

Существуют два типа коннекторов – Type A и Type B.

Как уже понятно из рисунка Type A всегда обращен к хосту. Именно такие разъемы мы видим на компьютерах и ноутбуках. Коннекторы Type B всегда относятся к подключаемым USB-устройствам. Кабель USB состоит из 4 проводов разных цветов. Ну, собственно, красный – это питание (+5 В), черный – земля, белый и зеленый предназначены для передачи данных.

Помимо изображенных на рисунке, существуют также другие варианты исполнения USB-коннекторов, например, mini-USB и другие, ну это вы и так знаете 😉

Наверно стоит немного коснуться способа передачи данных, но углубляться в это не будем) Итак, при передаче данных по шине USB используется принцип кодирования NRZI (без возврата к нулю с инверсией). Для передачи логической “1” необходимо повысить уровень линии D+ выше +2.8 В, а уровень линии D- надо понизить ниже +0.3 В. Для передачи нуля ситуация противоположная – (D- > 2.8 В) и (D+ < 0.3 В).

Отдельно стоит обсудить питание устройств USB . И тут также возможно несколько вариантов.

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

  • Low-power
  • High-power

Разница тут заключается в том, что low-power устройства не могут потреблять больше, чем 100 мА . А устройства high-power должны потреблять не более 100 мА лишь на этапе конфигурации. После того, как они сконфигурированы хостом их потребление может составлять до 500 мА .

Кроме того, устройства могут иметь свой собственный источник питания. В этом случае они могут получать до 100 мА от шины, а все остальное забирать у своего источника)

С этим вроде бы все, давайте потихоньку переходить к структуре передаваемых данных. Все-таки это представляет для нас наибольший интерес 😉

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

Каждый кадр включает в себя пакет , затем следуют транзакции для разных конечных точек, ну и завершается все это пакетом EOF (End Of Frame). Если говорить совсем точно, то EOF – это не совсем пакет в привычном понимании этого слова – это интервал времени, в течение которого обмен данными запрещен.

Каждая транзакция имеет следующий вид:

Первый пакет (его называют Token пакет ) содержит в себе информацию об адресе устройства USB , а также о номере конечной точки, которой предназначена эта транзакция. Кроме того, в этом пакете хранится информация о типе транзакции (какие бывают типы мы еще обсудим, но чуть позже =)). – с ним все понятно, это данные, которые передают хост, либо конечная точка (зависит от типа транзакции). Последний пакет – Status – предназначен для проверки успешности получения данных.

Уже очень много раз прозвучало слово “пакет” применительно к интерфейсу USB , так что пора разобраться что он из себя представляет. Начнем с пакета Token :

Пакеты Token бывают трех типов:

  • Setup

Вот к чему я это рассказал..) В зависимости от типа пакета значение поля PID в Token пакете может принимать следующие значения:

  • Token пакет типа OUT – PID = 0001
  • Token пакет типа IN – PID = 1001
  • Token пакет типа SETUP – PID = 1101
  • Token пакет типа SOF – PID = 0101

Переходим к следующей составной части пакета Token – поля Address и Endpoint – в них содержатся адрес USB устройства и номер конечной точки , которой предназначена транзакция .

Ну и поле CRC – это контрольная сумма, с этим понятно.

Тут есть еще один важный момент. PID включает в себя 4 бита, но при передаче они дополняются еще 4-мя битами, которые получаются путем инвертирования первых 4-ых бит.

Итак, на очереди – то есть пакет данных.

Тут все в принципе так же, как и в пакете Token , только вместо адреса устройства и номера конечной точки здесь у нас передаваемые данные.

Осталось нам рассмотреть Status пакеты и пакеты SOF :

Тут PID может принимать всего лишь два значения:

  • Пакет принят корректно – PID = 0010
  • Ошибка при приеме пакета – PID = 1010

И, наконец, пакеты:

Здесь видим новое поле Frame – оно содержит в себе номер передаваемого кадра.

Давайте в качестве примера рассмотрим процесс записи данных в USB-устройство. То есть рассмотрим пример структуры кадра записи.

Кадр, как вы помните состоит из транзакций и имеет следующий вид:

Что представляют из себя все эти транзакции? Сейчас разберемся! Транзакция SETUP :

Транзакция OUT :

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

Транзакцию SETUP мы уже видели, посмотрим на транзакцию IN 😉

Как видите, все эти транзакции имеют такую структуру, как мы обсуждали выше)

В общем, думаю достаточно на сегодня 😉 Довольно-таки длинная статья получилась, надеюсь в ближайшее время попробуем реализовать интерфейс USB на практике!

Высокая скорость обмена (full-speed signaling bit rate) - 12 Мб/с - Максимальная длина кабеля для высокой скорости обмена - 5 м - Низкая скорость обмена (low-speed signaling bit rate) - 1.5 Мб/с - Максимальная длина кабеля для низкой скорости обмена - 3 м - Максимум подключенных устройств (включая размножители) - 127 - Возможно подключение устройств с различными скоростями обмена - Отсутствие необходимости в установке пользователем дополнительных элементов, таких как терминаторы для SCSI - Напряжение питания для периферийных устройств - 5 В - Максимальный ток потребления на одно устройство - 500 mA

Распайка разъема usb 1.1 и 2.0

Сигналы USB передаются по двум проводам экранированного четырёхпроводного кабеля.

Здесь:

GND - цепь «корпуса» для питания периферийных устройств V BUS - +5V также для цепей питания Шина D+ предназначена для передачи данных

Шина D- для приема данных.

Недостатки usb 2.0

Хотя максимальная скорость передачи данных USB 2.0 составляет 480 Мбит/с (60 Мбайт/с), в реальной жизни достичь таких скоростей нереально (~33,5 Мбайт/сек на практике). Это объясняется большими задержками шины USB между запросом на передачу данных и собственноначалом передачи. Например, шина FireWire, хотя и обладает меньшей пиковой пропускной способностью 400 Мбит/с, что на 80 Мбит/с (10 Мбайт/с) меньше, чем у USB 2.0, в реальности позволяет обеспечить бо́льшую пропускную способность для обмена данными с жёсткимидисками и другими устройствами хранения информации. В связи с этим разнообразные мобильные накопители уже давно «упираются»в недостаточную практическую пропускную способность USB 2.0.

Самым существенным преимуществом USB 3.0 является более высокая скорость (до 5 Гбит/с), которая в 10 раз выше скорости более устаревшего порта. У нового интерфейса улучшено энергосбережение. Это позволяет накопителю переходить в спящий режим при бездействии. Можно осуществить двустороннюю передачу данных одновременно. Это даст более высокую скорость, если на один порт подключить несколько устройств (разветвить порт). Разветвить можно с помощью хаба (хаб – устройство, которое из одного порта разветвляет на 3-6 портов). Вот если подключить хаб к порту USB 3.0, а к хабу подключите несколько устройств (например, флешек) и осуществите одновременную передачу данных, то вы увидите, что скорость будет значительно больше, чем было при интерфейсе USB 2.0. Есть характеристика, которая может являться плюсом и минусом. В интерфейсе USB 3.0 была повышена сила тока до 900 мА, а USB 2.0 работает с силой тока в 500 мА. Это будет плюсом для тех устройств, которые были адаптированы под USB 3.0, ну а небольшой минус состоит в том, что может возникать риск при подзарядке более слабых устройств, как телефон. Физическим недостатком нового интерфейса является размеры кабеля. Для поддержания высокой скорости кабель стал более толстым и по длине более коротким (не может быть длиннее 3 метров), чем USB 2.0. Следует отметить важное, что устройства с разными USB интерфейсами будут работать хорошо и не должно возникнуть проблем. Но не думайте, что скорость «разгонится», если вы подключите USB 3.0 к более устаревшему порту, или подключите к новому порту кабель устаревшего интерфейса. Скорость передачи данных будет равна скорости самого слабого порта.

  • Tutorial

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

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

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

Не сильно полезный стек USB


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

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

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

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

Очередной флэшбэк из девяностых

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


Хотим мы этого или нет, но эволюция микроконтроллеров на месте стоять явно не собирается. Нет, нет, да и мелькнёт в публикациях (http://habrahabr.ru/post/208026/ , http://habrahabr.ru/post/233391/) «тяжёлая периферия» - вмонтированные в МК реализации шины USB, с разборами примеров, использованием HID и т.п. Надо воздать должное автору RaJa : из восьми примеров, приведённых в стандартной библиотеке STSW-STM32121 (UM0424) и кое-как , он выбрал самый полезный (Custom HID), портировал его в бесплатную среду Em::Blocks, изложил понятным языком, немного приукрасил, браво! Это сэкономило мне уйму времени.

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

Получив на 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 портов с неприличной скоростью, и всех функций тут просто не перечислить… спрашивай отдельно по каждому пункту; ах, да загрузка процессора такая-то, памяти столько-то…». И ещё на дюжину страниц в таком же духе.

Понравилась мне идея HID. Но стоило выйти из Windows за рамки учебных задач мигания светодиодами (вперёд к реальным окружениям UNIX!), как начало сквозить из всех незаделанных щелей , и я почувствовал себя каким-то беспомощным ламером. Отлаживая проект, я инстинктивно схватился за некое подобие tcpdump (так и называется: usbdump(8) , или usbmon), но увидел лишь сообщения на незнакомом языке.

Стало очевидно: не хватает фундаментальных знаний о шине USB. Если модель OSI и стек TCP/IP любой тёртый айтишник осознаёт где-то на уровне спинного мозга просто в силу необходимости, то с USB ситуация другая. Оно и понятно: там можно (нужно) подсмотреть трафик через тот же tcpdump да настроить железо с софтом, а тут полный plug and play, и исправить что-то можно, обновив драйвер или прошивку (или переустановив ОС). Но ведь мы тут с вами собрались как раз за тем, чтобы делать хорошие прошивки, не так ли? Почитав некоторые описания USB в сети, я был удивлён, насколько запутанной может быть документация. У меня даже возникло ощущение, что нас специально хотят сбить с пути истинного, напустив туману и избавившись от конкуренции в зародыше. Я не согласен с таким положением вещей!

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

На просторах сети встретил ещё такую иллюстрацию (лежало в формате 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 (крупноблочные), общение через гарнитуры и веб-камеры (изохронные) и многие другие замечательные вещи.
Последний штрих
Сбежав на секунду вниз по уровням, можно добавить, что хост периодически вбрасывает по шине те самые пакеты Start of Frame (SOF), разбивая время на равные интервалы, но так, чтобы не разбить при этом сами транзакции. Поэтому пакеты SOF можно считать самостоятельными транзакциями. Не следует путать кадр (фрейм) USB с омонимом канального уровня модели OSI. Лучше уж вспомнить кадры (фреймы) аудио CD, это просто квант времени: хост «тикает» в шину пакетами SOF, чтобы подключённые устройства заранее планировали участие в т.н. изохронных передачах , гоняющих потоки данных в реальном времени. Ну или вот так: группы транзакций планируются хостом по временным интервалам, именуемым кадрами. Кадр составляет 1мс на Full Speed и 125мкс на High Speed USB, но High Speed - более сложный стандарт, его лучше изучать отдельно.
UPD:
Хороший вопрос задали читатели: а как насчёт фрагментации? Я не нашёл в USB 2.0 признаков фрагментации на уровне транзакций и ниже, т.е. транзакции для того и есть, чтобы передаваться целиком. Передачи же в ряде случаев могут и должны разбиваться на несколько транзакций, особенно с учётом изохронных режимов. И я повторю, что всем планированием у нас пока заведует хост (на стороне МК меньше думать приходится).

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

Хорошая подборка иллюстраций есть в упомянутой книжке USB Made Simple, глава 5: www.usbmadesimple.co.uk/ums_5.htm

Вот одна из них


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

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

Чтобы по одной паре проводов можно было гнать копирование с диска одновременно с аудио-видео потоком, жестами мышью и сигналом скоростного осциллографа, существуют разные типы сообщений и передач.
Чуть выше я только что описал простой потоковый канал (Stream Pipe) между хостом и оконечной точкой, где пакеты с начинкой (группы Data) не несут никакой специальной или управляющей информации самой подсистеме USB. Полная свобода переписки, библиотека контроллера должны предоставлять примитивы для закачки буфера произвольного размера из памяти МК хосту или обратно. Нарезкой на пакеты, пересылкой и «дефрагментацией» пусть занимаются библиотека МК на пару с драйвером хоста. В STM32 это USB_SIL_Write() и USB_SIL_Read(), описаны в UM0424. Они и есть тот самый логический уровень абстракции. На стороне хоста см. описание соответствующего драйвера (например, во FreeBSD это ugen(4)).
Однако использовать тяжёлую периферию вроде USB для организации простого потокового канала я считаю кощунством (спрашивается: чем USART не угодил?). Но ситуации, конечно, бывают всякие.
В любом случае, чтобы подсистема USB вообще ожила и устройство определилось, требуется обмен контрольными транзакциями.

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, но его ведь хрен отформатируешь:-)

Контрольные передачи и каналы сообщений
Думая про USB, вспоминаю добрый старый протокол PPP с его LCP , IPCP , CCP и ещё хзCP . Обмен хоста с оконечной точкой №0 сообщениями особого вида и есть местный эквивалент xзCP.
Через контрольные передачи устройство инициализируется, получает адрес, рассказывает о себе хосту на языке дескрипторов (чтобы тот подыскал и активировал нужный драйвер). Без контрольных операций не «поедут» и простые потоковые передачи, если устройство не ответит по форме, хост поскорее заглушит порт: протокол надо соблюдать.
В принципе, протокол не запрещает повесить на контрольную точку №0 и обмен данными, аналогично режиму с прерываниями. Заодно задумайтесь: как будете обновлять прошивку МК, так сказать, в полевых условиях? Программатор наготове держать? Есть и другое решение.
Пример: Device firmware upgrade
Передачи с прерываниями
Эта разновидность (interrupt transfer ) предназначена для обмена небольшими транзакциями, сходными с контрольными. Нет, устройство не может прерывать хоста, оно ждёт опроса, их частота и размеры пакетов оговариваются заранее в дескрипторе устройства. Хорошо подходят для всевозможных пультов, датчиков, сенсоров, мышек, светодиодов и прочих HID-кофеварок. Канал с прерываниями каждой точки однонаправленный.
Примеры: Custom HID , Joystick mouse , Virtual COM port
Передачи изохронные
Χρόνος по-гречески значит «время». Изохронная передача (isochronous transfer ) - местный хайтек, позволяющий управлять потоками данных в реальном времени. Отличается гарантированной (но необязательно широкой) полосой пропускания и отсутствием подтверждающих транзакций, почти как UDP с QoS. Битый пакет? Это бог Хронос толкнул МК по ноге. Не надо пытаться отправить пакет заново, иначе бог огорчится. Контрольные суммы, тем не менее, проверяем втихую от Хроноса. Изохронные передачи хороши для аудио-видео и измерительных систем реального времени, а также прочих игрушек двойного назначения . Хотя на некоторые из них м.б. интереснее повесить какой-нибудь AVR, связав его с нашим ARM по USART или SPI. Изохронные операции участвуют во фреймовой сигнализации (вспомним про тиканье пакетом SOF).
Пример: USB voice speaker
Передачи крупноблочные
Нет, мешки с цементом таскать не будем. Я думаю, все узнали режим работы всевозможных накопителей USB. Передачи bulk transfer имеют цель отправить данных как можно больше и быстрее, обязательно с пересылкой битых пакетов, но без гарантий по полосе пропускания, уступая её изохронным передачам при необходимости (как в TCP без QoS). О внутреннем устройстве USB флэшек я как-то уже рассказывал , теперь можно скачать и запустить действующий прототип. Я сам его не пробовал, но таблица команд SCSI в описании примера (как-бы, между прочим) весьма символизирует. Признаков алгоритма управления износом для NAND-памяти я не нашёл:-)
ВНИМАНИЕ: местами действует патентная защита STM.
Пример: Mass storage

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

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

Ссылки

Адаптация примера Custom HID к бесплатной среде Em::Blocks и бюджетной демо-плате STM32F103C8T6 производства LC-Tech Промэлектронщики и Айтишники . Это своего рода инженерный Инь и Ян, в каждом из нас есть доля того и другого.

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

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

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

Добавить метки
  • Mini-B Connector ECN : извещение выпущено в октябре 2000 года.
  • Errata, начиная с декабря 2000 : извещение выпущено в декабре 2000 года.
  • Pull-up/Pull-down Resistors ECN
  • Errata, начиная с мая 2002 : извещение выпущено в мае 2002 года.
  • Interface Associations ECN : извещение выпущено в мае 2003 года.
    • Были добавлены новые стандарты, позволяющие ассоциировать множество интерфейсов с одной функцией устройства.
  • Rounded Chamfer ECN : извещение выпущено в октябре 2003 года.
  • Unicode ECN : извещение выпущено в феврале 2005 года.
    • Данное ECN специфицирует, что строки закодированы с использованием UTF-16LE .
  • Inter-Chip USB Supplement : извещение выпущено в марте 2006 года.
  • On-The-Go Supplement 1.3 : извещение выпущено в декабре 2006 года.
    • USB On-The-Go делает возможным связь двух USB-устройств друг с другом без отдельного USB-хоста. На практике одно из устройств играет роль хоста для другого.

USB OTG

USB 3.0

USB 3.0 находится на финальных стадиях разработки. Созданием USB 3.0 занимаются компании: Microsoft, Texas Instruments, NXP Semiconductors. В спецификации USB 3.0 разъёмы и кабели обновлённого стандарта будут физически и функционально совместимы с USB 2.0. Кабель USB 2.0 содержит в себе четыре линии - пару для приёма/передачи данных, одну - для питания и ещё одну - для заземления. В дополнение к ним USB 3.0 добавляет пять новых линий (в результате чего кабель стал гораздо толще), однако новые контакты расположены параллельно по отношению к старым на другом контактном ряду. Теперь можно будет с лёгкостью определить принадлежность кабеля к той или иной версии стандарта, просто взглянув на его разъём. Спецификация USB 3.0 повышает максимальную скорость передачи информации до 4,8 Гбит/с - что на порядок больше 480 Мбит/с, которые может обеспечить USB 2.0. USB 3.0 может похвастаться не только более высокой скоростью передачи информации, но и увеличенной силой тока с 500 мА до 900 мА. Отныне пользователь сможет не только подпитывать от одного хаба гораздо большее количество устройств, но и само аппаратное обеспечение, ранее поставлявшееся с отдельными блоками питания, избавится от них.


Здесь GND - цепь «корпуса» для питания периферийных устройств, VBus - +5 В, так же для цепей питания. Данные передаются по проводам D+ и D− дифференциально (состояния 0 и 1 (в терминологии официальной документации diff0 и diff1 соответственно) определяются по разности потенциалов межу линиями более 0,2 В и при условии, что на одной из линий (D− в случае diff0 и D+ при diff1) потенциал относительно GND выше 2,8 В. Дифференциальный способ передачи является основным, но не единственным (например, при инициализации устройство сообщает хосту о режиме, поддерживаемом устройством (Full-Speed или Low-Speed), подтягиванием одной из линий данных к V_BUS через резистор 1.5 кОм (D− для режима Low-Speed и D+ для режима Full-Speed, устройства, работающие в режиме Hi-Speed, ведут себя на этой стадии как устройства в режиме Full-Speed). Так же иногда вокруг провода присутствует волокнистая обмотка для защиты от физических повреждений. .

Коннектор USB 3.0 тип B

Коннектор USB 3.0 тип А

Кабели и разъёмы USB 3.0

Недостатки USB

Хотя пиковая пропускная способность USB 2.0 составляет 480 Мбит/с (60 Мбайт/с), на практике обеспечить пропускную способность, близкую к пиковой, не удаётся. Это объясняется достаточно большими задержками шины USB между запросом на передачу данных и собственно началом передачи. Например, шина FireWire хотя и обладает меньшей пиковой пропускной способностью 400 Мбит/с, что на 80 Мбит/с меньше, чем у USB 2.0, в реальности позволяет обеспечить бо́льшую пропускную способность для обмена данными с жёсткими дисками и другими устройствами хранения информации.

USB и FireWire/1394

Протокол USB storage, представляющий собой метод передачи команд

Кроме того, USB storage не поддерживался в старых ОС (первоначальная Windows 98), и требовал установки драйвера. SBP-2 поддерживался и в них. Также в старых ОС (Windows 2000) протокол USB storage был реализован в урезанном виде, не позволяющем использовать функцию прожига CD/DVD дисков на подключенном по USB дисководе, SBP-2 никогда не имел таких ограничений.

Шина USB строго ориентирована, потому соединение 2 компьютеров или же 2 периферийных устройств требует дополнительного оборудования. Некоторые производители поддерживают соединение принтера и сканера, или же фотоапарата и принтера, но эти реализации сильно завязаны на конкретного производителя и не стандартизированы. Шина 1394/FireWire не подвержена этому недостатку (можно соединить 2 видеокамеры).

Тем не менее, ввиду лицензионной политики Apple, а также намного более высокой сложности оборудования, 1394 менее распространен, материнские платы старых компьютеров не имеют 1394 контроллера. Что касается периферии, то поддержка 1394 обычно не встречается ни в чем, кроме видеокамер и корпусов для внешних жестких дисков и CD/DVD приводов.

См. также

  • FireWire
  • TransferJet

Источники

Ссылки

  • USB News (нем.)


Предыдущая статья: Следующая статья:

© 2015 .
О сайте | Контакты
| Карта сайта