This is an old revision of the document!
Table of Contents
Введение
Обсуждая процессы чтения маркера и измерения сопротивления кабелей, я обнаружил, что знание процесса подключения устройств к зарядке кабелем Type C относится к очень мифологизированному процессу. Поэтому и решил написать статью, где подробно описать, что происходит на шине во время подключения устройства.
Приборы и материалы
Опыт
В дальнейшем описании будем рассматривать следующие простые действия.
- Подключаем тестер к павербанку
- Подключаем кабель к телефону
- Включаем запись на тестере
- Подключаем второй конец кабеля к тестеру
- Ждём
- Разъединяем кабель (со стороны тестера), переворачиваем его и подключаем снова
- Ждём
- Разъединяем кабель (со стороны тестера)
- Выключаем запись
Вольты и амперы
Начнем с простого вида: напряжение и ток на VBUS.
Выглядит просто. Пока кабель отключен, на VBUS ничего не подаётся. Подключаем кабель, аналоговое согласование резисторами проходит и источник подаёт напряжение 5V. После этого телефон читает профили источника и выбирает 9V, которые ему источники предоставляет. Процесс подключения небыстрый, может длиться до 200 ms. А процесс отключения вообще теплый и аналоговый, видно, как плавно падает напряжение.
Теперь добавим на график напряжение на CC1 и CC2:
Стало интереснее и сложнее. Начнём с середины, с того, что у нас при подключенном кабеле. А там на одном CCx 3.2V, а на CCy 1.7V. Напряжение 1.7V соответствует pull-up резистору 10 kOhm у источника, то есть павербанк обещает до 5V 3A на VBUS. То есть во время первого коннекта CC был на CC2 (смотри легенду в верхнем левом углу), а во время второго на CC1. А напряжение 3.2V указывает на то, что маркер кабеля запросил питание на втором контакте (последовательно CC1 и CC2) и получил низкое напряжение, которое и держал всё время, пока телефон был подключен.
А теперь увеличим фрагмент с подключением кабеля.
До 3.183 видны пики, которые обозначают что источник подаёт на CC1 и CC2 напряжение и смотрит, пошел ли ток. Пики длительностью 40-50ms и отсутствие падения напряжения говорит о том, что устройства с pull-down резистором нет.
Подключение второй стороны обнаруживается в 3.404, когда появляется pull-down резистор телефона и напряжение 1.7V на CC2 указывает на коннект устройства. И дальше на CC2 (его уже можно называть CC) держится напряжение, на котором видны всплески модуляции пакетов PD.
А что со второй линией CC1? Через 150ms после подключения там устанавливается напряжение VCONN для питания маркера, то есть источник увидел резистор rA на VCONN и выдал напряжение.
Следующая точка - через 550ms от коннекта источник подаёт 5V на VBUS. Управление напряжением на VBUS и VCONN происходят независимо, VBUS можно поднимать сразу же, а VCONN может подниматься после обнаружения резистора на VCONN. Зачем нужен аналоговый способ (с помощью резисторов) для подачи напряжения на VBUS? Для а) потребителей без собственного питания, б) для простых устройств, для которых отдельный чип управления PD - это оверкилл и в) для запуска устройст с пустой батареей. А вот почему стандарт USB решил, что не нужно сразу подавать 5V на VBUS - это другой вопрос с непростым ответом.
И последние интересные точки на графике - это общение по протоколу Power Delivery для переключения VBUS на 9V. Колебания на линии CC (CC2) незадолго до поднятия напряжения - это и есть взаимодействие PD.
Перечислим увиденные события
- Обнаружение коннекта и выбор линии CC
- Обнаружение запроса на питание маркера и подача напряжения на VCONN
- Подача 5V на VBUS (эти два пункта независимы)
- Переключение на общение протоколом PD по линии CC
А теперь Power Delivery
Еще на шаг глубже в детали протокола, теперь посмотрим на взаимодействие по протоколу PD. Как я писал выше, экран PD Analyzer тестера позволяет видеть пакеты, но к сожалению имеет низкую дискретность измерения напряжений. Поэтому мы будем рассматривать другой замер:
Видите отличия? Из-за меньшего числа точек мониторинг в неподключенном состоянии схлопнулся до острых пиков. Второй отличие уже в характере подключения: на VBUS и VCONN напряжение подаётся одновременно, так что нужно всегда понимать, что подача двух напряжений асинхронна и независима.
Но самое ценное на этом графике, что компенсирует все шероховатости - это возможность увидеть на графике временные точки событий power delivery. Видите две вертикальные черты? Первая - это событие “Attach: CC1” (мы помним, что CC становится та линия, где напряжение будет 1.7V), а второе, подписанное как “Vendor defined” - это запрос маркера у кабеля. Вместо убранных модуляций на CC мы теперь напрямую видим запросы по линии CC.
Протокол PD включается не сразу, в стандарте заданы таймауты после выставления напряжения на VBUS и VCONN. А вот сами транзакции на шине происходят довольно оперативно. Первый блок обмена данными - это сообщения 2-12, сразу перед повышением напряжения до 9V. Там всё просто:
- (2) Источник запрашивает у кабеля маркер командой Discover Identity (направление и контрагенты видны в столбце Direction)
- (4) Маркер возвращает в ответе данные о кабеле
- (6) Источник формирует список профилей в пакете Source Cap
- (8) Потребитель запрашивает (Request) профиль 9V 2.2A
- (10) Источник подтвержает запрос (Accept) и переключает напржение на VBUS
- После Acceptа мы видим рост напряждения на VBUS
- (12) После роста напряжения источник рапортует о включении нового профиля (PS RDY). Все предыдущие команды занимали порядка 5-10 ms, а эта пошла через 200 ms после Accept
Оставшиеся команды - это запросы возможностей источника как потребителя (павербанк в своих возможностях указал про то, что он может менять роль, вот телефон и поинтересовался). Но нам это уже не так интересно.
