PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.7.9

前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆USB(HIDクラス)

USBを通じてパソコンとの間でデータを送受信する方法にいくつかの種類があることがわかりました。
その中で特別のドライバをインストールする必要のないHIDクラスを使うことを考えます。

[第30回]

●HIDの送信速度について

前回HIDの送信速度について説明をいたしました。
説明を書きながら、「この説明にはアナがある」ということに気が付いていたのですけれど、時間がありませんでしたので、それ以上の説明はできませんでした。

USBではデータをパケットという、単位というか、入れ物に詰めて送信をします。
実際には複数のパケットがフレームという単位にまとめられて1ms毎に送信されます。
HIDの場合、1つのパケットには64バイト(フルスピード)か8バイト(ロースピード)しか入れられません。
さらに1つのフレームには1つのデータパケットしか入れられません。
ということはHIDの場合には、1msに64バイトしか送信できないということになります。

しかし、計算してみると64バイト/msということは64KB/秒という転送速度になりますから、これはRS232Cなどとは比較にならないほど高速です。
ちなみにRS232Cでは送信速度をあらわすのにボーレートという単位を使いますが、装置とパソコンをつないでデータの送受信をするときの最高ボーレートは9600か19200ボーあたりであることが多いようです。
19200ボーというのは約2KB/秒の転送速度です。
するとHIDの送信速度はRS232Cの30倍ということになります。
という説明を前回いたしました。

そのどこにアナがあるのか、といいますと、64KB/秒という送信速度は、実は計算上の値に過ぎなくて、実際の送信速度は多分それよりもうんと少ない値になってしまうのではないだろうか、と予想されたことです。
確かに1msに64バイトでも、それが切れ目無く連続して行われれば64KB/秒の送信速度になるわけですけれど、なにしろWindowsですから、そこは相当に疑問が残ります。
またアセンブラならばともかくとして、C++でAPIをCALLするというプログラムを書いて、それを使って送信するわけですから、そうすると計算通りにはいかないだろうなあ、という予想がついてしまいます。

●どうしたらHIDの送信速度が測定できるでしょうか?

なんとかして実際の送信速度を測ることはできないものでしょうか?
なにしろmsオーダーの速度ですから、時計などでは全く役に立ちません。

いい方法を思いつきました。
前回お見せした送信テストのプログラムをちょっと変更します。
まずホスト側の送信プログラムですが、前回は64バイトのみ送信しましたが、それを64バイトを連続して3回送信するように変更しました。


次にPIC18F4550ですが、データを受信したら232Cを使ってZB25Kにデータを送っていたところを削除しました。
つまり受信しっぱなしで他のアクションは何もしない、ことにしました(そうしておかないと、連続受信の妨げになってしまうからです)。
その代わりに未使用になっていたPORTCを利用して、データが受信されるごとにPORTCの値をインクリメント(+1加算)して出力するようにしました。

そして、PORTCのビット0(RC0)とビット1(RC1)の出力をオシロでストレージ観測するようにしたのです。

●オシロで観測してみました



上側(CH1)はPIC18F4550のRC0出力で、下側(CH2)はRC1出力です。
データを受信する前はRC0=0、RC1=0です。最初のデータブロックを受信すると、RC0=1、RC1=0になります。
次のデータブロックを受信すると、RC0=0、RC1=1になります。
最後のデータブロックを受信すると、RC0=1、RC1=1になります。

やっぱり予想した通り、かなり間が空いています。
最初の送信と次の送信との間は5msの空きがあります。
2番目の送信と最後の送信との間は30ms近く空いています。
これはちょっと空き過ぎのようです。
なぜでしょうか?

実はBASICボードZB25Kと接続しているDOSプロンプトがもうひとつ開いたままでした。
それが影響しているのではないかと考えました。
そこで、余計なDOS窓は閉じてから、もう一度テストをしてみました。



今度はだいぶ縮まりました。
それでも2回目と3回目のデータ送信の間隔は期待値1msに対して10倍の10msになっています。

こうしてみると、64KB/秒はとても無理で、せいぜい6KB/秒くらいがいいところではないか、と思います。
そうだとしても、MYCPU80やTK80を接続してのデータ通信目的としては、十分な速度である、といえるでしょう。
CPUをつくろう!第422回(2010.1.21upload)を再編集

PICでUSBを![第30回]
2011.7.9upload

前へ
次へ
目次へ戻る
ホームページトップへ戻る