この記事でわかること
・USBの特徴とバージョンによる違い
・USBコネクタの種類と各種信号の結線方法
・USBによるデータ転送の種類と仕組み
・ロジアナを用いたUSB信号計測
USBは Universal Serial Bus (ユニバーサル・シリアル・バス)の略称で、
直訳すると「汎用シリアル伝送方式による共用回線」となり、
様々な機器への複数接続が可能なシリアル通信です。
USB登場前のPCにはCOMポートが搭載され、
外部機器とRS-232C通信を行っていましたが、
現在、殆どのPCはUSBポートに置き換わっており、
PICマイコン等とシリアル通信を行う際はUSB通信を利用する必要があります。
本記事では、USB通信を用いるための基礎知識として、
USBの特徴とバージョンによる違いや、コネクタへの信号結線方法、
データ転送の仕組み等について解説します。
USB通信の特徴
USB通信の特徴は以下の通りです。
・通信構成
PCなどの親機となる1台のUSBホストに、
プリンタなどの周辺機器であるUSBデバイスを複数台接続できます。
※以下、本記事ではUSB ホストとUSBデバイスを、単にホスト、デバイスと呼びます。

USBのデータ転送はホストからの要求に対し、デバイスが応答する形をとるため、
デバイス同士の通信はできません。
・転送速度が高速
シリアル通信の転送速度はRS-232Cが20kbps、RS-422やRS-485は10Mbpsなのに対し、
USBは最も古いバージョンのUSB 1.0でも、12Mbps (Full-Speedモード時)と高速です。
・接続台数が多い
RS-232Cは1対1接続、RS-422/RS-485は最大32台に対し、
USBは最大127台(※)まで接続が可能です。(※ハブの数も含む)
ホストのUSBコネクタの数が足りない場合は
ハブ(HUB)と呼ばれる分岐装置を使うことで拡張できます。
(ハブは最大5段まで接続可能)

・デバイスへの電力供給が可能
USBケーブルは通信線以外に電源線があり、
これによってホストからデバイスに電源を供給できます。
電源の供給能力は、USBのバージョンによって異なります。(詳細は後述)
また、USBコネクタの接続時は電源ピンが信号ピンより先に繋がり、
抜く時は信号ピンが先に外れるようにピン配置が工夫(※)されていることから、
電源を入れたままコネクタの抜き差しが可能なホットプラグ機能を有しています。
※ピン位置については後で図に記載
・プラグ アンド プレイに対応
デバイスを接続したら、デバイスが使用可能になるように、
ホスト(PC)のOSが自動的にデバイスドライバのインストールを行う等、必要な設定を行います。
USBのバージョン
2025年現在、バージョンは1.0から4まであり、通信速度や電源供給能力に違いがありますが、
ホストとデバイスのバージョンが違っても、古いバージョンに合わせて通信を行います。
※バージョン表記について
USB4以外は「USB 1.0」など、USBと数字の間にスペースが入り、数字には小数点がつきますが、
USB4にはスペースが入らず、小数点もありません。(例:USB4 Version 2.0)
USBの各バージョンの主な仕様は以下の通りです。
新しいバージョンほど転送速度が速いですが、伝送距離は逆に短くなります。

