Основи на USB интерфейса. USB режими на трансфер на универсална серийна шина в примери STM32 USB FS

18.03.2024

В края на 2008г. Както може да очаквате, новият стандарт е увеличил пропускателната способност, въпреки че увеличението не е толкова значително, колкото 40-кратното увеличение на скоростта при преминаване от USB 1.1 към USB 2.0. Във всеки случай 10-кратното увеличение на пропускателната способност е добре дошло. USB 3.0поддържа максимална скорост на трансфер от 5 Gbit/s.Пропускателната способност е почти два пъти по-висока от съвременния стандарт Serial ATA (3 Gbit/s, като се вземе предвид прехвърлянето на излишна информация).

Лого на USB 3.0

Всеки ентусиаст ще потвърди, че интерфейсът USB 2.0 е основното тясно място на съвременните компютри и лаптопи, тъй като пиковата му „нетна“ пропускателна способност варира от 30 до 35 MB/s. Но съвременните 3,5" твърди дискове за настолни компютри вече имат скорости на трансфер над 100 MB/s (появяват се и 2,5" модели за лаптопи, които се доближават до това ниво). Високоскоростните SSD устройства успешно надминаха прага от 200 MB/s. А 5 Gbit/s (или 5120 Mbit/s) съответства на 640 MB/s.

Не смятаме, че твърдите дискове ще се доближат до 600 MB/s в обозримо бъдеще, но следващото поколение SSD може да надхвърли този брой само след няколко години. Увеличаването на пропускателната способност става все по-важно, тъй като количеството информация се увеличава и съответно времето, необходимо за нейното архивиране, се увеличава. Колкото по-бързо работи хранилището, толкова по-кратко ще бъде времето за архивиране, толкова по-лесно ще бъде създаването на „прозорци“ в графика за архивиране.

Таблица за сравнение на скоростта на USB 1.0 – 3.0

Цифровите видеокамери днес могат да записват и съхраняват гигабайти видео данни. Делът на HD видеокамерите се увеличава и те изискват по-голямо и по-бързо съхранение за запис на големи количества данни. Ако използвате USB 2.0, тогава прехвърлянето на няколко десетки гигабайта видео данни към компютър за редактиране ще изисква значително време. Форумът на USB Implementers вярва, че честотната лента ще остане фундаментално важна и USB 3.0ще бъде достатъчно за всички потребителски устройства през следващите пет години.

8/10 битово кодиране

За осигуряване на надежден трансфер на данни USB 3.0 интерфейсизползва 8/10 битово кодиране, познато ни, например, от Serial ATA. Един байт (8 бита) се предава с помощта на 10-битово кодиране, което подобрява надеждността на предаването за сметка на пропускателната способност. Следователно преходът от битове към байтове се извършва в съотношение 10:1 вместо 8:1.

Сравнение на честотната лента на USB 1.x – 3.0 и конкурентите

Режими за пестене на енергия

със сигурност основна целинтерфейс USB 3.0 е да се увеличи наличната честотна лента, обаче, новият стандарт ефективно оптимизира консумацията на енергия. Интерфейсът USB 2.0 непрекъснато проверява за наличност на устройството, което консумира енергия. За разлика от тях, USB 3.0 има четири състояния на връзка, наречени U0-U3. Състоянието на връзка U0 съответства на активен трансфер на данни, а U3 поставя устройството в „заспиване“.

Ако връзката е неактивна, тогава в състояние U1 възможността за получаване и предаване на данни ще бъде деактивирана. State U2 отива една крачка напред, като деактивира вътрешния часовник. Съответно, свързаните устройства могат да преминат към състояние U1 веднага след завършване на прехвърлянето на данни, което се очаква да осигури значителни предимства в консумацията на енергия в сравнение с USB 2.0.

По-висок ток

В допълнение към различните състояния на консумация на енергия, стандартът USB 3.0 е различенот USB 2.0 и по-висок поддържан ток. Ако USB 2.0 осигури праг на тока от 500 mA, тогава в случая на новия стандарт ограничението беше изместено до 900 mA. Токът на иницииране на връзката е увеличен от 100 mA за USB 2.0 на 150 mA за USB 3.0. И двата параметъра са доста важни за преносимите твърди дискове, които обикновено изискват малко по-високи токове. Преди това проблемът можеше да бъде решен чрез използване на допълнителен USB щепсел, черпейки енергия от два порта, но използвайки само един за пренос на данни, въпреки че това нарушаваше спецификациите на USB 2.0.

Нови кабели, конектори, цветово кодиране

Стандартът USB 3.0 е обратно съвместим с USB 2.0, т.е. щепселите изглеждат същите като обикновените щифтове тип A остават на същото място, но сега има пет нови щифта, разположени дълбоко в конектора. Това означава, че трябва да поставите USB 3.0 щепсела докрай в USB 3.0 порта, за да осигурите работа с USB 3.0, което изисква допълнителни щифтове. В противен случай ще получите USB 2.0 скорост. Форумът на USB Implementers препоръчва на производителите да използват цветово кодиране Pantone 300C от вътрешната страна на конектора.

