USBの通信プロトコル


【USB仕様と転送速度】

USBにはVER1.1とVer2により転送速度が異なっており、下記の3種類となります。
Ver1.1で用意された1.5Mbpsと12Mbpsに対し、Ver2.0で、480Mbpsという非常に
高速なモードが追加されたことになります。






【物理的プロトコル】

USBのケーブルに流れている信号の電気的な仕様は下記のようになっています。
つまり、基本的には、D+、D−の2本の信号線があり、それ以外に電源とグランド
の都合4本の線が接続されます。これにあとシールドが加えられます。
D+、D−の2本の信号線は下図のように接続されます。デバイス側でプルアップを
どちら側にするかによってロースピードとフルスピードを区別するようになっています。










信号線としてはD+とD-の2本しかないのですが、この2本に対して電気的な状態を
いくつか区別して判定出来るようにしています。特に、信号の転送は、2本の線間
の差動信号として送られますが、それ以外に、それぞれの線の信号レベルを独立
に考えて、その状態で下表のように多くの状態を識別しています。
従って、D+とD-の信号ラインの電圧レベルには注意する必要があります。










【フレームの構造】

このUSBライン上を流れる実際のデータは、「フレーム」と呼ばれる単位で通信されて
います。このフレームは1msec周期で繰り返し転送されていて、すべてのデータが
このフレームの中でやり取りされています。
このフレームの構造は、下図のように、「SOF(Start of Frame)」と呼ばれる「パケット
で始まる複数の「トランザクション」から成り立っています。
パケットは、このUSB通信の中で通信される最小の単位となっていて、いくつかの種類
があります。そしてこのパケットがいくつか通信されて、意味のあるデータ転送の単位
となったものをトランザクションと呼んでいます。
この関係を表したのが下図となります。






【パケットの種類】

上記のトランザクションを構成する最小の通信単位であるパケットは、実際に流れる
データの基本単位となっていて、その内容により下図のような種類があります。
それぞれのパケットの最初には、かならず同期をとるための「SYNC」データが1バイト
先頭に付いて送られます。
そして各パケットの最初には、そのパケットの種別を表す「PID」(Packet Identifier)が
付き、それに続くデータの内容を定義しています。
このPIDにはPID詳細フォーマットに示すような10種類がUSB1.1で取り決められて
います。PIDは1バイトで送られますが、実際のPIDは4ビットしかなく、その0,1を
反転した4ビットをあわせて8ビットとしています。この反転2連送のデータを照合する
ことにより転送の誤りチェックをすることができ、より高信頼なデータ転送をすることが
可能となります。













【論理プロトコル】

上記のようなパケットがやり取りされてひとつのトランザクションとなり、そのトラン
ザクションが一定の手順に従ってやりとりされてやっと意味のあるデータ転送が
行われます。
そのデータ転送の手順は各転送モードによって決まっており、それぞれ下図で
あらわすことが出来ます。
この手順により、デバイス側と、ホスト側の意志が通じ合うことになります。

(1) コントロール転送のプロトコル
  コントロール転送だけが、半二重通信が可能な双方向通信パイプを使うため、
  プロトコルが特殊になっています。
  まず全体が3つのステージに分かれています。最初にセットアップステージがあり、
  何をするかを要求するコマンドをホストから転送します。そしてそのコマンドが
  データの送受信を要求している場合には、これに続いてデータステージが始まり
  ます。 この場合のデータは8バイト単位で複数のトランザクションになることも
  あり、その場合にはDATA0とDATA1を交互にします。最後に転送結果を通知する
  ために、ステータスステージがつながります。
  このステータスステージは特殊な扱いになっていて、直前の送信、受信データと
  反対向きの転送を行うことで、その転送の結果を通知します。

  このプロトコル手順を図で表すと下図のようになっていて、最初は、ホストから送信
  されるSETUPのトークンPIDになります。それに引き続いて、送信データが出力さ
  れるか、逆に、データの送信を要求し受信するかになります。
  さらにもうひとつデータの全く無いものもあります。そしてそれぞれ最後のデータの
  通信が完了すると、それとは逆向きの転送が行われて結果データが返信されて
  完了となります。











(2) バルク転送のプロトコル
  バルク転送は通常のパイプを使うので、片方向通信となります。従って
  もっとも基本的なプロトコルとなっていて、下図のようになります。
  ここで通常は、ACKを返送するルートとなりますが、受信出来ない状態
  の時には、待ってくれという意味でNAKを返信します。
  さらにデバイス側が動作不能な状態の時には、STALLを返信します。








(3) インタラプト転送のプロトコル
  このときのプロトコルは流れとしてはバルク転送と全く同じものとなります。
  しかし、実際の動きは大きく異なり、バルク転送が一度に大量のデータを
  一括送受信するのに対し、インタラプト転送では、比較的少量のデータを
  任意のタイミングで送受信します。








(4) アイソクロナス転送のプロトコル
  この転送の場合には、とにかくエラーがあっても良いから、一定時間以内に
  一定の量のデータを送受信したいという要求に応えるものなので、
  そのプロトコルは下図のように非常に単純になっていて、ハンドシェイクの部分
  が省略されています。
  これで高速の連続通信が確保できることになります。










 目次に戻る