USB PD はなぜ5Vから始めるのか
差した瞬間に20Vが出ていたら、5V専用の機器は一発で壊れます。USB PD はそれを避けるために、抵抗だけで決まる段階と、通信してから電圧を動かす段階に分かれています。
いきなり20Vを出さない理由
USB Type-C のコネクタは、5V 0.5A しか受け取らない機器にも、20V 5A を受け取るノートPCにも同じ形で刺さります。ケーブルの向きも表裏どちらでも刺さります。
つまりソース側は、差された瞬間には 相手が何ボルトまで耐えるかを知りません。ここで20Vを出していると、5V専用の機器を挿した人は一発で壊すことになります。
そこで USB PD は順番を固定しています。まず 5V(vSafe5V、4.75〜5.5V)だけを出す。相手と話がついて、相手が明示的に要求したときだけ、その電圧へ動かす。電圧が上がるのは常に、シンクが自分から要求したあとです。
通信の前に、抵抗だけで決まること
最初の段階には通信がありません。CC1 / CC2 の2本にぶら下がった抵抗の分圧だけで、接続の有無・ケーブルの向き・5Vで流していい電流が決まります。
ソースは CC を Rp でプルアップし、シンクは Rd = 5.1kΩ でプルダウンします。ソースから見て「CCが引き下げられたほう」が、いま結線されている側です。これで向きが決まります。
シンクから見ると、CC の電圧がそのまま「5Vで何アンペアまで取っていいか」の広告になっています。
| ソースの Rp(5Vプルアップ) | 等価な電流源 | シンクが見る CC 電圧 | 許される電流 |
|---|---|---|---|
| 56kΩ | 80µA | 0.20〜0.66V | USB既定(0.5A / 0.9A) |
| 22kΩ | 180µA | 0.66〜1.23V | 1.5A |
| 10kΩ | 330µA | 1.23V 以上 | 3.0A |
ここが効いてくるのは、PDのICを載せなくても5V 3Aまでなら取れるという点です。5.1kΩを1本入れて CC の電圧を見るだけで済みます。逆に、5Vより上が欲しければ必ず通信が要ります。
もう1本の CC はケーブル側で使われます。eMarker 入りのケーブルは Ra(800Ω〜1.2kΩ) でその線を引き下げていて、ソースは Ra を見つけると、そこを VCONN として給電し、ケーブル内のチップと話します。5A を流すにはこの eMarker が必須です。
交渉の順番
5Vが出た状態から先は、CC を使った通信になります。順番は決まっています。
- Source_Capabilities:ソースが「自分はこれが出せる」という一覧(5V/3A、9V/3A、20V/5A…)を送る
- Request:シンクが一覧の中から1つ選んで要求する
- Accept:ソースが受理する。この時点ではまだ電圧は動いていません
- PS_RDY:電圧が新しい値に落ち着いてから、ソースが「準備できた」と送る
各メッセージには受信側から GoodCRC が返ります。届いたことの確認だけを担当する短い返事で、中身の合意とは別です。
時間の制約もそれぞれ決まっています。相手の返事を待つ tSenderResponse は 24〜30ms(PD 2.0)/27〜33ms(PD 3.0)。Accept を送ってから電圧を動かしはじめるまでの tSrcTransition が 25〜35ms。電圧遷移そのものを終える tPSTransition が最大 550ms です。
大事なのは Accept と PS_RDY のあいだで、ここが電圧の動いている区間です。シンク側にも義務があって、この区間は「古い契約と新しい契約の、電流の小さいほう」まで負荷を落としておかなければなりません。20Vを要求した直後に全力で電流を引くと、ソースは電圧を持ち上げられません。
上げるときと、下げるとき
同じ「550ms以内」でも、上げと下げは難しさが違います。
上げるときは、ソースが能動的に電流を出して VBUS とシンク側の入力コンデンサを充電します。時間はソースの設計で決まるので、素直です。
下げるときが厄介です。ソースは電流を出せても、吸い込めるとは限りません。20Vから5Vへ落ちる速さは、VBUS の総容量と、そのとき負荷が引いている電流で決まります。シンクが省電力に入って数mAしか引いていなければ、電圧はなかなか落ちません。
そのため、電圧を下げられるソースには放電回路(VBUS を能動的に引き下げるFET)がだいたい入っています。ここを省くと、軽負荷のときだけ tPSTransition に間に合わない、という再現性の悪い不具合になります。
検証するときは、負荷が軽い状態での降圧を必ず見てください。重い負荷では勝手に落ちるので問題が隠れます。
交渉が壊れたときの Hard Reset
交渉が破綻したときは、途中から復旧するのではなく 最初からやり直します。それが Hard Reset です。
ソースは VBUS を vSafe0V(0.8V以下)まで落とします。ここまでが tSafe0V で 650ms 以内。そのあと tSrcRecover(660〜1000ms)待ってから、また vSafe5V を出します。5Vからの再スタートです。
電源が1秒近く完全に切れるので、シンク側はここで落ちます。「PD対応の機器をつなぐと、ときどき再起動する」という症状を追いかけると、たいていこの Hard Reset に行き当たります。
設計するときに引っかかるところ
- シンクの入力コンデンサに突入する。5Vから20Vへ上がるとき、入力容量には ΔV ぶんの充電電流が流れます。100µF なら 15V の上昇で 1.5mC。550ms かけて上げるなら平均 2.7mA ですが、ソースのスルーレートが速いと瞬間はずっと大きくなります。
- 5V用の回路が20Vを見ないようにする。要求した電圧が来てから後段を投入する順番にします。PDコントローラの PS_RDY 相当の出力で負荷スイッチを入れるのが素直です。
- eMarker の無いケーブルは3Aまで。5A を通すにはケーブル側のチップが必要です。20V 5A(100W)を想定した設計で、手元のケーブルが3Aだったという取り違えはよくあります。
- 電圧が固定とは限らない。PPS(Programmable Power Supply)を使うと 20mV 刻みで電圧を指定できます。充電器としては便利ですが、負荷側から見ると「電圧が動く電源」になるので、後段の設計が変わります。
- 48V まで上がる版がある。PD 3.1 の EPR は 28V / 36V / 48V を追加していて、最大 240W です。SPR(20Vまで)とは入り口の手順から違うので、対応するなら別物として扱ってください。
よくある質問
PDのICを載せずに、Type-Cから電源を取れますか?
Accept が返ってきたのに電圧が変わりません。
降圧のときだけ、たまに落ちます。
100W を想定したのに 60W しか出ません。
参考にした規格・資料
- USB Power Delivery Specification(USB-IF) — メッセージの定義と、tSenderResponse / tSrcTransition / tPSTransition / tSrcRecover などのタイミング
- USB Type-C Cable and Connector Specification(USB-IF) — Rp / Rd / Ra の値、CC の電圧しきい値、VCONN と eMarker
- USB Power Delivery Compliance Test Specification(USB-IF) — 各タイミングの測定条件