Ситуацията беше подобна за USB тип B щепсел, въпреки че разликите са визуално по-забележими. USB 3.0 щепселът може да бъде идентифициран чрез пет допълнителни щифта.

USB 3.0 не използва оптични влакна, защото е твърде скъпо за масовия пазар. Следователно пред нас е добрият стар меден кабел. Сега обаче ще има девет, а не четири проводника. Предаването на данни се извършва по четири от петте допълнителни проводника в диференциален режим (SDP–Shielded Differential Pair). Едната двойка проводници е отговорна за получаване на информация, а другата за предаване. Принципът на работа е подобен на Serial ATA, като устройствата получават пълна честотна лента и в двете посоки. Петият проводник е „маса“.

USB (Универсална серийна шина- „универсална серийна шина“) - сериен интерфейс за пренос на данни за средноскоростни и нискоскоростни периферни устройства.За връзка се използва 4-жилен кабел, като два проводника служат за приемане и предаване на данни, а 2 проводника за захранване на периферното устройство. Благодарение на вградените захранващи линии, USB ви позволява да свързвате периферни устройства без собствено захранване.

Основи

USB кабелсе състои от 4 медни проводника - 2 захранващи проводника и 2 проводника за данни в усукана двойка и заземена оплетка (екран).

USB кабелиимат физически различни съвети „към устройството“ и „към хоста“. Възможно е внедряване на USB устройство без кабел, с вграден в корпуса накрайник “to-host”. Също така е възможно кабелът да се интегрира постоянно в устройството(например USB клавиатура, уеб камера, USB мишка), въпреки че стандартът забранява това за устройства с пълна и висока скорост.

USB шинатя е строго ориентирана, т.е. има концепцията за „основно устройство“ (хост, известен също като USB контролер, обикновено вграден в чипа на южния мост на дънната платка) и „периферни устройства“.

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

USB поддържаГорещо включване и изключване на устройства. Това е възможно благодарение на увеличаването на дължината на заземителния контактен проводник спрямо сигналните. Когато е свързан USB конекторса първите, които затварят заземителни контакти, потенциалите на корпусите на двете устройства се изравняват и по-нататъшното свързване на сигналните проводници не води до пренапрежения, дори ако устройствата се захранват от различни фази на трифазна мрежа.

На логическо ниво USB устройството поддържа транзакции за пренос и получаване на данни. Всеки пакет от всяка транзакция съдържа номер крайна точкана устройството. Когато дадено устройство е свързано, драйверите в ядрото на ОС четат списък с крайни точки от устройството и създават структури от контролни данни, за да комуникират с всяка крайна точка на устройството. Извиква се колекцията от крайни точки и структури от данни в ядрото на ОС тръба.

Крайни точкии следователно каналите принадлежат към един от 4 класа:

1) поток (насипно състояние),

2) мениджър (контрол),

3) изохронен (изох),

4) прекъсване.

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

Контролен каналпредназначени за обмен на кратки пакети въпроси-отговори с устройството. Всяко устройство има контролен канал 0, който позволява на софтуера на операционната система да чете кратка информация за устройството, включително кодовете на производителя и модела, използвани за избор на драйвер, и списък с други крайни точки.

Прекъсване на каналави позволява да доставяте кратки пакети в двете посоки, без да получавате отговор/потвърждение, но с гаранция за време за доставка - пакетът ще бъде доставен не по-късно от N милисекунди. Например, използвани в устройства за въвеждане (клавиатури, мишки или джойстици).

Изохронен каналви позволява да доставяте пакети без гаранция за доставка и без отговори/потвърждения, но с гарантирана скорост на доставка от N пакета за период на автобус (1 KHz за ниска и пълна скорост, 8 KHz за висока скорост). Използва се за предаване на аудио и видео информация.

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

Времето на автобусае разделен на периоди, като в началото на периода контролерът предава пакета „начало на периода“ към цялата шина. След това през периода се предават пакети за прекъсване, след това изохронни в необходимото количество за оставащото време в периода се предават пакети за управление и накрая пакети за поток.

Активна страна на автобусавинаги е контролерът, прехвърлянето на пакет данни от устройството към контролера се реализира като кратък въпрос от контролера и дълъг отговор от устройството, съдържащо данни. Графикът за движение на пакети за всеки период на шина се създава съвместно от хардуера на контролера и софтуера на драйвера за това, което използват много контролери Директен достъп до паметта DMA (Директен достъп до паметта) - режим на обмен на данни между устройства или между устройството и основната памет, без участие Централен процесор(CPU). В резултат на това скоростта на трансфер се увеличава, тъй като данните не се изпращат напред-назад към процесора.

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


