USBデバイスの製作(11)
USB162のBulk転送の続き。
UUSBDが使える段階になったのでテンプレートを見直しする。
とは言え転送するものがない。雛形はループバックなのでこれを利用してみる。
パケットサイズで64byteとれるのでこれだけでもHIDの8倍は出るはず。
早速これをビルド。
次に本体ソフトにとりかかる。
これはUUSBD.DLLを呼び出して通信することになる。
以前(伽藍堂のバーコードの時代)にPascalのヘッダを書いていたので、それで作ってみる。
Pipeの番号がよくわからなかったが、0と1で動く。
データを見るとちゃんとループバックしているようだ。
やっと肝心のベンチマークを行う。
1パケット64Byteなのでそれを書いて読み出すというのを1024回のループをかけた。
つまり総合的には64KByteのReadとWriteになる。
結果は0.2秒。つまり片側は0.1秒であるので、少なくとも0.5MByte/secは出ている。
思ったよりは優秀である。(^^)
SCIもこれでブリッジすれば取りこぼしなどもなさそうである。
なんせUSB速度>>シリアル速度になる。
結論からすると
・Bulk転送を使えば0.5MByte/S以上の転送性能は可能である
・USB-IOのようにデバイスプログラムなしというのはできないがEZ-USB(2313の方)程度以上に開発環境が良い。
例えばコンパイラの制限もないし、I2Cロムに書かなくても良い。
デバイスもC8051よりはAVRの方が使いやすい(と思う)
・UUSBDのおかげでドライバは書かなくてよい
DLLを呼び出せば簡単に制御できる。(柏野さんに感謝)
という感じで旧EZ-USB並みの使い方ができることがわかった。
これなら低速から中速まではこのICだけでOKである。
まあ、これにしてもやはりシリアル経由でスレーブにAVRがあれば使いやすいように思う。
サンプルにはインタラプト転送(入力)があるが、これはどういうわけかうまく動かない。
サンプルにまだ間違いがありそうだ。
例えば
template\demo\template\usb_specific_request.c
の
void usb_user_endpoint_init(U8 conf_nb)
で
usb_configure_endpoint(EP_TEMP_INT_IN,\
TYPE_BULK, \
TYPE_INTERRUPT,\
SIZE_64, \
ONE_BANK, \
NYET_ENABLED);
は、どう考えても
usb_configure_endpoint(EP_TEMP_INT_IN,\
TYPE_INTERRUPT,\
DIRECTION_IN, \
SIZE_64, \
ONE_BANK, \
NYET_ENABLED);
の間違いに思う。勿論これは修正した。
ちなみにInterroput転送をBulk転送にしても同じく入力でエラーする。
これはインターフェイスが2つであるが、1つにまとめても同じだった。
しかし入力はダメなのだが、出力として定義するとちゃんと動く。
LEDがDebugには重宝する。(^^!
サンプルがちゃんと動かないのは残念なのだが、別段Bulkエンドポイントを増やさなくても1パケットの64Byteで定義すればシリアルにも切替できる。
とりあえずは後はやる内容によって考えることにすればよいと思うので深く追求はしてはいない。
いずれにしても実際はループバックなどということはないわけで、何かを書かないと使えない。
EZ-USB並みに動くというので、ここは少し感動的であった。
アトメルがドライバとdllを提供してくれれば、EZ-USBのユーザは(後継がないので)全部こっちにくるように思う。(柏野さんのおかげでそれはいいのだが。)
EZ-USBが@3000程度であることを考えると価格的メリットも大きい。