Выбор стандартного интерфейса для обмена данными

В этой заметке будет краткий обзор различных распространённых интерфейсов, которые используются в качестве канала обмена данными между персональным компьютером (ПК) и разрабатываемым\проектируемым устройством (или в пределах устройств только). Заметка, скорее, для начинающих схемотехников \ программистов, которая поможет определиться с начальным выбором, оценив возможности и ограничения описанных интерфейсов.

B69-0

Фото взято отсюда.

Заметка не претендует на полноту изложения или обстоятельный подход к каждому интерфейсу, могут быть ошибки или неточности, это скорее заметка с авторскими пометками и моё мнение может не совпадать с вашим. :) Если интересно — прошу под кат:

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

Плюсы и минусы каждого интерфейса в виде таблицы для наглядности:

Интерфейс Плюсы Минусы
Virtual COM (USB-to-UART)
  • Широкий выбор готовых решений
  • Простота интеграции и взаимодействия с МК\ПЛИС
  • Низкий входной порог
  • Низкая стоимость
  • Низкая скорость передачи данных
  • Интерфейс наиболее ориентирован на отладочные цели, для передачи ASCII символов, чем для потоков данных
USB 2.0
  • Широкий выбор готовых решений
  • Довольно низкая стоимость (есть МК со встроенным USB PHY)
  • Возможность питания устройства
  • Низкая\средняя скорость передачи данных
  • Средний входной порог при написании custom-устройств
USB 3.0 / 3.1
  • Высокая скорость передачи данных
  • Доступен встроенный интерфейс USB 2.0
  • Относительно невысокая стоимость
  • Доступны готовые решения
  • Продвинутая система питания устройства
  • Средний\высокий входной порог
  • Повышенные требования к разводке ПП
  • Требуется внешний PHY (в рядовых решениях встроенный PHY отсутствует)
PCI Express
  • Очень высокая скорость передачи данных
  • Возможность расширения пропускной способности путём добавления дополнительных линий
  • Высокий входной порог
  • Высокая стоимость
  • Высокие требования к разводке ПП
  • Не мобильное решение
Thunderbolt
  • Очень высокая скорость передачи данных
  • Продвинутая система питания устройства
  • Высокий входной порог
  • Высокая стоимость
  • Высокие требования к разводке ПП
  • Нет доступных готовых решений
Ethernet
  • Широкий выбор готовых решений
  • Есть решения с повышенными скоростями передачи данных
  • Гальваническая изоляция
  • Задержки
  • Питание устройства возможно только с дополнительным оборудованием (PoE)
  • Довольно габаритный согласующий трансформатор (даже встроенный в разъем)
SFP
  • Много готовых решений
  • Высокая скорость передачи данных
  • Гальваническая изоляция
  • Высокая дальность работы при сохранении высокой скорости передачи данных
  • Горячая замена SFP модуля
  • Низкие задержки
  • Средний входной порог
  • Повышенные требования к разводке ПП
  • Нет возможности питания устройства
  • Габаритное посадочное место под держатель SFP модуля
  • Ощутимый нагрев SFP модуля, его критичность к охлаждению
Wi-Fi
  • Беспроводное соединение
  • Гальваническая изоляция
  • Широкий выбор готовых решений
  • Высокие задержки
  • Лимитированная скорость передачи данных по наиболее низкоскоростному клиенту в сети
  • Нет возможности питания устройства
Bluetooth
  • Беспроводное соединение
  • Гальваническая изоляция
  • Широкий выбор готовых решений
  • Низкое потребление
  • Высокие задержки
  • Сильно лимитированная скорость передачи данных
  • Ощутимая зависимость качества приёмного сигнала от помех или препятствий
  • Нет возможности питания устройства

Чуть подробнее