Спецификации

USB възможности:

Висока скорост на трансфер (битрейт на сигнализиране при пълна скорост) - 12 Mb/s
- Максимална дължина на кабела за висока скорост на трансфер - 5м
- Нискоскоростна сигнализация битрейт - 1.5 Mb/s
- Максимална дължина на кабела за ниска скорост на предаване - 3м
- Максимален брой свързани устройства (включително умножители) - 127
- Възможно е да се свързват устройства с различни скорости на предаване
- Няма нужда потребителят да инсталира допълнителни елементи като SCSI терминатори
- Захранващо напрежение за периферни устройства - 5 V
- Максимална консумация на ток на устройство - 500 mA

Окабеляване на конектор USB 1.1 и 2.0

USB сигналите се предават по два проводника на екраниран четирижилен кабел.

тук :

GND- схема “корпус” за захранване на периферни устройства
V АВТОБУС- +5V също и за захранващи вериги
Гума D+предназначен за предаване на данни

Гума Д-за получаване на данни.

Недостатъци на USB 2.0

Въпреки че максималната скорост на трансфер на данни на USB 2.0 е 480 Mbps (60 MB/s), в реалния живот е нереалистично да се постигнат такива скорости (~33,5 MB/s на практика). Това се дължи на големите закъснения по USB шината между заявката за трансфер на данни и действителното начало на трансфера. Например шината FireWire, въпреки че има по-ниска пикова пропускателна способност от 400 Mbps, което е с 80 Mbps (10 MB/s) по-малко от USB 2.0, всъщност позволява по-голяма пропускателна способност на трансфер на данни към твърди дискове и други устройства за съхранение. В това отношение различните мобилни устройства отдавна са ограничени от недостатъчната практическа честотна лента на USB 2.0.

Високоскоростен битрейт на сигнализиране - 12 Mb/s - Максимална дължина на кабела за високоскоростно сигнализиране на битрейт - 5 m - Нискоскоростно сигнализиране на битрейт - 1,5 Mb/s - Максимална дължина на кабела за нискоскоростно сигнализиране на битрейт - 3 m - Максимален брой свързани устройства (включително умножители) - 127 - Възможно е свързване на устройства с различни скорости на предаване - Няма нужда потребителят да инсталира допълнителни елементи като терминатори за SCSI - Захранващо напрежение за периферни устройства - 5 V - Максимална консумация на ток на устройство - 500 mA

Окабеляване на конектор USB 1.1 и 2.0

USB сигналите се предават по два проводника на екраниран четирижилен кабел.

тук :

GND- схема “корпус” за захранване на периферни устройства V АВТОБУС- +5V и за захранващи вериги Bus D+предназначен за предаване на данни

Гума Д-за получаване на данни.

Недостатъците на usb 2.0

Въпреки че максималната скорост на трансфер на данни на USB 2.0 е 480 Mbps (60 MB/s), в реалния живот е нереалистично да се постигнат такива скорости (~33,5 MB/s на практика). Това се дължи на големите закъснения по USB шината между заявката за трансфер на данни и действителното начало на трансфера. Например шината FireWire, въпреки че има по-ниска пикова пропускателна способност от 400 Mbps, което е с 80 Mbps (10 MB/s) по-малко от USB 2.0, всъщност позволява по-голяма пропускателна способност за обмен на данни с твърди дискове и други устройства за съхранение устройства. В това отношение различните мобилни устройства отдавна са ограничени от недостатъчната практическа честотна лента на USB 2.0.

Най-същественото предимство на USB 3.0 е неговата по-висока скорост (до 5 Gbps), която е 10 пъти по-бърза от по-стария порт. Новият интерфейс е с подобрено енергоспестяване. Това позволява на устройството да премине в режим на заспиване, когато не се използва. Възможно е едновременно двупосочно предаване на данни. Това ще даде по-висока скорост, ако свържете няколко устройства към един порт (разделете порта). Можете да разклоните с помощта на хъб (хъбът е устройство, което се разклонява от един порт на 3-6 порта). Сега, ако свържете хъба към USB 3.0 порт и свържете няколко устройства (например флаш устройства) към хъба и извършите едновременно прехвърляне на данни, ще видите, че скоростта ще бъде много по-висока, отколкото беше с USB 2.0 интерфейс. Има характеристика, която може да бъде плюс и минус. Интерфейсът USB 3.0 е увеличил тока до 900 mA, а USB 2.0 работи с ток от 500 mA. Това ще бъде плюс за тези устройства, които са адаптирани за USB 3.0, но малък минус е, че може да има риск при зареждане на по-слаби устройства, като телефон. Физическият недостатък на новия интерфейс е размерът на кабела. За да се поддържа висока скорост, кабелът е станал по-дебел и по-къс (не може да бъде по-дълъг от 3 метра) от USB 2.0. Важно е да се отбележи, че устройства с различни USB интерфейси ще работадобре и не би трябвало да е проблем. Но не мислете, че скоростта ще се увеличи, ако свържете USB 3.0 към по-стар порт или свържете по-стар интерфейсен кабел към нов порт. Скоростта на трансфер на данни ще бъде равна на скоростта на най-слабия порт.

  • Урок

