Как избавиться от дополнительных разъемов на печатной плате 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 под любые микроконтроллеры
От универсального разъема мы хотели добиться решения следующих задач и придумали вот такую распиновку:
Передача питания. Для этого мы оставили стандартные контакты GND и +5В.
Передача данных USB. Для работы как устройство USB slave использовали пины А/В 6 и А/В 7 на Type-C + подтяжку к земле по пинам А/В 5 (все согласно требованиям стандарта).
Отладка. Вывели Blink на сторону платы отладки через пин А10, так как не всегда устройства имеют встроенный светодиод.
Прошивка. Мы хотели сделать унификацию со мн��гими отладчиками, среди которых 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, получаем следующую картину:

В результате мы получили распиновку, которая позволяет реализовать следующие подключения, вместе с передачей питания +5В и D+/D- для USB 2.0:
UART + Blink + JTAG (serial debug + ST-link/ESP-PROG/JTAG/cJTAG)
UART + Blink + SWD (serial debug + ST-link/Миландр)
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 - Type-C USB 3.1 выглядит следующим образом:

Из нашего опыта мы создали следующую инструкцию по тому, как выбрать правильный кабель:
Смотрите отзывы. Если в них пишут про успешную работу макбука/ноутбука с монитором, вы на правильном пути;
Выбирайте пропускную способность от 10 ГБит/с;
Если есть упоминание Thunderbolt 3, то 99% полножильный кабель;
Проверяйте кабель через платы Type-C test-plug (как на фото выше).
Да прибудет с вами удача, ибо разнообразие Type-C стандартов для кабелей, покрытое разнообразием уловок продавцов превращает простую закупку в интересный квест.
Распиновка на стороне отладочной платы
Если вы изначально думали, что жилы Type-C идут «напрямую» от А1 к А1, от А2 к А2 и т. д., то спешу вас разочаровать — мы тоже так изначально подумали и развели первую плату неверно. Как показала работа над ошибками, схема коммутации жил внутри кабеля оказалась следующей:

Если присмотреться, она хитросплетенная и зеркальная, некоторые жилы со стороны А приходят на сторону В и наоборот. В своей схеме мы намеренно заложили необходимость переворота кабеля — таким образом можно прозвонить кабель прямо на устройстве и отладке, проверив его на соответствие стандарту USB 3.1. Пины сторон А на платах доступны, тогда как стороны В находятся под разъемом.
Преимущества получившейся распиновки
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. Буду рад вашим замечаниям и комментариям!