Virtual COM (USB-to-UART) — это, конечно, уже древний вариант, но для сравнения я решил добавить и его. USB-to-UART порт можно организовать и на МК со встроенным USB PHY, есть куча примеров как от производителей МК, так и от любителей. Если же требуется внешний чип, то в качестве примера наиболее распространённые микросхемы:

  • FT232HFT2232H (и более старшие линейки) — дорого-богато, довольно надежно, большой функционал настройки (можно не только как UART использовать, но и I2C, SPI, JTAG, FIFO параллельную шину), бывает по несколько раздельных каналов на чип, можно задать свой PID\VID\описание\компанию, довольно удобные, есть мелкие корпуса и скорость по USB до 480 Мбит/с. Если цена устраивает и хочется наворотов — вариант хороший, главное не брать на али FT232 и аналогичное — пришлют подделку 146%.
  • CP2102 — вполне классический вариант, дешево и сердито, минимум наворотов, работает стабильно и крайне малогабаритное решение. Правда, на сайте производителя значатся как NRND (Not Recommend to New Designs). Из не NRND стоит посмотреть новинки (к примеру, его обновлённую версию — CP2102N).
  • CH340G — ультра дешевое ультра китайское поделие… без комментариев. Разве что стоит отметить, что драйвера на этот чип есть везде, даже в линуксе встроены.

USB 2.0 — вполне рядовое решение для большинства задач с достаточно низкими потоками данных. Существует 3 режима работы, отличающиеся скоростью передачи:

  • Low-speed — 10…1500 Кбит/c (клавиатуры, мыши, джойстики, геймпады);
  • Full-speed — 0,5…12 Мбит/с (аудио-, видеоустройства);
  • High-speed — 25…480 Мбит/с (видеоустройства, устройства хранения информации).

Для первых двух зачастую не требуется никаких внешних микросхем, и USB PHY уже содержится в МК\SoC даже начального уровня (к примеру, в STM32F042F6P6 внутри есть даже точный тактовый генератор на 48 МГц, что освобождает от необходимости установки внешнего кварца и поддержка USB 2.0 Full-speed на борту!), чего хватит для большинства задач по управлению или для задач с небольшими потоками данных.

Для High-speed режима работы в большинстве случаев уже потребуется внешний PHY, с которым МК будет взаимодействовать по интерфейсу ULPI или UTMI. Возможные PHY с поддержкой High-speed:

  • USB3300 — один из самых распространённых вариантов, дешевый, малогабаритный (QFN-32), 480 Мбит/с, OTG, ULPI (также вполне стоит посмотреть и другие варианты от Microchip);
  • USB3320 — QFN-32, 480 Мбит/с, ULPI, можно выбирать I/O уровни в пределах 1.8…3.3 В, но требует внешнего LDO, в остальном похож на USB3300, но если нет нужны в I/O уровнях ниже 3,3 В, то смысла его применять нет;
  • TUSB1210 — альтернативный вариант с аналогичными USB3300 характеристиками в VQFN-32 корпусе.

USB 3.0 (3.1 Gen 1) — первая версия USB с режимом работы SuperSpeed и теоретической скоростью передачи данных в 5.0 Гбит/с, реальная же скорость передачи будет ощутимо ниже (к примеру, можно почитать тест производительности от FTDI на FT600\FT601). Потребуется внешний PHY, а также имеются повышенные требования при проектировании схемы и разводке ПП. На самом деле возможны 2 варианта реализации:

  1. Установка специализированной МС, которая берёт на себя всю работу, и на выходе у неё уже просто параллельная шина.
  2. В случае применения ПЛИС — скоростные линии USB 3.0 идут напрямую к LVDS трансиверам, но всё равно требуется внешний USB 2.0 PHY для начальной инициализации USB, а также покупное или самописное IP ядро для, собственно, реализации USB 3.0.