Илюстрирана проекция на мрежовия модел OSI върху универсалната серийна шина.

Три "забележителни" нива на USB стека

Не бях доволен от външния вид на USB стека, който може да се намери най-често в интернет:

Не много полезен USB стек


Ниво на шина, логично, функционално... Това, разбира се, са прекрасни абстракции, но те са по-вероятни за тези, които ще направят драйвер или приложен софтуер за хоста. От страна на микроконтролера очаквам шаблонна крайна машина, в чиито възли обикновено вграждаме нашия полезен код, и в началото той, според всички закони на жанра, ще се провали. Или софтуерът на хоста ще работи с проблеми. Или шофьор. Във всеки случай някой ще се провали. Също така е невъзможно веднага да разберете MK библиотеките. И така гледам трафика по USB шината с анализатор, където събитията протичащи на непознат език с три прекрасни нива изобщо не се вписват. Чудя се дали имам такъв дисонанс в главата заради грипната треска?

Ако читателят е имал подобни чувства, предлагам алтернативна визия за USB стек, която внезапно ми се появи в прегрятия ми мозък, базирана на любимия 7-слоен OSI модел. Ограничих се до пет нива:

Не искам да кажа, че целият софтуер и библиотеки вече са направени или трябва да бъдат проектирани въз основа на този модел. По инженерни причини кодът с нива ще бъде силно смесен. Но искам да помогна на тези, които започват да се запознават с USB шината, които искат да разберат протоколите за обмен на устройства и терминологията на домейна, да се доближат до готови примери, библиотеки и да се ориентират по-добре в тях. Този модел не е за зареждане в MK, а във вашите блестящи умове, скъпи приятели. И тогава вашите златни ръце ще направят всичко сами, не се съмнявам :)

Така че, да вървим, коригирайте, ако видите грешки. Това е чернова и ако някъде вече е нарисувано нещо подобно, моля да ме извините, не можах да го намеря, затова го направих сам. Мисля, че снимката няма да избяга, но засега ще обясня на уважаемата публика защо започнах тази публикация.

Още един ретроспекция от деветдесетте

Изтърсих първия си бъг от кода на някой друг в края на деветдесетте години, докато работех като студент като студент. Беше pppd за FreeBSD, който след това инсталирахме на модемния пул. Модемите на Motorola бяха блокирани при прекъсване, никой не можеше да се свърже, линията беше изгубена напразно и единственият останал метод чрез PPP keep-alive беше по някаква причина бъгове. Тогава разбрах, че по някаква причина pppd чакаше шест LCP байта за отговор вместо необходимите четири. Чувствах се толкова луд тогава шейкър за грешкиот деветдесетте :-) Какво общо има ПЧП? Просто е подобно на USB: пакетно и от точка до точка. Вярно е, че за разлика от USB 2.0, той е пълен дуплекс.