各バージョンの特徴について補足します。
・USB 1.0 / USB 1.1
USB 1.1はUSB 1.0の電気的仕様を詳細に規定したもので性能は同じです。
転送速度は12MbpsのFull-Speedモードの他に1.5MbpsのLow-Speedモードがあります。
Low-Speedモードは、マウスやキーボード等の低速でコスト重視の機器を対象としたもので、
ケーブルにシールドやツイスト処理をする必要がありません。 (但し、伝送距離は3mに短縮します)
・USB 2.0
USB 1.1に480MbpsのHigh-Speedモードが追加されたもので、
電源供給能力やコネクタ形状はUSB 1.1と同じです。
但し、High-Speedモードはデータ信号電圧(Hレベル時)が3.3Vから400mVと低電圧になり、
1bitの期間も2nsと非常に短いため、一般的なオシロスコープでは測定が困難です。
また、PICマイコンとのシリアル通信で使用されるUSBシリアル変換ICの多くは、
下位モードのFull-Speed対応であることが多いことから、
本記事ではFull-Speedモードを中心にして解説していきます。
・USB 3.0 / USB 3.1 / USB 3.2
USB 2.0にSuper-Speedモードが追加されており、他モードで使用するデータ信号(D±)とは別に
受信/送信別の高速通信信号(SSRX±、SSTX±、専用GND)が設けられています。
これにより、信号線の数が増えたことから、
一部のコネクタ形状がUSB 2.0とは異なります。(詳しくは後述)
USB 3.1とUSB 3.2の後に続くGenは Generation(世代) の略で、転送速度の性能を表し、
Gen1=5Gbps、Gen2=10Gbps、Gen3=20Gbpsとなります。
USB 3.1には、USB 3.0が名称変更した5GbpsのUSB 3.1 Gen1と、
10Gbpsに高速化したUSB 3.1 Gen2があります。
USB 3.2では、Genの後に「×通信回線数」が付加されており、
USB3.1 Gen1 とGen2をそれぞれ名称変更したUSB3.2 Gen1×1、USB3.2 Gen2×1と、
10Gbpsを2回線(デュアルレーン)使用して20Gbpsに高速化したUSB 3.2 Gen2×2があります。
・USB4
表に記載しているのは、USB4 Version 1.0で、
20Gbps(Gen2x2)と、40Gbps(Gen3x2)の2つの速度モードが定義されています。
2022年にはUSB4 Version 2.0が登場し、80Gbpsにアップしました。
コネクタについては、USB4からはType-Cに統一されています。
USBコネクタの種類
コネクタのオス側を「プラグ」、メス側は「レセプタクル」と呼びますが、
ここではオス、メスと記載します。
TYPE-AとTYPE-B

Type-AはPCなどのホスト側に使用され、Type-Bは周辺機器などのデバイス側に使用されます。
USB 2.0までは信号ピン2本、電源ピン2本の計4ピンで構成されていますが、
USB 3.0からはHigh-Speedモード用の送信信号(SSTX+、SSTX‐)と
受信信号(SSRX+、SSRX-)、専用GNDの5本が追加され、計9ピンとなっています。

ピン数増加で、USB 3.0以降のTYPE-Bはコネクタ上部を拡大させた形状となっていることから、
USB 2.0のTYPE-BのオスはUSB 3.0のメスに接続できますが、
USB 3.0のオスはUSB 2.0のメスには入りません。
Type-Aについては、USB 2.0の4本のピンの奥に互い違いになるように5本を追加配置することで、
USB 3.0以降でも同じコネクタ形状となっています。

Type-A、Type-B共に、USB 3.0以降はコネクタ内部が青色になっており、
Super-Speedを表すSSマークが付いていることもあります。
USBコネクタ内の信号
ツイストペアのデータ信号(D+、D-)と電源線(VBUS、GND)、シールド線から構成されます。
電線径はデータ信号とシールドの引き出しにはAWG28、電源線にはAWG20~28が使用されます。
(Low-Speedモードの場合はツイストペアでなくても良く、シールド線も省略可能)

データ信号(D+、D-)は2つの信号線の電位差を使った差動信号で、
NRZIと呼ばれる符号化方式を用いてデータの0と1を表現します。(NRZIについては後述)
電源線はDC5Vですが、この後登場するTYPE-Cコネクタについては、
USB PD (USB Power Delivery) 対応の場合、最大20V(USB4では48V)になるので注意が必要です。
コネクタからの信号処理
データ信号線は以下のルールに従い、回路内でプルアップやプルダウンを行います。
※プルアップ、プルダウンについては下記記事で解説しています。
ホスト側(ハブのデバイス接続側も含む)
D+、D-とも、15kΩでプルダウン (※1)
デバイス側
D+を1.5kΩでプルアップ(Full-Speed又はHigh-Speedモード時 (※1))
D-を1.5kΩでプルアップ(Low-Speedモード時)