Второй вариант, конечно, очень гибкий, но потребует ощутимых трудозатрат для реализации (особенно если не покупать готовое IP ядро), первый же подойдет для быстрого старта с хорошими примерами от производителей, в качестве примера самые распространённые МС:

  • FT601Q — USB 3.0 в 32-битную шину с тактовой частотой 100 МГц, вполне самодостаточный чип, легок в применении и есть достаточное количество примеров от FTDI, утилитой можно сменить PID\VID, имя продукта и производителя, есть младшая модель FT600Q, отличие которой в том, что на выходе 16-битная шина с потерей производительности (тактовая частота те же 100 МГц);
  • CYUSB301X — это уже целый АРМ с USB 3.0, потребуется написание прошивки (но примеров от производителя также хватает), на выходе та же 32-битная шина с тактовой частотой 100 МГц, отличие только в гибкости реализации USB устройства и возможность реализации своего протокола «прямо здесь и сейчас».

USB 3.1 Gen 2 (Type C) — следующее поколение USB с режимом работы SuperSpeed+ и теоретической скоростью передачи данных в 10.0 Гбит/с. Реализуется способом, когда скоростные линии USB 3.1 идут к LVDS трансиверам ПЛИС через сереализатор (2 * LVDS 10 Гбит/с разделяется на 4 * LVDS 5 Гбит/с, которые уже и идут в USB Type C, приём\передача по 2 линии) и установлен внешний USB 2.0 PHY для начальной инициализации USB. В качестве примера IP ядро для реализации USB 3.1:

  • eUSB31SF — для ПЛИС ф.Intel поддерживается реализация как USB 3.1 Gen 1 (5 Гбит/с) для серий Cyclone V, Arria V, так и реализация USB 3.1 Gen 2 (10 Гбит/с) для серий Arria 10, Cyclone 10, но стоит отметить, что реализация USB 3.1 Gen 2 имеет реальную скорость передачи данных чуть более 7 Гбит/с.

А в качестве примера реализации схемотехники USB 3.1 Gen 2 советую посмотреть Intel Cyclone 10 GX FPGA Development Kit.

USB 3.2 — будущее поколение со скоростью до 20 Гбит/с (2 линии по 10 Гбит/с), спецификации можно почитать на USB.ORG. Реальных устройств пока нет.

PCI Express —  это уже компьютерная шина с последовательной передачей данных, по факту передача идёт на 1\4\8\12\16\32 двунаправленных линиях, а линия, в свою очередь, состоит из двух LVDS, на приём и передачу. Пропускная способность для существующих устройств с PCI Express (на момент написания) в зависимости от количества линий и версии:

B69-1

Более подробно можно почитать на Википедии. Если говорить о наиболее реализуемых вариантах на ПЛИС или ASIC, то вкратце это выглядит так:

  • 128-бит:
    • x8 линий, 125 МГц — высокопроизводительные ПЛИС, ASIC.
    • x4 линий, 62.5 МГц — бюджетные ПЛИС, ASIC.
  • 64-бит:
    • x8 линий, 250 МГц — ASIC.
    • x4 линий, 125 МГц — высокопроизводительные ПЛИС, ASIC.
  • 32-бит:
    • x4 линий, 250 МГц — ASIC.
    • x1 линий, 62.5 МГц — большинство ПЛИС, ASIC.

В качестве примера реализации схемотехники PCI Express х4 советую посмотреть Intel Cyclone 10 GX FPGA Development Kit.

Варианты от разных компаний внешних PHY для реализации PCI Express с пометкой количества линий:

  • Genesys LogicGL9711 (x1), GL9714 (x4 или x8, установив две GL9714);
  • Texas InstrumentsXIO1100 (x1).

Thunderbolt — аппаратный интерфейс, ранее известный как Light Peak. Интерфейс был разработан компанией Intel в сотрудничестве с Apple для подключения периферийных устройств к ПК (маку) и схож с USB Type C. Может комбинировать в себе PCI Express и DisplayPort. Скорость передачи данных до 10 Гбит/с по проводному кабелю и до 20 Гбит/с при использовании оптического кабеля. Применять в случае изготовления устройств исключительно для Apple продукции, в любом другом случае это будет провал и бесполезная трата времени и ресурсов.

Ethernet — универсальное решение. Крайне легко объединять устройства в сеть, добавлять в существующую дома\работе сеть, обмениваться с ними данными (примеров более чем достаточно, как со стороны ПК, так и со стороны МК\ПЛИС\SoC) и не париться о гальванической развязке между устройством (-ами) и ПК.

