Как избавиться от дополнительных разъемов на печатной плате IoT-устройств при наличии разъема Type-C? Этим вопросом мы задались, когда в своих разработках начали переход с micro-USB на 24pin Type-C. Используя Type-C только для питания и USB данных не слишком рационально, остается множество незадействованных контактов - через которые можно вести прошивку, отладку самого устройства с микроконтроллером. Таким образом мы реализовали распиновку, позволяющую вести отладку и прошивку без использования дополнительных разъемов на плате устройства. В этой статье я постараюсь описать наш опыт работы с Type-C, надеюсь, он позволит вам избежать ошибок и сэкономить время, также поделюсь распиновкой разъемов Type-C для устройств с ESP32, STM32, Миландра, RISC-V или ARM, покажу что внутри кабеля Type-C и как его выбрать.

Перед прочтением очень рекомендую заглянуть в статью “Как начать использовать USB Type-C в своих разработках” - в ней хорошо описаны преимущества Type-C и виды кабелей. https://habr.com/ru/company/ntc-vulkan/blog/496882/

Распиновка Type-C под любые микроконтроллеры

От универсального разъема мы хотели добиться решения следующих задач и придумали вот такую распиновку:

  1. Передача питания. Для этого мы оставили стандартные контакты GND и +5В.

  2. Передача данных USB. Для работы как устройство USB slave использовали пины А/В 6 и А/В 7 на Type-C + подтяжку к земле по пинам А/В 5 (все согласно требованиям стандарта).

  3. Отладка. Вывели Blink на сторону платы отладки через пин А10, так как не всегда устройства имеют встроенный светодиод.

  4. Прошивка. Мы хотели сделать унификацию со многими отладчиками, среди которых ESP-PROG, J-link, ST-LINK, cJTAG (модный RISC-V не забыли), ALTERA USB Blaster и даже Миландр с одной и с конечными устройствами с Type-C с другой на базе микроконтроллеров ESP32, STM32, Миландра, RISC-V и ARM. 

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

A2 - JTAG TDI
A3 - JTAG TMS/TMSC (SWDIO)[MOSI]
A8, B8 - Boot (nTRST)
A10 - Blink (для визуальной отладки)
A11 - MCU reset (TRST, nSRST)
B11 - UART RX
B10 - UART TX
B3 - JTAG TDO (SWDIO)[MISO]
B2 - JTAG TCK/TCKС (SWCLK)[SCK]

Если представлять распиновку графически, с учетом переплетения жил в самом кабеле Type-C, получаем следующую картину:

Схема прохождения сигнала от Type-C устройства до Платы отладки через Type-C - Type-C USB 3.1 кабель

В результате мы получили распиновку, которая позволяет реализовать следующие подключения, вместе с передачей питания +5В и D+/D- для USB 2.0:

  1. UART + Blink + JTAG (serial debug + ST-link/ESP-PROG/JTAG/cJTAG)

  2. UART + Blink + SWD (serial debug + ST-link/Миландр)

  3. UART + Blink + ISP (serial debug + AVR программатор)

это и позволяет нам прошивать и отлаживать МК в реальном времени, без использования дополнительных разъемов и пинов на плате.

Как найти подходящий кабель Type-C - Type-C USB 3.1

Найти подходящий, полноценный USB 3.1 кабель, оказалось, не сильно тривиальной задачей. Для нашей задачи по жилам отлично подходят кабели от мониторов стандарта Thunderbolt 3. Но они длинные и не отличаются гибкостью — работать с таким трудно. Через маркетплейсы с третьей попытки нам удалось найти настоящий USB 3.1 Gen 2 с полножильной распиновкой. Многие продавцы продавали USB 3.0 под видом 3.1, но их быстро разоблачала прозвонка по пинам кабеля:

Рекомендуем заранее закупиться подобными переходниками с Type-C, они очень помогают в прозвонке кабеля. PS кабель на фото - USB 3.0 стандарта (только жилы A2, A3, B10, B11)

Внутри кабель Type-C - Type-C USB 3.1 выглядит следующим образом:

Кабель Type-C - Type-C USB 3.1. Жилы, слева на право: 1) Экран, он же GND (А1, А12, В1, В12); 2 - 5) Тонкие жилы А5, В5, А8, В8; 6-8) Питание +5В; 9-13) Экранированные коаксиальные кабели высокочастотных линий А3 А4 А10 А11; 14-15) Витая пара А6, А7; 16-20) Экранированные коаксиальные кабели высокочастотных линий В3 В4 В10 В11;

Из нашего опыта мы создали следующую инструкцию по тому, как выбрать правильный кабель:

  1. Смотрите отзывы. Если в них пишут про успешную работу макбука/ноутбука с монитором, вы на правильном пути;

  2. Выбирайте пропускную способность от 10 ГБит/с;

  3. Если есть упоминание Thunderbolt 3, то 99% полножильный кабель;

  4. Проверяйте кабель через платы Type-C test-plug (как на фото выше).

Да прибудет с вами удача, ибо разнообразие Type-C стандартов для кабелей, покрытое разнообразием уловок продавцов превращает простую закупку в интересный квест.

Распиновка на стороне отладочной платы

Если вы изначально думали, что жилы Type-C идут «напрямую» от А1 к А1, от А2 к А2 и т. д., то спешу вас разочаровать — мы тоже так изначально подумали и развели первую плату неверно. Как показала работа над ошибками, схема коммутации жил внутри кабеля оказалась следующей:

Если присмотреться, она хитросплетенная и зеркальная, некоторые жилы со стороны А приходят на сторону В и наоборот. В своей схеме мы намеренно заложили необходимость переворота кабеля — таким образом можно прозвонить кабель прямо на устройстве и отладке, проверив его на соответствие стандарту USB 3.1. Пины сторон А на платах доступны, тогда как стороны В находятся под разъемом. 

Разработанная плата отладки для ESP-32 под ESP PROG. Слева Type-C для программируемого устройства Справа Type-C для отладки USB Стека микроконтроллера

Преимущества получившейся распиновки

1. Она совместима с USB Type-C на иных устройствах. Это позволяет смело подключать наше оборудования кабелем Type-C to Type-C в любые ПК, смартфоны и т. д.

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

а) отсутствию UART-данных от датчика,
б) морганию RX-диода на плате USB-UART в соответствии с тактами Blink.

3. У сервиса, и даже у пользователя, остается возможность прошить устройство без вскрытия. Это не всегда хорошо, но многие B2B-компании настаивают на такой возможности.

4. Унификация отладочной платы. Разработанная один раз печатная плата позволяет программировать и отлаживать любые МК, необходимо только переподключить программатор.

5. Не требуется пайка для отладки, достаточно заказать сборку прототипов на стороне и наслаждаться разработкой. Ну это ли не счастье?

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