この処理によって、ホスト側はD+、D-が共にLレベルならデバイス未接続、
D+がHレベルなら、Full-speed又はHigh-Speedモードのデバイスが接続、
D-がHレベルなら、Low-Speedモードのデバイスが接続されたと判断できます。
※1:Full-speedとHigh-Speedモードの判定ですが、最初はFull-speedモードで接続し、ホストからのリセット時に
デバイス側からHigh-Speed検知信号をホストに送信することでHigh-Speedモードに切り替わります。
この時、ホストとデバイス共にD±を45Ωのプルダウンに切り替えます。
一般的に販売されているUSB通信ICの多くは、これらの抵抗が内蔵されています。
Mini-BとMicro-B

Mini-BはUSB 2.0から登場しましたがUSB 3.0以降は対象外となり、
利用している機器は少ないです。
Mini-Bの少し後に出たMicro-BについてはUSB 3.0以降もありますが、
TYPE-Bと同様にUSB 2.0とコネクタ形状が異なります。

Micro-Bには5本目のピンとしてIDが追加されています。
これは、OTG(On The Go)機能で、ホストとデバイスのどちらにもなれる機能であり、
ホスト側でGND接続することで、デバイス側は接続相手がホストであることを認識できます。
Mini-BとMiro-Bの末尾BはTYPE-Bと同じようにデバイス用を意味しており、
ホスト用のMini-AとMicro-Aも存在しますが、使用している製品は殆どありません。
Type-C
表裏どちらでも挿入可能なコネクタで、ホスト側でもデバイス側でも使用できます。

このため、ホスト/デバイス側どちらかなのかを検知できるように
CC(Configuration Channel)信号が設けられています。
このCC信号ですが、ホスト側はプルアップ、デバイス側はプルダウンします。
この時のプルアップ抵抗、プルダウン抵抗値は下図に従います。

ここで、CC信号電圧はプルアップ、プルダウン抵抗による抵抗比によって決まるので、
この電圧値を基にして、ホスト側はデバイスが接続されたことを認識し、電源を供給します。
デバイス側はこの電圧値でホストの電源供給能力を知ることができます。
ホスト同士やデバイス同士が接続された場合は、電圧値が条件を満たさないため、
通信も電源供給も行いません。
このため、ケーブルのTYPE-Cコネクタを無理やりTYPE-AやTYPE-Bに変換して接続すると、
CC信号が接続されずに上記の認識が正しく行わなくなり、
電源供給に異常が生じる恐れがあります。
(TYPE-AやTYPE-BのケーブルコネクタをTYPE-Cコネクタに変換するのはOK)

TYPE-Cのコネクタは表裏を気にせずに挿入できるように、
ピン配置が基本的には上下対称になっていますが、
USB 3.2 Gen2×2やUSB4は高速化のため、送受信信号をそれぞれ2回線確保するために、
上段側のTX±をTX1±、下段側をTX2±に分けています。(RX側も同様)
このため、コネクタの上下段を認識する必要があり、これもCC信号で検知します。
その仕組みですが、USBケーブルのCC信号は1本しかないため、
この時、ケーブルのCC信号に接続されていないコネクタ側のCC1又はCC2は電圧がゼロとなり、
CC1電圧とCC2電圧の組合せからコネクタが表裏どちらで接続されているか検知できます。
最後に注意点として、TYPE-Cコネクタの電源ピン(VBUS)の電圧は必ずしもDC5Vでは無く、
USB PD(USB Power Delivery)対応だと最大20V(USB4では48V)になります。
DC5Vからの電圧変更はUSB PD準拠の通信手順に従い、主にCC信号を用いて行われ、
デバイスからホストに対し、給電して欲しい電圧を要求することでホストが電圧を変更します。
USB のデータ転送形式
ここでは、一般的なUSBシリアル変換ICの多くで利用されている
USB 1.1のFull- Speedモードにおけるデータ転送形式について解説します。
(USB 2.0のHi-Speedモードは本内容に一部仕様を追加したものです)
NRZIによる差動信号の符号化
2つのデータ信号(D+、D-)の信号レベル(H/L)を用いて、
NRZIと呼ばれる符号化方式を用いてデータの0と1を表現します。