В навороченных SoC, МК бывает встроенный PHY, в случае создания устройства на средне-бюджетных МК или ПЛИС уже не обойтись без внешнего PHY. В качестве примера немного различных PHY с разными интерфейсами подключения и скоростями:

  • LAN8710A — 10/100 Мбит, MII/RMII, мелкий и дешевый PHY, ничего лишнего;
  • LAN8720A — 10/100 Мбит, RMII, еще мельче и еще дешевле первого, но только RMII поддерживает, хотя это лучше — меньше линий данных, проще разводка, для 100 Мбит не критичен выбор между MII/RMII;
  • PHY11G (PEF 7071) — 10/100/1000 Мбит,  RMII/RGMII/GMII, бодрый PHY для решения различных задач на SoC FPGA и не только;
  • KSZ9031RNX — 10/100/1000 Мбит, RGMII, как альтернатива прошлому PHY, попроще и подешевле;
  • BCM5482S — 10/100/1000 Мбит,  RGMII/SGMII, 2 порта, дорого-богато, куча наворотов, хорош в скоростных и надежных решениях для организации нескольких портов Ethernet или оптики, BGA корпус.

SFP — вариант Ethernet-та для зажиточных бояр, когда хочется не только больших скоростей (от 1 Гбит и выше), но и минимальных задержек (к примеру, в позитронно-эмиссионном томографе «головы», которые регистрируют радиационное излучение от исследуемого объекта, должны быть синхронизированы между собой в пикосекундной точности, они подключены к общему блоку сбора данных по оптике, а он уже синхронизирует старт отсчёта времени всех «голов» и принимает поток данных от них). Этот вариант не то что избыточен для систем на МК, он даже труднореализуем на них (требуется применение внешнего PHY, умеющего работать с оптикой), поэтому переходить на оптику стоит только тогда, когда у вас в проекте ПЛИС с бодрыми трансиверами LVDS и требуется гнать большой поток данных или нужны минимальные задержки.

В качестве примера внешние PHY (так-то корзинку-держатель для оптического модуля можно подключить напрямую к ПЛИС, и из дополнительных элементов потребуются разве что 6 резисторов да фильтры по питанию и развязочные конденсаторы на дифференциальные линии LVDS):

  • BCM5482S — этот PHY умеет как с медью работать, так и с оптикой на 2 порта.

Wi-Fi — этот вариант подходит для малогабаритных или\и портативных устройств, когда требуется применение стандартного интерфейса для связи, максимальное удобство, а также нет жестких требований на задержки и объемы потока данных (к примеру, вы делаете автономное устройство, которое периодически управляется по сети или имеет WEB для удобной работы с ним как с ПК, так и с планшета\телефона). Также стоит отметить, что как таковых Wi-Fi PHY обычно не ставят, Wi-Fi PHY уже идет в составе с каким либо АРМ-ом зачастую (Wi-Fi SoC), что упрощает схемотехнику вашего устройства и положительно влияет на габариты и цену.