Независимо дали ни харесва или не, еволюцията на микроконтролерите очевидно няма да спре. Не, не, и ще се появи в публикации (http://habrahabr.ru/post/208026/, http://habrahabr.ru/post/233391/) „тежки периферни устройства“ - реализации на USB шина, вградени в MK, с примери за анализ, използване на HID и др. Трябва да отдадем почит на автора на RaJa: от осем примера, дадени в стандартната библиотека STSW-STM32121 (UM0424) и по някакъв начин, той избра най-полезния (Custom HID), пренесе го в безплатната среда Em::Blocks, представи го на разбираем език, и малко го разкраси, браво! Това ми спести много време.

Как да стигна до библиотеката?

След като получих проекта RHIDDemo за Em::Blocks, любезно публикуван в GitHub от автора, започнах да го пренасям към Keil (моят базиран на FTDI CoLink дебъгер; някой да ми каже плъгина Coocox за Em::Blocks). Но просто не можах да разбера: откъде, по дяволите, авторът е взел SPL 3.6.1 от 2012 г., ако сайтът е публикувал 3.5.0 от 2011 г.? Минах през доста скучен куест, който за моя изненада доведе... направо до готов Custom HID проект за Keil като част от библиотеката USB FS 4.0.0. Лежи пред очите, като мишка под метла. О, добре. Но най-накрая стигнах до версиите на STMicroelectronics, намерих описание на библиотеката STSW-STM32121 (UM0424) USB FS и спрях опитите на разработчика да ме подлуди. Кажете ми, нормално ли е да поставите ретро 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, свързани със сигналите за препълване на буфера. Благодаря ви, поне оставиха бележки за изданието...

HID срещу SNMP

И така, след като взех STM32F103C8T6, реших също да се задълбоча малко в темата за USB HID, USB HID абстракцията се вписва много добре в концепцията за всички видове сензори, сензори и други PWM-контролирани захранващи драйвери. По някакъв начин ми напомни за SNMP, само че в много опростена форма: HID дескрипторите играят ролята на SNMP MIB. Когато устройството се инициализира от хоста: „Здравей, хост! Аз съм кафеварка. Имам [старт] бутон, [крем], [захар] контроли, [остатъчно кафе], [остатъчна вода], [остатъчна захар], [остатъчна сметана]. Вдигнете шофьорите, натиснете бутона, да пием кафе. Нищо не ти напомня? Пример за SNMP диалог: „Е, здравейте, станция за управление със софтуер за $100 000. И имам шаси за превключвател за $200 000 и имам още 4 модула върху него за $100 000 на брой; всеки има още 16 порта с неприлична скорост и е просто невъзможно да се изброят всички функции тук... попитайте отделно за всеки елемент; о, да, натоварването на процесора е такова и такова, паметта е такова и такова...” И още дузина страници в същия дух.

Хареса ми идеята за HID. Но веднага щом оставих Windows отвъд образователните задачи на мигащи светодиоди (напред към реални UNIX среди!), той започна да се просмуква през всички незапечатани пукнатини и се почувствах като някакъв безпомощен куц. Докато отстранявах грешки в проекта, инстинктивно хванах някакъв вид tcpdump (така се нарича: usbdump(8) или usbmon), но видях само съобщения на непознат език.

Стана очевидно: липсват фундаментални познания за USB шината. Ако някой опитен IT специалист разбира 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 с битово пълнене: тук след шест последователни „1s“ ( добре, исках да предам, да речем, 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), следващи стриктно един след друг, които (в полудуплексен режим) хостът обменя с крайна точка и само с една. Много е важно само хостът да отваря транзакцията; това е специфика на USB (има по-малко проблеми за нас във фърмуера на MK). На ниво сделка можем да говорим канал(тръба) между хоста и една от крайните точки на устройството, но умишлено избягвам термина „Връзка към данни“ от OSI модела. Анализаторът на протоколи трябва поне да декодира транзакции.
Ниво на предавка
Върху транзакциите ще поставим слоя за трансфери. Има четири вида от тях в USB: контролни трансфери с крайна точка № 0, прекъсващи трансфери, изохронни трансфери и масови трансфери. Последните три са варианти на стрийминг канали (stream pipe), за които ще кажа няколко думи по-късно. Това ниво също трябва да показва добър анализатор на протоколи.
Приложен слой
В горната част на стека, както обикновено, е слоят на приложението. Това, което се случва тук е: задаване на адреса на устройството от хоста, съобщаване на устройството за себе си на езика на дескрипторите, команди на хоста за избор на конфигурация (контролни предавания), обмен на данни с HID устройства (в примерите намерих предаване с прекъсвания досега, искам да пробвам контролното), печат на принтер и сканиране, достъп до USB памет (голям блок), комуникация чрез слушалки и уеб камери (изохронно) и много други страхотни неща.
Довършителни работи
Прескачайки надолу по нивата за секунда, можем да добавим, че хостът периодично хвърля същите тези Start of Frame (SOF) пакети през шината, разделяйки времето на равни интервали, но по такъв начин, че да не прекъсва самите транзакции. Следователно SOF пакетите могат да се считат за независими транзакции. USB рамката не трябва да се бърка с омоним за слоя за връзка за данни на модела OSI. По-добре е да запомните кадрите (рамките) на аудио компактдиск, това е просто количество време: хостът „тиктака“ в шината със SOF пакети, така че свързаните устройства планират предварително да участват в т.нар. изохронни предавания, управлявайки потоци от данни в реално време. Е, или така: групи от транзакции се планират от хоста във времеви интервали, наречени рамки. Рамката е 1 ms при пълна скорост и 125 μs при високоскоростен USB, но високата скорост е по-сложен стандарт, по-добре е да го изучавате отделно.
UPD:
Читателите зададоха добър въпрос: какво ще кажете за фрагментацията? Не открих никакви признаци на фрагментация в USB 2.0 на ниво транзакция и по-долу, т.е. Транзакциите са предназначени да се предават в тяхната цялост. В някои случаи трансферите могат и трябва да бъдат разделени на няколко транзакции, особено като се вземат предвид изохронните режими. И ще повторя, че засега домакинът отговаря за цялото планиране вместо нас (от страна на MK трябва да мислим по-малко).

Разглеждане на USB трафик

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

Ето един от тях


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

USB режими на трансфер в STM32 USB FS примери

Така че една двойка кабели може да се използва за копиране от диск едновременно с аудио-видео поток, жестове с мишката и високоскоростен осцилоскопски сигнал, има различни видове съобщения и предавания.
Точно по-горе описах просто стрийминг канал(Stream Pipe) между хоста и крайната точка, където пакетите с пълнежа (Data groups) не носят никаква специална или контролна информация към самата USB подсистема. Пълна свобода на кореспонденция, библиотеката на контролера трябва да осигури примитиви за изтегляне на буфер с произволен размер от паметта на MK към хоста или обратно. Нека MK библиотеката заедно с хост драйвера се справят с нарязването на пакети, пренасочването и „дефрагментирането“. В STM32 това са USB_SIL_Write() и USB_SIL_Read(), описани в UM0424. Те са самото логично ниво на абстракция. От страната на хоста вижте описанието на съответния драйвер (например на FreeBSD това е ugen(4)).
Въпреки това смятам за богохулство да се използват тежки периферни устройства като USB за организиране на прост стрийминг канал (въпросът е: какво не е наред с USART?). Но, разбира се, има всякакви ситуации.
Във всеки случай, за да може USB подсистемата изобщо да оживее и устройството да бъде открито, е необходим обмен на контролни транзакции.

ОТКАЗ ОТ ОТГОВОРНОСТ

Допълнителни примери ще бъдат споменати от същата библиотека UM0424 за работа с Full Speed ​​​​USB от STMicroelectronics, но те са предназначени за техните собствени демо платки. Вземете пример от автора Raja, покажете инженерни умения в адаптирането на проекти към вашата демонстрационна дъска.

Всичко е ясно за софтуера: това са примери, които не са за промишлена употреба, може да има грешки, някои части (като таблицата за връзки в примера за масово съхранение) са защитени с патент и вие нямате право да ги използвате в търговски проект. Но това не е нищо, след това китайците успяват да продадат USB продукти на пазара, за които дори не си правят труда да променят библиотеката VID и PID.

За желязото, както разбирам, трябва да започнете с кварц. Имам Chelyabinsk PinBoard II с 12 MHz кварц (всички библиотеки са проектирани за 8 MHz), промених PLL множителя от 9 на 6 (връзка с обяснения), в противен случай MK ще се ускори до 108 MHz вместо 72 MHz и USB няма да отиде на 72 MHz вместо необходимите 48 MHz. Можете също така да забавите скоростта на MK до 48 MHz, като промените делителя на USB шината от един и половина на един. Специалистите не обичат да използват вътрешния генератор на HSI MK: честотата може леко да се отклони поради нагряване и е трудно да се предвидят последствията за USB. Е, не забравяйте за периферията, разбира се. Без SPI/SDIO флаш памет, от примера за масово съхранение можете да направите само аналог на /dev/null, но не можете да го форматирате :-)