NRZIはNon Return to Zero Invertの略で、直訳すると「非ゼロ復帰反転」ですが、
これは、ビット毎に一度電圧をゼロに復帰(リセット)せず、
ビットデータが0の時のみ電圧を反転させることを意味します。
つまり、データが0なら信号レベルを反転させ、1なら信号レベルを変化させません。
この方法は信号の帯域幅(周波数の変動幅)を小さく抑えることができ、高速伝送に適しています。
但し、1が長く続くデータの場合、信号レベルが長期間変化しなくなり、
送信側と受信側で同期タイミングのずれが発生する可能性があるため、
1が6回(bit:ビット)続いた時は、0を1個挿入するようにしています。
これをビットスタッフィングと呼びます。
また、D+、D-共にLレベルの時はリセット状態を示します。

このように符号化形式が複雑なため、USB信号の測定には波形を自動的にデータ変換してくれる
ロジックアナライザ(ロジアナ)を用いると便利です。
転送データの構成
USBでは一定時間内にホストが複数のデバイスと通信を行い、それを周期的に繰り返します。
この一定時間はフレームと呼ばれ、Low-SpeedとFull-Speedモードでは1msです。
(High-Speedモードでは1フレームが8分割され、125usのマイクロフレームに区切られます)
フレーム(マイクロフレーム)の内部構成を以下に示します。

先頭には、フレームの開始を示すフレーム開始パケット(SOF:Start Of Frame)があり、
その後に複数のトランザクションと呼ばれる処理単位から構成されます。
このトランザクションを組み合わせてデータ転送を形成し、各デバイスと通信を行います。
データ転送には図に示すバルク転送など複数の種類があります。(後で詳述)

パケットはUSB通信における最小の通信単位で、
SOF以外のパケット(トークン、データ、ハンドシェイク)によって
トランザクションを構成しています。

・トークンパケット
トークンとは指示票のことで、通信の種類(以下の3つ)を指定するため、ホストが発行します。
設定(SETUP) :コントロール転送を開始(コントロール転送については後述)
入力(IN) :デバイスに対し、データの送信を要求
出力(OUT) :デバイスへの送信処理の開始
※IN、OUTはホストから見た場合のデータ転送の方向を示す。
・データパケット
送受信するデータが入っており、上記トークンの指示に従い、ホストかデバイスが発行します。
データはバイト単位でセットでき、最大1023バイトと図には記載されていますが、
Low-Speedモードは8バイト以内です。
・ハンドシェイクパケット
データパケットに対する受信の成功/失敗や異常通知を行います。
このパケットを発行するのはデータパケットとは逆で、
データパケットの発行がホストならばデバイスが発行し、デバイスならばホストが発行します。
肯定応答 (ACK:ACKnowledgement):受信成功
否定応答 (NAK:Negative ACKnowledgement):受信失敗(※)
※今は他の処理で忙しくて対応不可なので、後で再送してという意味です。
(割込み転送で送信データがないことをホストに通知する場合にも使用)
不能応答 (STALL) :通信異常状態
各パケットの内部構成は以下の通りです。
・SYNC(同期パターン)
受信側が同期を取るための8bitのデータ(1000 0000)パターンで、全パケットの先頭にあります。

・PID(パケット識別子)
パケットの種類(下表)を示します。
受信誤り防止のため、PID番号4bitと、その値をビット反転した値4bitを送信する構成です。
全てのパケットのSYNC後にあります。


・フレーム番号
ホストにより、フレーム番号が連番で自動的に取得されます。

・ADDR(アドレス)
どのデバイス宛かを示します。7bitで127個のデバイスを指定できます。(アドレス0は無効)