В качестве примера различные WiFi SoC:

  • CC3200 — ARM Cortex-M4 Wi-Fi SoC от Texas Instruments, поддержка хорошая, RAM памяти средне, богатая периферия с хорошим описанием, но довольно дороговат (ибо фирма таки), уже есть следующая версия — CC3220;
  • RTL8710AF, RTL8711AF, RTL8711AM, RTL8195AM — ARM Cortex-M3 Wi-Fi SoC от Realtek, интересная вполне линейка (Ameba A), достаточно богатая периферия (к примеру, даже в младшем чипе есть NFC), просто горы RAM памяти (относится только к RTL8711AM и RTL8195AM) в сравнении с другими SoC, доступна документация, но не вся — остальное только под NDA, SDK вполне не плох, но требует от разработчика определённого уровня знаний, явно не для ардуинщиков вариант (хотя Arduino порт есть под этот SoC);
  • RTL8710BN, RTL8710BX — ARM Cortex-M4F Wi-Fi SoC от Realtek, следующая интерация чипов линейки Ameba A, эту прозвали Ameba Z. Много чего поправили в ROM, перевели на M4 ядро, но с документацией похуже (также NDA), периферии также меньше тут доступно (сам SoC в более мелком корпусе), вариант хороший только для мелких устройств, тоже не для новичков;
  • ESP8285, ESP8266EX — один из первых супер-бюджетных Wi-Fi SoC от Espressif Systems, в какой-то мере произвел революцию, дав любому желающему возможность попробовать собрать устройство на Wi-Fi SoC, но первый не значит лучший. Первые образцы были довольно глюченными, грелись, SDK был крайне забагован (да и сейчас далёк от идеального), документации толковой как не было, так и нет. Зато это чудо пришлось народу по душе (думаю, из-за цены в основном), и на его основе (особенно с применением Arduino порта) лепят всё, что в голову взбредёт. Построен на 32-bit Tensilica, не АРМ! Не рекомендую к применению в каких либо разработках, только «на поиграться», т. к. мало RAM памяти, мало I\O, SDK «не очень», плохая документация. Из плюсов же — просто тонны проектов, примеров и большое комьюнити.
  • ESP32 — следующий вариант Wi-Fi + Bluetooth SoC от Espressif Systems, 32-bit Tensilica, во многом лучше первого, больше RAM, больше периферии, больше IO, но с SDK и документацией такие же проблемы. Так же есть двухъядерные чипы, в которых одновременно использовать два ядра толком не выйдет (вроде как есть несколько геморройные\специфичные варианты), т. к. исполнение кода из flash, а доступ к ней только с одного ядра…
  • RDA5981A — достаточно новый Wi-Fi SoC от RDA, ARM Cortex-M4F, бюджетный, вполне хороший фарш периферии, даже USB есть, но поддержка никакая (даже на официальном форуме толком не отвечают!), SDK обрезанный, примеров мало, а документация — почти всё только по NDA. Смысл выпускать такой SoC без какой-либо поддержки не ясен, ибо всё еще хуже, чем у Espressif Systems, несмотря на вполне хорошие характеристики SoC.

Также стоит отметить и альтернативный вариант использования этого интерфейса в случае применения одноплатных ПК на Linux, примеры одноплатных ПК на «больших АРМ-ах»:

  • Raspberry Pi 2\3 — классика, почти везде есть, много примеров, всё разжевано и проблемы при использовании различных дистрибутивов минимальны (кстати, помимо различных вариаций Linux дистрибутивов доступен и Windows IoT!), для второй версии малины разве что Wi-Fi свисток потребуется. Из минусов стоит отметить не опенхардвар решение, не очень хороший конструктив (на столе поиграть норм, а вот какие-либо устройства городить и в корпус запихивать — всегда будет куча проводов или не очень приятный вид с кучей разъёмов из всех сторон корпуса устройства) и цена не слишком дешевая (плата за популярность и большое комьюнити).
  • Orange Pi — не клон, а скорее пародия на малину, дешевая, только Linux дистрибутивы, но и проблемы включены: перегрев, баги и возможна частичная неработоспособность периферии, которую будут обещать поправить в следующих релизах дистрибутивов.
  • NanoPi — вначале начиналось всё аналогично Orange Pi, но далее у компании появились вполне интересные продукты с довольно продуманным конструктивом (к примеру NanoPi-NEO2 — мелкий, вполне хорошей ценой и как вишенка — 1 Гбит Ethernet). Только Linux дистрибутивы.
  • Omega2 \ Omega2S — небольшое, не мощное решение одноплатного ПК, вполне заточенного для промышленного применения, особенно S-версия. Достаточно много документации, примеров, приятная цена и, более того, можно купить официально в локальных компаниях. Только Linux дистрибутивы.