Контролирайте предаванията и каналите за съобщения
Мислейки за USB, си спомням добрия стар PPP протокол с неговите LCP, IPCP, CCP и също xzCP. Обменът на съобщения от специален тип между хоста и крайната точка № 0 е локалният еквивалент на x3CP.
Чрез контролни предавания устройството се инициализира, получава адрес и съобщава на хоста за себе си на езика на дескрипторите (така че да може да намери и активира необходимия драйвер). Без контролни операции простото поточно предаване няма да работи; ако устройството не отговори във формуляра, хостът бързо ще затвори порта: трябва да се следва протоколът.
По принцип протоколът не забранява свързването на обмен на данни към контролна точка № 0, подобно на режима с прекъсвания. В същото време помислете за това: как ще актуализирате фърмуера на MK, така да се каже, на полето? Готов ли сте програмиста? Има и друго решение.
Пример: Надграждане на фърмуера на устройството
Прекъснати предавания
Този сорт ( прекъсване на трансфера) е предназначен за обмен на малки транзакции, подобни на контролните. Не, устройството не може да прекъсне хоста, то чака запитване, тяхната честота и размер на пакетите са посочени предварително в дескриптора на устройството. Много подходящ за всички видове дистанционни управления, сензори, мишки, светодиоди и други HID кафемашини. Каналът с прекъсвания във всяка точка е еднопосочен.
Примери: Персонализиран HID, Джойстик мишка, Виртуален COM порт
Изохронни предавания
Χρόνος на гръцки означава „време“. Изохронно предаване ( изохронен трансфер) - местни високотехнологични, които ви позволяват да управлявате потоците от данни в реално време. Той разполага с гарантирана (но не непременно широка) честотна лента и без потвърждаващи транзакции, подобно на UDP с QoS. Счупен пакет? Бог Хронос беше този, който бутна МК по крака. Няма нужда да се опитвате да изпратите пакета отново, в противен случай Бог ще се разстрои. Ние обаче проверяваме контролните суми тихо от Chronos. Изохронните трансфери са добри за аудио-видео и измервателни системи в реално време, както и за други играчки двойна употреба. Въпреки че някои от тях може. По-интересно е да закачите някакъв вид AVR, като го свържете към нашата ARM чрез USART или SPI. Изохронните операции са включени в сигнализирането на рамка (помнете тиктакането на SOF пакет).
Пример: USB гласов високоговорител
Големи блокови трансмисии
Не, няма да носим торби с цимент. Мисля, че всички са научили режима на работа на всички видове USB устройства. Трансфери групов трансферимат за цел да изпращат данни възможно най-много и възможно най-бързо, винаги с прехвърляне на счупени пакети, но без гаранции за честотна лента, като ги поддават на изохронни предавания, ако е необходимо (както в TCP без QoS). Вече говорих за вътрешната структура на USB флаш устройствата, сега можете да изтеглите и стартирате работещ прототип. Не съм го пробвал сам, но таблицата на SCSI командите в описанието на примера (между другото) е доста символична. Не открих признаци на алгоритъм за управление на износването на NAND памет :-)
ЗАБЕЛЕЖКА: Патентната защита на STM се прилага на места.
Пример: Масово съхранение