・ENDP(エンドポイント)
エンドポイントの番号を指定します。(エンドポイントについては後述)

・CRC(巡回冗長検査)
受信データ(SYNCとPIDを除いた部分)の誤り検出を行います。

送信側は送信データを決められた数値(生成多項式)で割った余りの値をCRCに入れ、
受信側も受信データをその値で割った余りの値が一致するかで誤りの有無を判定します。
データ部分のbit数が多いデータパケットは16bit、それ以外のパケットは5bitで構成されます。

パケットが終わると、2bit分のSE0(シングルエンドゼロ:D±信号が共にLレベルの状態)と、
1bit以上のJステート(※)になることでパケットが終了したことを示します。
この信号波形をEOP(End Of Packet)と呼びます。
※速度モード(デバイス側のプルアップ抵抗)によってJステートの信号状態は異なります。
Low-speedモード時 :D+=Lレベル、D-=Hレベル(差動0)
Full-speedモード時 : D+=Hレベル、D-=Lレベル(差動1)
エンドポイントとは
ホストとのデータ転送を行うために、デバイスに設けた仮想的な通信接続口のことです。
仮想的と言うのは、実際のホストとの通信は1本(※)のUSBケーブルで行いますが、
デバイス内にFIFOバッファメモリ(※)を設けることで、
ホストとの間に複数の通信線が存在するかの様に動作するためです。
※ホスト(PC)に複数のUSBポートがあっても、PC内では1本の回線としてまとめられている。
※FIFO(First In First Out:先入れ先出し)先に書込んだデータから読み出していくメモリ

複数の通信線を設ける理由ですが、
ホストからのデータ転送や送信要求に対する応答をデバイス内のCPUで行うと時間がかかり、
デバイスが多数接続された場合、USB回線が渋滞してしまいます。
このため、デバイス内にCPUとは別にUSBコントローラを設け、
ホストからの応答処理を行うと共に、受信データをFIFOに入れたり、
FIFOにある送信データを送信する処理を担当します。
これによって、CPUはUSBの送受信タイミングとは関係なく、
FIFOメモリの読み書きを行うことで、
CPUは応答時間を気にせずに送受信データを処理できることから、
他のデバイスが存在しない専用回線を使用しているように扱うことができます。
このホストとの専用回線となるエンドポイントは各デバイス毎のみならず、
一つのデバイス内にも複数設けることができ、
多数のデバイスが接続されても、回線の渋滞を回避できます。
※一つのデバイスの遅延が回線の渋滞を発生させないだけで、
接続数が多ければ、その分デバイス毎の転送速度が低下する可能性が高くなります。
各エンドポイントには番号が割り振られ、
ホストはデバイスのアドレスとエンドポイント番号を使って指定したデバイスにアクセスします。
エンドポイントの番号はFull-Speedモードの場合で0~15、Low-Speedモードでは0~2ですが、
デバイスによっては、この上限値よりも小さい場合があります。
このうち、エンドポイント0はコントロール・エンドポイントと呼ばれるもので、
コントロール転送(各種設定に使用:詳細は後述)に使用され、
全てのデバイスに必ず設けられています。
エンドポイントの転送方向についてもデバイスで設定できますが、
双方向で使用できるエンドポイント0以外は単方向(IN、又はOUT転送)になります。
(USB 3.0からは双方向が設定可能)
トランザクションの種類
トランザクションはトークン、データ、ハンドシェイクの3つのフェーズから構成されています。
(但し、後述するアイソクロナス転送のトランザクションにはハンドシェイクフェーズが無い)
各フェーズには上述した各パケットが用いられます。

