もっとも、こうしたSingle Packetの転送というのはすこぶる効率が悪いわけで、実際に転送のメインとなるのは複数Packetをまとめて転送するBurst Transactionとなる。

Photo01はOUT Transactionの例である。Burst Transferの場合、連続して送受信できるPacketの数は、ACK TPで返される中のNumP fieldの値である。この値は307回に説明した通り、Endpointが許容できる最大Packet数が格納されており、Hostはこれを見ながら連続転送するPacket数を調整することになる。

Photo01: ちょっと判りにくいが、上段から下段に繋がっている。まずDPH/DPPを2つ送った後で、今度はDPP/DPHを3つ送るという図。

ここで言う連続転送は、DPPの最大数とはちょっと異なる。Photo01は、5つのDPPをBurst OUT Transactionで転送した例である。まずSeq#=0、次いでSeq#=1のDPHとDPPをHost→Deviceに転送すると、これと並行してDevice→Hostの向きにLGOODとLCRD、それとACK TPが転送される。HostはDeviceに対して、このACK TPに対するLGOODとLCRDを転送する必要があるが、これはSeq#=1のDPP送出後に、まとめて2個送る形になっている。ただこれで転送は終わりではなく、その後はSeq#=2~4の3つのDPH/DPPをやはり連続して送り、最後にLGPPD/LCRDを連続して3つ分送るという仕組みだ。

仕様的には、例えばDeviceが極めて高速にBufferの処理を行うことで、DPPを受け取ってから次のDPHを処理するまでにBufferを空にできれば、常にNumPは4が維持される形になるから無限に送り続けられそうに見えるが、Hostの側がLGOOD/LCRDをそんなに一杯貯める訳にはいかないので、現実問題としては現在のUSB 3.0では4つがBurst Transferにおける「一回に連続して送信できるPacket数」の上限となるだろう。

では逆にDevicet→Hostではどうなるか? というのがPhoto02だ。こちらの場合、BufferがどれだけあるかというのはHost側の構成次第となる。このため、転送速度を高く保つためには、なるべくバッファを確保して常にNumPを4に保つ様にすることが求められている。流れ的には、まずACK TPがHost→Deviceから送られることで、DeviceはLGOOD/LCRDを送った後DPH/DPPの転送を開始する。本来だと、その後LGOOD/LCRDとDPH/DPPが交互に転送される筈だが、Photo02の例ではSeq#=1に関してはLGOOD/LCRDとDPH/DPPの順序が逆転していることがわかる。一度こうなると、以後Seq#=2以降は全て順序が逆になっているのが判るはずだ。

Photo02: こちらも上段と下段が繋がっているので注意。

ここまでは正常に通信できるのが前提の話だが、では転送エラーが起きたらどうなるか? というのがここからの話となる。Single Packetの場合、受信時にErrorを検出したら受信側はACK TPのRty(Retry)bitを立てて再送要求を行うことになる。Photo03の例では、Seq#=31と0は正常に受信できたが、Seq#=1でErrorがあった場合のケースだ。Burst OutのTransactionでは、DeviceからRty bitが立ったACK TPを受け取る前に、Seq#=2の送信が行われてしまう形になる。したがってHostはSeq#=2のDPH/DPPを送った後で(これは破棄し)、Seq#=1のDPH/DPPの再送信を行う。一方Deviceは、再送信されたSeq#=1のDPH/DPPを受け取るまで、ACK TPを返さない。で、再送信されたDPH/DPPを確認し、まだおかしいようであれば、再びRty bitを立ててSeq#=1のACK TPを送り返すことになるが、ここで再送信されたDPH/DPPに問題がなければ、Seq#=1をパスする。Host側はSeq#=1から順次再送を行うので、Seq#=2も2度送られる形になる。これで問題がなければ、再びSeq#=2からACK TPが順次送られる形になる。

Photo03: Seq#は5bitでCyclicに使われるので、31の次は0になる。

これはIN Transactionでも同じである。今度はDevice→HostのTransactionで、Seq#=0のDPH/DPPが破損していたケースだ。その場合HostはSeq#=0のACK TPにRty bitを立ててDeviceに通知することになる。といっても、DeviceもBurst Transferの最中だから、再送の前にSeq#=1のDPH/DPPを送り出し、その後で再びSeq#=0のDPH/DPPから再送を行うという仕組みだ。Host側は再送されたDPH/DPPに問題がなければそれは通知せず、次のSeq#=1のACK TPから通知を行うことになる。ちなみにPhoto04のケースでは、Seq#=1で通信が終了である。なのでDeviceからはSeq#=1のDPHにEOBが付加される。これを受けてHost側はSeq#=2、NumP=0としたACK TPを送ることで、Burst Transferの終了をDeviceに通知することになる。

Photo04: 基本は同じだが、EOBが混じってるあたりがちょっと異なる。

(続く)