Какво е останало неразкрито

Нямам за цел да правя друг учебник на USB, има достатъчно и без мен, и са добре описани: електрическа част, детайли на протокола, работа с хъбове, дескрипторен език и ниво на HID абстракция, проблеми с VID/ Уникалност на PID, USB 3.0 и много други чудесни функции на USB шината, както полезни за нас, така и не толкова. За IT специалистите препоръчвам специално екскурзия до тъмната страна с преглед на вражеските устройства (флашка с прикрита HID клавиатура, която ще направи ужасни неща).

Връзки

Адаптиране на персонализирания HID пример към безплатната среда Em::Blocks и бюджетната демо платка STM32F103C8T6, произведена от LC-Tech Industrial Electronics и IT хора. Това е един вид инженерство Ин и Ян, всеки от нас има дял и от двете.

Инженерите по индустриална електроника имат отлични познания и умения в хардуера; те запояват тънки като косъм радиокомпоненти с лявата си ръка със затворени очи (и тогава работи). Гледайки електронна верига, човек почти физически започва да усеща всички нейни токове с потенциали; те също работят със силови вериги и с (големи, бързи, опасни) индустриални продукти. Подходът към програмирането на MK е подходящ: той просто трябва да изведе необходимите логически нива на десните крака в точното време, няма значение по какъв начин. Те са консервативни в технологията (не се намесвайте - работи), тежките MK периферни устройства не са особено предпочитани. Когато обсъждаме обектно-ориентирано програмиране, информационна сигурност, гигантски проекти с милиони редове код и всякакви фантастични графични интерфейси, хората се отегчават. Вместо пакетно-ориентираната USB шина, те предпочитат USART стрийминг режим, подобрен или от обичайния RS-232, или от по-бруталния RS-485 (серийна шина за индустриални приложения, до 10 Mbit/s на 15 m, до 100 kBit/s при 1200 m, до 32 устройства).

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

за какво говоря Ние просто виждаме този свят по различен начин... В края на краищата ядрото на Linux беше създадено от едни и същи хора, от модули в C и асемблерни вложки за специфични платформи, и те изглежда се справяха без holivars. Виждам наистина сериозен проект като многоядрена система, съчетаваща най-новите микроконтролери с тежки периферни устройства, но не изключвам комбинации с класически модели като AVR: те могат да се използват за окачване на някои критични, бързо въртящи се върхове на техническия прогрес. Ако кодът е тестван с години, защо не?

Добавете етикети

Днешната статия ще бъде посветена, както подсказва заглавието, на обсъждане на основите USB интерфейс. Нека да разгледаме основните понятия, структурата на интерфейса, да разберем как става прехвърлянето на данни и в близко бъдеще ще приложим всичко това на практика 😉 Накратко, да започваме!

Има няколко различни спецификации USB. Всичко започна с USB 1.0и USB 1.1, след което интерфейсът се разви в USB 2.0, окончателната спецификация се появи сравнително наскоро USB 3.0. Но в момента най-често срещаното изпълнение е USB 2. 0.

Е, за начало, основните точки и характеристики. USB 2.0поддържа три режима на работа:

  • Висока скорост– до 480 Mb/s
  • Пълна скорост– до 12 Mb/s
  • Ниска скорост– до 1,5 Mb/s

Команди в автобуса USB хост(например компютър), към който можете да свържете до 127 различни устройства. Ако това не е достатъчно, тогава трябва да добавите друг хост. Освен това е важно самото устройство да не може да изпраща/получава данни към/от хоста; необходимо е хостът да се свърже със самото устройство.

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

Нека се отклоним малко и да поговорим за „хардуера“ на интерфейса.

Има два вида конектори – Тип А и Тип Б.

