設計の基本は仕様の理解 ――高速シリアル通信を実現するために知っておくべき最低限の知識
3)トークンとPID
データ・パケットを識別するための特殊コードとして,USB 2.0のトランザクションにはパケットID(PID)があります.表4に示したように,PIDには使用目的によってさまざまなものがあります.
4)USBパケットとハンドシェーク
代表的なUSB OUT転送は図20のようなパケット構成になっています.パケットとはデータ転送の最小単位のことです.例えば,図20のパケット1はアウト・トークン(OUT PID),パケット2はデータ(DATA1 PID)です.パケット3はハンドシェークで,デバイスからデータを正常に受信した場合に送られるACK(アクノリッジ)PIDです.パケット4は,トランザクションとしての二つ目のアウト・トークンです.パケット5は直前のOUT PIDに続くデータで,DATA0 PIDになります.パケット6は,デバイスがデータを正常に受信した際はACK PIDを送ります.これで通信が終了します.
OUT転送については,フルスピード・モードとハイスピード・モードでは動作が異なります.フルスピード・モードではデバイスが動作中でデータ受信できない状態でも,データ・パケットが送出されます.一方,ハイスピード・モードでは新たにPING PIDが追加されました.ホストは最初にOUTエンドポイントに対してPINGトークンを送り,デバイスからACK PIDを受信したときのみ,アウト・トークンとデータを送ります.
DATA PID(DATA0またはDATA1)はエラー検出に使用されます.これは,たとえ正常受信を示すACK PIDを受け取っても,DATA0とDATA1が交互に届かない場合は,ハンドシェークPIDがホストまたはデバイスからまちがって発行された可能性があり,エラーとなります.
SETUPトークンはコントロール(CONTROL)転送に使用します.USBデバイスはホストからの8バイトのデバイス・リクエスト(device requests)をデコードします.ハンドシェークPIDはUSB転送のステータスを示します(表5).PRE(プリアンブル)PIDはロースピード・モード対応デバイスで使用されます.しかし,ハイスピード・モード対応デバイスの多くは,ロースピード・モードをサポートしていません.
〔表4〕パケットID
太字はUSB 2.0で追加されたもの.
PIDタイプ | PID名称 |
トークン | IN,OUT,SOF,SETUP |
データ | DATA0,DATA1,DATA2,MDATA |
ハンドシェーク | ACK,NAK,STALL,NYET |
特殊コード | PRE,ERR,SPLIT,PING |
〔図20〕USBバルク転送のパケット構成
パケット1はアウト・トークン,パケット2はデータ,パケット3はハンドシェーク,パケット4は二つ目のアウト・トークンである.パケット5は直前のOUT PIDに続くデータであり,パケット6はデバイスがデータを正常に受信した際はACK PIDを送る.
〔表5〕USB転送のステータス
ハンドシェークPID | 意 味 |
ACK(アクノリッジ) | 正常受信の成功を意味する |
NACK(ネガティブ・ アクノリッジ) |
ビジーなので再送を要求するという意味.一時的な通信エラーを示すが,デバイスとして応答不可能な故障は持っていない |
STALL (ストール) |
通信を阻害するトラブルが起きていることを意味する.これは,ホストとデバイスの間でうまく通信できていない状態を示す.例えば,デバイスがホストからのデバイス・リクエストを理解できない場合など |
NYET (ノット・イエット) |
ハイスピード・モードのみで使用される.ACKと同じ意味で,直前のデータは正しく受信したが,新たなOUT転送データの受信準備ができていない状態.例えば,エンドポイント・バッファが空いていないときにデバイスから送信される |