トランザクションには以下の種類があります。
・セットアップトランザクション
コントール転送のみに使用されるトランザクションです。
コントロール転送は、ホストとデバイス間の設定情報の送受信などに使用されるもので、
複数ある転送モードのうち、必ず行われる転送です。(詳しくは後述)
このトランザクションで、ホストがデバイスに対して指示を伝えます。
指示の内容は、ホストからのデータを受信する準備や、
ホストが要求するデータを送信できるように準備させます。
・OUTトランザクション
ホストからデバイスへデータを転送します。
・INトランザクション
デバイスからホストにデータを転送します。
また、OUT及びINトランザクションにはハンドシェイクフェーズを持たない
アイソクロナス転送用があります。(アイソクロナス転送についてはこの後説明)
転送モード
USB通信では、上記のトランザクションを使用し、
送受信されるデータの内容に応じて4種類の転送方式を使い分けています。
(但し、Low-Speedモードはコントロール転送とインタラプト転送の2種類のみ使用可能)

・コントロール転送
デバイスの初期設定やホストとデバイス間の設定情報の送受信などに使用されます。
この転送によって、ホストはどんなデバイスが接続されたか認識するため、
全てのデバイスはコントロール転送を使用できるようになっています。
データステージでは必要に応じ、複数のIN/OUTトランザクションが行われ、
その場合はDATA0 とDATA1 を交互に使用します。
・インタラプト転送
名称にインタラプト(割込み)とありますが、
一般的なソフトの割込み処理と違い、デバイスから割込みを発生させて転送するのではなく、
ホストが一定周期でデバイスに問い合わせすることで行われる少容量のデータ転送で、
マウスやキーボードなどからのデータ転送や、プリンタからの状態通知などに使用します。
・バルク転送
バルクとは「大量」という意味で、プリンタやスキャナ、記憶装置など
時間的に制約のない大量のデータ転送に使用されます。
ただし、他の転送モードより優先順位は低くなっています。
・アイソクロナス転送
アイソクロナスとは等時(間隔)性という意味で、データを一定間隔で大量に転送できるため、
動画や音声のようなリアルタイム性を必要とする場合に使用します。
この転送は短い周期で次々とデータ転送ができるように、
受信エラーが発生しても再送要求をしないようにしている為、
各トランザクションにおいてハンドシェイクパケットを発行しません。
USB通信の測定
ここでは、PCとUSBシリアル変換モジュール間でのコントロール転送信号を測定しました。

このUSBシリアル変換モジュールは、PICマイコン等のUART信号をUSB信号に変換するもので、
USB関連では定番メーカーであるFTDI社製のUSBシリアル変換IC FT234XDが搭載されており、
Full-Speedモードに対応しています。

USBシリアル変換モジュールの詳細は下記記事で解説しています。
測定には、ZEROPLUS製の低価格ロジアナLAP-C(16032)を使用しました。

本ロジアナについては下記記事で解説しています。
測定したパケットリストは見やすいように一部編集しました。

SOFパケットでフレームが開始され、
セットアップトランザクションによるセットアップステージが行われます。
トークンパケットがSETUPなので、コントロール転送を開始することをデバイスに伝えます。
そして、データパケットによりデバイスからホストへのデータ転送要求であることも伝えます。
これを受けて、デバイスはハンドシェイクパケットでACKを返して了解します。
次にデータステージですが、セットアップステージで伝えた通り、
このコントロール転送ではデバイスからのデータ受信を行うINトランザクションが行われます。
このケースではINトランザクションが複数回行われており、
最初のINトランザクションではホストからのトークンパケット(IN)による送信要求に対し、
デバイスは他の処理中で対応できないため、ハンドシェイクパケットでNAKを返しています。
その後、INトランザクションが2回行われますが、NAKを返しており、
3回目にようやくデバイスがデータパケット(DATA1)でデータを送信し、
ホストがデータ受信できたことをハンドシェイクパケットでACKを返します。
データは8バイト単位で送信されており、DATA0 とDATA1 を交互に使用します。
ここでは、途中NAKを挟みながら、計3回のINトランザクションで送信しています。
最後にステータスステージですが、データステージがINトランザクションだったので、
逆のOUTトランザクションになります。
このステージは、コントロール転送が終了することをデバイスに通知するのが目的なので、
データパケットのデータ部はありません。
この後、次のSOFパケットがホストから発行されるまでの1msが1フレーム期間となります。