Както вече става ясно от фигурата Тип Авинаги е с лице към домакина. Това са съединителите, които виждаме на компютри и лаптопи. Съединители Тип Бвинаги се отнасяйте за свързани USB устройства. USB кабелът се състои от 4 проводника с различни цветове. Е, всъщност червеното е мощност (+5 V), черното е земята, бялото и зеленото са за предаване на данни.

В допълнение към тези, показани на фигурата, има и други опции за USB конектори, например mini-USB и други, добре, вече знаете това 😉

Вероятно си струва да се докоснем малко до метода за прехвърляне на данни, но няма да навлизаме по-дълбоко в това) Така че, когато прехвърляте данни през шината USBизползва се принципът на кодиране НРЗИ(без връщане към нула с инверсия). За да се предаде логическа „1“, е необходимо да се повиши нивото на линията D+ над +2,8 V, а нивото на линията D- трябва да се понижи под +0,3 V. За да се предаде нула, ситуацията е обратната - ( D- > 2,8 V) и (D+< 0.3 В).

Трябва да обсъдим и захранването на устройствата USB. И тук също са възможни няколко варианта.

Първо, устройствата могат да се захранват от шината, след което могат да бъдат разделени на два класа:

  • Ниска мощност
  • Висока мощност

Разликата тук е, че маломощниустройствата не могат да консумират повече от 100 mA. A устройства висока мощностне трябва да консумира повече 100 mAсамо на етап конфигуриране. Веднъж конфигурирани от хоста, тяхното потребление може да достигне до 500 mA.

Освен това устройствата могат да имат собствено захранване. В този случай те могат да получат до 100 mAот автобуса и вземете всичко останало от вашия източник)

Това изглежда е всичко, нека бавно да преминем към структурата на предадените данни. Все пак това е от най-голям интерес за нас 😉

Цялата информация се предава персонал, които се изпращат на редовни интервали. От своя страна всеки кадър се състои от сделки. Това може да е по-ясно по този начин:

Всяка рамка включва пакет , след това следват транзакции за различни крайни точки и всичко завършва с пакет EOF (край на кадър).За да бъда абсолютно точен, тогава EOF- това не е съвсем пакет в обичайния смисъл на думата - това е интервал от време, през който обменът на данни е забранен.

Всяка транзакция има следната форма:

Първият пакет (нар Токен найлонов плик) съдържа информация за адреса на устройството USB, както и номера на крайната точка, към която е предназначена тази транзакция. В допълнение, този пакет съхранява информация за вида на транзакцията (ще обсъдим какви типове има, но малко по-късно =)). – всичко е ясно с него, това са данните, предадени от хоста или крайната точка (в зависимост от вида на транзакцията). Последен пакет –Статус

Думата „пакет“ е чувана много пъти във връзка с интерфейса. USB, така че е време да разберете какво е то. Да започнем с опаковката Токен:

Пакети Токенима три вида:

  • Настройка

Ето защо казах това..) В зависимост от вида на пакета, стойността на полето PID V Токенпакетът може да приема следните стойности:

  • Тип пакет токени OUT – PID=0001
  • Тип пакет токени IN – PID = 1001
  • Тип пакет токени НАСТРОЙКА – PID = 1101
  • Токен пакет тип SOF – PID=0101

Да преминем към следващия компонент на пакета Токен– полета Адреси Крайна точка- съдържат Адрес на USB устройство и номер на крайна точка, което е предназначено сделка.

Какво поле CRC– това е контролна сума, това е ясно.

Тук има още един важен момент. PIDвключва 4 бита, но по време на предаване те се допълват с още 4 бита, които се получават чрез обръщане на първите 4 бита.

И така, следващият по ред - тоест пакет данни.

Всичко тук е основно същото като в опаковката Токен, само че вместо адреса на устройството и номера на крайната точка, тук имаме предадените данни.

Остава да обмислим – всичко е ясно с него, това са данните, предадени от хоста или крайната точка (в зависимост от вида на транзакцията). Последен пакет –пакети и SOF пакети:

тук PIDможе да приема само две стойности:

  • Пакетът е получен правилно - PID=0010
  • Грешка при получаване на пакет - PID = 1010

И накрая пакети:

Тук виждаме ново поле Рамка– съдържа номера на предавания кадър.

Нека да разгледаме процеса на записване на данни на USB устройство като пример. Тоест, разгледайте пример за структурата на кадър за запис.

Рамката, както си спомняте, се състои от транзакции и има следната форма:

Какви са всички тези транзакции? Нека да го разберем сега! Транзакция НАСТРОЙКА:

Транзакция ВЪН:

По същия начин, когато четете данни от USB устройство, рамката изглежда така:

Транзакция НАСТРОЙКАвече видяхме, нека да разгледаме сделката IN 😉

Както можете да видите, всички тези транзакции имат същата структура, както обсъдихме по-горе)

Като цяло, мисля, че това е достатъчно за днес 😉 Това е доста дълга статия, надявам се, че ще се опитаме да приложим USB интерфейса на практика в близко бъдеще!