пятница, 22 сентября 2017
Опубликовано Октябрь 13, 2013 автором
Oleg ArtamonovСегодня увидел вопрос — почему смартфон Samsung от родной зарядки заряжается значительно быстрее, чем от неродной, хотя параметры на них написаны одинаковые: 5 В, 2,1 А? Краткий ответ: потому что неродная не заточена спаявшим её китайцем на информирование смартфона о своих параметрах. А дальше напишу длинное техническое объяснение, почему так жизнь сложилась.
Исторически USB придумали во времена, когда смартфонов ещё не было, телефоны заряжались каждый от своего собственного фирменного зарядника, а с компьютером соединялись либо по дико медленному и неудобному инфракрасному порту, либо через фирменный кабель в COM-порт (позже, когда появились USB-кабели, долгое время они просто имели внутри микросхему транслятора USB-RS232). Впрочем, чаще всего телефоны тогда с компьютером вообще не соединялись, да.
Соответственно, правила подключения нагрузки к USB исходили из того, что эта нагрузка потребляет мощность для какой-то своей текущей, сиюминутной деятельности. То есть, как только её отключили — эта деятельность прекратилась; ни о какой зарядке аккумуляторов речи не шло. Соответственно, не было и такой сущности, как блок питания с разъёмом USB — у вас же нет блоков питания с разъёмом COM, LPT или PS/2, так? В результате, согласно спецификациям USB, подключение устройства должно происходить так:
читать дальшеПока шина USB не активирована — устройство потребляет не более 2,5 мА;
После активации шины (обнаружения хостом устройства и начала обмена данными) устройство имеет право потреблять до 100 мА
Далее устройство должно выполнить инициализацию и передать хосту своё описание, в частности, дескриптор bMaxPower, в котором указано, сколько устройство хочет потреблять
Далее устройство имеет право потреблять от хоста некоторую мощность только в случае, если хост такое потребление подтвердил
bMaxPower — это один байт, единица измерения потребления — 2 мА, соответственно, устройство теоретически могло попросить до 510 мА. В спецификациях USB прописалось число 500 мА.
Для нас здесь важны два пункта:
Устройство не может легально получить в своё распоряжение более 500 мА
Даже для получения 500 мА, согласно спецификациям, требуется обмен данными с хостом
Потом появились смартфоны, телефоны, плееры, планшеты и чёрт в ступе с разъёмом USB, от которого всё это многообразие логично было и заряжать. Для зарядки нам не надо в общем-то ничего, кроме напряжения, поэтому далее появились блоки питания с разъёмом USB, такую зарядку обеспечивающие. Но тут возникла проблема: как устройство поймёт, что оно подключено к блоку питания? Просто по наличию напряжения — нельзя: тогда оно будет считать таким же блоком питания и порт USB в компьютере, и будет потреблять от него свои 500 мА, даже не получив на это разрешения (понятно, что на практике многие устройства так и делали, но вообще-то это — нарушение спецификаций USB). Вставлять в каждый зарядник микроконтроллер, который будет проводить полную инициализацию подключённого устройства? Дорого.
Решение было простое: зарядное устройство (ЗУ) должно подавать на ненужные ему сигнальные линии D+ и D- USB-разъёма что-нибудь такое, чего USB-хост туда не подаёт. Например, можно закоротить эти линии друг на друга или на «плюс» питания (в USB-хосте они через резисторы притянуты к «земле»), а заряжаемое устройство, потыкавшись в них, сможет отличить ЗУ от настоящего хоста. И если видит ЗУ — то врубает зарядку без раздумий, если видит хост — начинает процедуру инициализации.
Никакого стандарта, как именно давать устройству понять, что перед ним ЗУ, на момент появления первых USB ЗУ не было. Поэтому разные производители делали это по-разному.
Но это ещё полбеды.
Мощности устройств и ёмкости их аккумуляторов росли, соответственно, зарядка током 500 мА стала занимать всё больше времени. Ток захотелось поднять. Со стороны ЗУ это сделать несложно — разъём USB физически способен выдержать до 5 А. Но, опять же, как устройство будет понимать, что от этого ЗУ можно брать больше 500 мА? Потому что если не будет — то оно просто будет перегружать (вплоть до выхода из строя) все ЗУ, рассчитанные на 500 мА максимум (а таковых в тот момент было подавляющее большинство).
Решение, опять же, было простым: с контактами D+ и D- в ЗУ можно сделать много такого, чего с ними никогда точно не сделает хост, и по этим их разным состояниям научить устройство определять, к какому ЗУ оно подключено. Например, если на D+ и D- напряжение +5 В, то устройство считает, что его включили в зарядник с током 500 мА, а если +5 В и 2,5 В — что в зарядник с током 1000 мА. Ну и так далее, и тому подобное.
К сожалению, никакого общепринятого стандарта на способ кодирования нагрузочной способности ЗУ не существует по сию пору. Из этого следует, что у разных производителей способы кодирования отличаются, и техника одного производителя может не понимать ЗУ другого. В лёгком (и наиболее частом) случае устройство, не опознавшее мощность ЗУ, просто будет заряжаться от него в безопасном режиме — 500 мА, и время зарядки значительно увеличится по сравнению с родным ЗУ, которое опознаётся правильно. В тяжёлом случае устройство вообще не поймёт, что перед ним ЗУ, и будет пытаться инициализировать порт так, как будто оно воткнуто в полноценный USB-хост (т.к. ему никто не ответит — зарядка просто не пойдёт). В смешном случае устройство решит, что ваше ЗУ способно на большее, чем оно способно на самом деле, и либо убьёт его, либо вгонит в защиту.
Соответственно, если вы покупаете либо родное ЗУ, либо ЗУ пристойного производителя, официально заявленное как совместимое с вашим смартфоном (плеером, планшетом, Tesla Model S или что у вас там будет заряжаться), то вы получаете гарантированную зарядку на той скорости, которую физически может позволить ЗУ и устройство. Если вы покупаете ЗУ, предназначенное для другого устройства, или китайское изделие, предназначенное неизвестно для чего, то во многих случаях вы получаете зарядку током 500 мА независимо от того, что написано на этикетке ЗУ.
Короткий вывод: хотите гарантированной работы — покупайте аксессуары, для которых работа гарантируется (с уважением, ваш К.О).
P.S. В настоящее время существует стандарт USB Battery Charging Specification 1.2, описывающий три типа USB-портов — обычный, для зарядки с передачей данных и только для зарядки, а также стандартизированные способы их определения (вкратце почитать про USB BC можно здесь, подробнее — понятно где). К сожалению, хотя он официально разрешает порты зарядки с током до 1,5 А, в объективной реальности он мало что меняет. Во-первых, там по-прежнему нет способов узнать, какую именно мощность умеет отдавать конкретное ЗУ (например, хотя порты типа DCP — Dedicated Charging Port, только для зарядки, без передачи данных — соответствующие USB BC 1.2, обязаны выдавать ток до 1,5 А, но напряжение на них при этом имеет право проседать до 2,0 В), во-вторых, и это ещё важнее, переход на USB BC ломает обратную совместимость ЗУ и устройств у производителей, которые уже использовали свои схемы определения типа ЗУ, причём ломает иногда совсем неприятно для пользователя — в стандарте нет способа определить, соответствует ли ему собственно ЗУ. Поэтому, если вы возьмёте устройство, соответствующее USB BC 1.2 (ток потребления до 1,5 А), и воткнёте в зарядку 5В/1А, у которой закорочены D+ и D- (самый распространённый способ сообщения устройству, что перед ним ЗУ, а не полноценный хост), то оно посчитает, что перед ним USB BC-совместимая зарядка, и начнёт честно жрать из неё свои 1,5 А. Зарядка либо сгорит, либо выключится. В результате производителям и устройств, и зарядок пока что нет никакого резона переходить на стандарт USB Battery Charging — удобнее для всех, включая пользователей, спокойно соблюдать статус кво.
olegart.ru/wordpress/2013/10/13/4045/
@темы:
технологии