アドレスの設定が完了すると、実際のPCと周辺機器の間の転送が時分割で実行されます。このとき、ホストは決まったルールに基づき、転送を順番に行っていきます。4つの転送のうち、最も高い優先順位をもつ転送は時間の 概念を維持し続ける必要のあるIsochronousであり、その次は周期的にデバイスへのアクセスを行うInterruptになります。例えば、Hubはホットプラグ対応のため、いつデバイスの着脱がおこるかわからないので、ポートの情報をInterrupt転送によりホストに定期的に通知します。BulkとControlの優先順位もPCによって規定されます。また、全くBulkとControlが発行できない場合が起こらないように(マイクロ)フレームのある時間は必ずBulkとControlに割り当てられるようになっています。

4つの転送について

 

Control転送はUSB環境下での設定のために使うので、この転送で送られるデータは基本的にすべてのUSB周辺機器において同じように理解される必要があります。つまり、 Format、データ内容についてきちんと規定されることになります。一方、Bulk/Interrupt/Isochronous転送はいろいろな周辺機器のデータ転送に使いますから、転送で送るデータの中身に対して定義することはできません。つまり、中身はUSBに取っては特に意味を持ちません。

Format、データ内容について

 

Control / Bulk転送にとってはその転送の性質上、特に時間について検討する必要はありませんが、Isochronous / Interrupt転送では何らかの方法で時間の管理を行う必要があります。USBでは管理している時間の単位をフレーム(USB2.0ではさらにマイクロフレームと言う単位が追加されました)と呼び、(マイクロ)フレーム単位で各転送要求をマネージメントすることで、時間の概念を実現しています。フレームは1ms単位、マイクロフレームは125μs単位です。Non-Periodic(Bulk転送とControl転送)はPeriodic(Interrupt転送とIsochronous転送)の占める時間によって変わります。

フレーム

 

Isochronous / Interrupt転送が(マイクロ)フレーム内の大半を占めてしまうような状況になってしまった場合、時間に対して特に検討しなくても良いとはいえ、全くControl/Bulk転送が行えなくなってしまう可能性があるので、(マイクロ)フレームある範囲は必ずControl / Bulk転送が処理される期間として予約されています。

1. 1Frame内のPeriodic/Non-Periodic

1Frame内のPeriodic/Non-Periodic

2. 各アプリケーションに割り当て

各アプリケーションに割り当て

ホスト・コントローラは(マイクロ)フレーム単位で時間を管理して転送を制御します。周辺機器でのControl / Bulk / Interrupt転送は特に(マイクロ)フレームの区切りを意識する必要はありませんが、 Isochronous転送の場合、システムとの同期を正しくとるために(マイクロ)フレームの区切りを理解する必要があるかもしれません。このため、(マイクロ)フレームの開始を示すStart of Frame(SOF) Packetをホストがバスに発行します。
Start of Frame(SOF) PacketはSYNC → PID → Frame No. → CRC5の4つの部分から構成されます。USB2.0のマイクロフレームで送られるSOF packetも基本的には同じ構成になります。
SYNCは周辺機器のクロックと転送データの同期のために使われます。このSYNCはUSB2.0においてはUSB1.xの場合と多少変わっています。
PIDはPacket Identifierで送信されているパケットが何であるかを示します。SOFを示すPIDはb0101と規定されています。PID部にエラーが発生する場合もあるので、エラー検出のためにPID+PID(1の補数)を送信します。と言うことで、この場合はPIDはA5hになります。
Frame No.はFrame No.を示すフィールド(11bit)でフレーム毎に1つインクリメントされます。USB2.0のマイクロフレームではマイクロフレーム毎に1つインクリメントされるのではなく、8マイクロフレーム毎に1つインクリメントされます(つまり、必ず1msに一回インクリメントされます)。このため、USB2.0のhigh-Speed modeでは8回同じSOFが送信されます。
CRC5はCyclic Redundancy Checkというビットエラーを検出するために付加される5bitのデータで構成されます。これはFrame No.のデータを保護するために使われ、パリティチェックより高い確率でビットエラーの検出が行えます。

USB2.0のSYNCについて

 

なお、すべてのパケットはLSBから送信されますので例えばSYNC80hは左から順番に送られるとするとb00000001のように表されます。
Control / Bulk / Interrupt / Isochronous転送はToken, Data, Handshakeのそれぞれのパケットで構成されます。

SOFパケット構成

 

Tokenは上記で述べたSOFパケットと同じ構成でFrame No.の代わりにAddressとEndpoint番号(SYNC → PID → Address → Endpoint → CRC5)を送ります。Tokenパケットはこれから開始される転送の相手、方向を記すために必ず最初に送られます。データの送受信を行うTOKEN PIDは、Set Address等のUSBリクエストを送信するためのSetup(2Dh)と、In転送の開始を示すIn(69h)、Out転送の開始を示すOut(E1h)の3つに分類されます。
Addressは7bit(127のデバイスアドレスを規定できます。00hはデフォルトアドレスのため、固有アドレスとしては使用できません。)、Endpoint番号は4bitで構成されます。CRC5はAddressとEndpoint番号のデータを保護するために使われます。

Tokenパケット

Tokenに続いてデータを載せて送るDataパケットを送ります。DataパケットはSYNC → PID → Data → CRC16で構成されます。Data パケットを示すPIDはDATA0(C3h)とDATA1(4Bh)を使用します。 この二つのData PIDを交互に利用することで、転送で発生するトラブルをリカバリーすることができます。詳細は後述します。これに続いてデータが送信されますが1つのパケットで転送できるデータ量は0~Max Packet Sizeまでです。 (周辺機器のMax Packet Sizeは規格上のMax Packet Sizeかそれ以下であるFIFOのサイズによって決まります。) CRC16はデータを保護するために使われます。
In Tokenでは返信するデータが存在しない場合にはDataパケットを送信する代わりにHandshake(NAKまたはSTALL) パケットを返信します。 Out Tokenでは受信できない状態でもDataパケットが終わってからHandshake(NAKまたはSTALL)パケットを返信します(USB2.0での追加PID PING & NYET)。
HandshakeパケットはSYNC → PIDで構成されます。Handshakeパケットを示すPIDは 正常に受信できたことを示すACK(D2h)、今は処理が完了していないので送受信を受け付けられないことを示すNAK(5Ah)とシステム的におかしくなってしまったことを示すSTALL(1Eh)の三種類が定義されています。
なお、Isochronous転送ではたとえデータの取りこぼしがあったとしても再転送を行っている暇はないので、Handshake パケットは使いません。

USB2.0での追加PID PING & NYETについて

 

Dataパケット

  • カタログポータル