carcon999のブログ

12年間Y!ブログの記載を移行しました。電子工作関連の記事が多いです。

USBのプロトコル

USBの通信方式(プロトコル)が少し理解できてきたので、メモしておきます。
その前に「IN」や「OUT」の方向について少し。
本を読んでいると、イン(IN)トランザクション、アウト(OUT)トランザクションといった言葉が出てきますが、はじめはその方向が良く理解できずに悩みましたが、HOST側(通常PC側?)を基準に考えると簡単です。HOST側がデータを受信する方向がINで、データを出力する方向がOUTです。ターゲット機器側を基準に考えてしまうと方向が逆になるので混乱します。

イメージ 1

さてプロトコルですが、USBでなくUARTでデータの送受信を考えた場合に、お互いのハンドシェイクにACK/NAKを独自で自由に設計して、データ保障の仕組みを考えますが、USBでは厳格にそのやり取りが決められていることが分かりました。また、UARTには、Tx,Rxの2線で全二重通信ができますが、USBでは同時に通信ができない半二重通信であることが分かりました。全二重ができないことから、UARTよりもI2Cのプロトコルの方が似ているのかもしれません。(個人的な意見です。)


IN方向
つまり、HOSTへターゲットからデータを送信する場合です。

SOF(Start Of Frame)パケットをHOST側が送信します。このパケットは、1ms間隔で送信されるものです。つづけて、データの入力を要求するIN方向のトークンパケットを送信します。このトークンパケットを受信したターゲットは、データを送信します。データを正常に受信するとHOSTはACKを送信します。
つまり、ターゲット側は、トークンパケット(IN要求)を受信することで、HOST側からバスの利用権が獲得でき、データを送信することができるようになります。

■アウト(OUT)トランザクション
イメージ 3

OUT方向
つまり、HOSTからターゲットへデータを送信する場合です。

先のIN方向と途中まで一緒ですが、データパケットの送信方向と、ハンドシェイクパケットの方向が先とは逆になっています。(INとOUTで方向が違うので当たり前ですが・・・)このように見てみるとなるほどね。と納得できるシーケンスであることが分かりました。

更に、USBの通信速度12Mbpsといわれていますが、通信プロトコルのオーバーヘッド分を考慮すると、1ms周期で最大1023Byteのデータをやり取りできるので、1023Byte×8bit×1000ms=8Mbit/sということになります。(本当か?)更に、このシーケンスでは、NAKや、STALLが考慮されていませんので、更に通信速度は低下することになります。

※ちなみに、書籍から読み取った内容で、実際の経験からではないので間違っているかもしれません。その点ご理解ください。