Bluetooth — это вариант для ультра малопотребляющих устройств, с повторяющий во многом Wi-Fi вариант исполнения, но с еще худшей пропускной способностью и еще большими задержками, но стоит отметить, что есть узконаправленные типы Bluetooth устройств, к примеру аудиоприёмники\передатчики, которые идеально заточены на потоковую передачу именно звука вкупе с максимально низким потреблением. Так что склонение к выбору именно этого интерфейса сильно зависит от решаемой задачи, так как этот вариант крайне специфичен и ограничен. В качестве примера различные Bluetooth SoC:

  • nRF51822 — ARM Cortex-M0, BLE 4.0, по-моему, самый распространённый Bluetooth SoC, хоть уже и несколько устаревший, но для него можно найти тонны проектов, примеров, обзоров всяких смарт-часов, где он стоит, и т. д.
  • nRF52832 — ARM Cortex-M4F, BLE 5.0, подороже первого, но и возможностей больше, периферия богаче и ядро новее.
  • nRF52840 — ARM Cortex-M4F, BLE 5.0, еще свежее, еще круче и еще дороже. :)
  • CC2541 — 8051, BLE 4.0, один из самых распространённых и самых дешёвых вариантов, только ядро 8051 на любителя.
  • CC2640R2F — ARM Cortex-M3, BLE 5.0, подороже прошлого, но и возможности лучше и АРМ уже.
  • SimpleLink Bluetooth — целые линейки Bluetooth Low Energy SoC под различные задачи от Texas Instruments, куда включены и предыдущие два  Bluetooth SoC.
  • Gecko Bluetooth — целые линейки Bluetooth SoC под различные задачи от Silicon Laboratories.

Вывод

В итоге можно сказать следующее. Стоит выбирать интерфейс исходя из 4-х основных факторов:

  • Необходимая «толщина канала», т. е. какой объём данных потребуется передавать, будут ли это редкие управляющие сигналы или же поток данных, и какие допустимы задержки;
  • Цена и доступность PHY, а также необходимые дополнительные компоненты к нему;
  • Протоколы, используемые поверх этого интерфейса — какие есть стандартные и подходят ли они для вашей задачи или же наоборот — легко ли будет написать свой протокол (свой велосипед), специально под конкретную задачу;
  • Оценить свои силы и знания, а также изучить доступные примеры и открытые проекты (к примеру, не стоит, недавно освоив схемотехнику и разводку USB 2.0, браться за PCI Express… с другой стороны: «Не ну а чо? И там и там диф.пары, какая разница то, а?? Подумаешь сигналов просто больше стало, делов то…»).

Отобрав большинство интерфейсов (и доступных PHY) по первым двум факторам, окончательный выбор будут определять оставшиеся два, они довольно тесно связаны как между собой, так и с вашими умениями и поставленной задачей: финальный выбор зачастую довольно сложен и зависит от совокупности вашего опыта, итоговой цели, доступного времени на изучение и разработку, доступных материалов и примеров, а также найденных проблем (что тоже немаловажно, т. к. лучше посмотреть заранее Errata и форумы хотя бы бегло, чем потом самому искать баги и почему оно не работает-то!) при работе с этим интерфейсом или даже конкретными PHY для него.

Также хочу отметить, что со многими указанными в статье МС \ SoC \ одноплатными ПК я имел дело и применял, но они могут не являются лучшим вариантом решения вашей задачи, а даны только как небольшой пример. Их выбор гораздо больше и придётся изучать информации очень и очень много для нахождения наиболее оптимального решения вашей задачи.

А далее уже только опыт… :) На этом всё, удачи в разработках!

Реклама

2 Comments »

    • Его ни разу не держал и не использовал, к сожалению сказать о нём ничего не могу с технической стороны…
      http://wiki.rakwireless.com/doku.php?id=iot-product:rak439 — довольно много документации, примеры использования — думаю вполне можно использовать, если требуется WiFi-SPI мост.
      Так же у RAK вполне хорошая поддержка, если что — помогают (email или skype, я инженеру Ken’у писал по возникающим вопросам — решали достаточно оперативно).

      Нравится

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s