Основи інтерфейсу usb, microtechnics, мобільна версія

Існує ряд різних специфікацій USB. Почалося все з USB 1.0 і USB 1.1. потім інтерфейс еволюціонував в USB 2.0. відносно недавно з'явилася остаточна специфікація USB 3.0. Але на даний момент найбільш поширеною є реалізація USB 2. 0.
Ну і для початку основні моменти і характеристики. USB 2.0 підтримує три режими роботи:
Командує на шині USB хост (наприклад, ПК), до якого можна підключити до 127 різних пристроїв. Якщо цього мало, то потрібно додати ще один хост. Причому важливо, що пристрій не може саме послати / прийняти дані хосту / від хоста, необхідно, щоб хост сам звернувся до пристрою.
Давайте трохи відвернемося і поговоримо про «залізної частини» інтерфейсу.
Існують два типи конекторів - 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 пристрої не можуть споживати більше, ніж 100 мА. А пристрої high-power повинні споживати не більше 100 мА лише на етапі конфігурації. Після того, як вони сконфігуровані хостом їх споживання може становити до 500 мА.
Крім того, пристрої можуть мати свій власний джерело живлення. У цьому випадку вони можуть отримувати до 100 мА від шини, а все інше забирати у свого джерела)
З цим начебто все, давайте потихеньку переходити до структури даних, що передаються. Все-таки це являє для нас найбільший інтерес 😉
Вся інформація передається кадрами. які відправляються через рівні проміжки часу. У свою чергу кожен кадр складається з транзакцій. Ось, мабуть, так буде наочніше:

Кожен кадр включає в себе пакет SOF (Start Of Frame). потім слідують транзакції для різних кінцевих точок, ну і завершується все це пакетом EOF (End Of Frame). Якщо говорити зовсім точно, то EOF - це не зовсім пакет в звичному розумінні цього слова - це інтервал часу, протягом якого обмін даними заборонений.
Кожна транзакція має наступний вигляд:
Вже дуже багато раз прозвучало слово «пакет» стосовно інтерфейсу USB. так що пора розібратися що він із себе представляє. Почнемо з пакета Token:
Пакети Token бувають трьох типів:
Пакет In говорить нашому USB-пристрою, що хост готовий прийняти від нього інформацію. Пакет Out. навпаки, сигналізує про готовність і бажання хоста поділитися інформацією. Пакет Setup потрібен для використання керуючих передач. Ну а пакет Start Of Frame використовується для того, щоб ініціювати початок кадру.
Ось до чого я це розповів ..) Залежно від типу пакета значення поля PID в Token пакеті може набувати таких значень:
- Token пакет типу OUT - PID = 0001
- Token пакет типу IN - PID = 1001
- Token пакет типу SETUP - PID = тисячу сто один
- Token пакет типу SOF - PID = 0101
Ну і поле CRC - це контрольна сума, з цим зрозуміло.
Тут є ще один важливий момент. PID включає в себе 4 біта, але при передачі вони доповнюються ще 4-ма бітами, які виходять шляхом інвертування перших 4-их біт.
Отже, на черзі Data пакет - тобто пакет даних.
Залишилося нам розглянути Status пакети і пакети SOF:
Тут PID може приймати лише два значення:
- Пакет прийнятий коректно - PID = 0010
- Помилка при прийомі пакету - PID = 1010
І, нарешті, Start Of Frame пакети:
Тут бачимо нове поле Frame - воно містить в собі номер переданого кадру.
Давайте як приклад розглянемо процес запису даних в USB-пристрій. Тобто розглянемо приклад структури кадру записи.
Кадр, як ви пам'ятаєте складається з транзакцій і має такий вигляд:
Що являють собою всі ці транзакції? Зараз розберемося! Транзакція SETUP:
Аналогічно при читанні даних з USB-пристрою кадр виглядає так:
Транзакцію SETUP ми вже бачили, подивимося на транзакцію IN 😉
Як бачите, всі ці транзакції мають таку структуру, як ми обговорювали вище)