汎用USBクラスと汎用USBドライバの使い方


【Generic USB Classとは】

汎用USBクラスとは文字通りUSBとPICを接続するときに汎用に使えるクラスで、
最も自由度が高いUSB接続を実現できます。
 PIC側は、マイクロチップ社の「USBフレームワーク」のひとつのクラスとして提供
されていて、簡単に組み込むことが可能です。
PICのアプリケーションから使う場合も、他のクラスと同じようにRead、Write関数
でUSB送受信ができるようになります。

 パソコン側に必要なUSBの汎用ドライバも一緒に提供されていて、INFファイルに
必要なベンダIDとプロダクトIDを追加すれば、簡単に組み込めます。
このドライバをインストールすると、アプリケーションから呼び出せるDLLファイルが
使えるようになり、この中に用意されている汎用のUSB送受信関数が使えるように
なります。
 この関数を使うことで、最も自由度の高いUSBアクセスを実現することができます。

【Generic USB Classの構成】

この汎用USBクラスの全体構成は、マイクロチップ社のフルスピードUSBデモボード
に組み込まれているひとつのUSBクラスとなっていて、名称が「Generic Class」と
なっています。
入手は、「PICDEM FS-USB DM163025」というデモボードのダウンロードページから
「MCHPFSUSB_Setup.EXE 」というファイルをダウンロードすることで入手できます。

このファイルを実行すると、Cドライブに下図のようなフォルダが展開され、各ファイルが
生成されます。
 ここでfwフォルダにあるのはPIC側ののFirmWareで、この中のDemoというフォルダに
汎用USBクラスを使ったデモプログラム一式が用意されています。

 Pcフォルダにはパソコン側のドライバが展開され、汎用USBドライバ用のファイルは
MCHPUSB Driverのフォルダに展開されています。 USBデバイスを接続したときに
指定するINF、SYSファイルがこの中にあります。

 アプリケーションに組み込んで使うDLLファイルは、Mpusbapiフォルダの中に展開され
ていますので、これをVisual C++.Netなどのプロジェクトと同じフォルダにコピーして使います。






【PIC側の汎用USBクラスの構成】

 上記のようにDemoプログラムとして用意されているプログラムには、USBフレーム
ワーク関連のプログラムも一式含まれています。
実際の汎用クラスのファイルは上図のsystem\usb\class\genericフォルダの中に
格納されている「usbgen」というファイルとなります。





汎用USBクラスを含めたプログラム構成を図で示すと下図のようになります。




 まずPIC側はUSBフレームワークとして汎用USBクラスを含んだ一式が提供されて
いますので、これにユーザープログラムをmain関数あるいはuser関数として作成します。
ダウンロードファイルにはDemo用のユーザープログラムが同梱されていますので
これを修正しながら作っていけば容易に作成できます。

 PC側は、汎用USBドライバとして用意されているものをインストールします。
INFファイルに、製作したPICデバイスのベンダIDとプロダクトIDを登録して、PICデバイス
をPC側がUSBデバイスとして認識できるようにします。
 これでアプリケーション用として用意されたDLLファイルを使って、PICデバイスと
USB通信が可能になります。







【汎用USBクラスの関数】

この汎用USBクラスをPICに組み込んだときPIC側のユーザープログラムに提供される
関数は下表のようになります。
単純な初期化とデータの送受信だけですので使い方は簡単です。

関数名 書式 と 機能
USBGenInitEP  void USBGenInitEP(void)

 初期化関数で、エンドポイントを汎用USB用に
 使うように設定する
USBGenWrite  void USBGenWrite(byte *buffer, byte len)

 USB送信関数で、bufferに用意したデータを
 lenバイトだけ送信します。 
USBGenRead  byte USBGenRead(byte *buffer, byte len)

 USB受信関数で、USBモジュールで受信したデータを
 bufferに取り込み、取り込んだバイト数をlenで返します。




【ユーザープログラムの作り方】

USBフレームワーク内でユーザープログラムを作るときに注意しなければならないことは、
USBのポーリングを止めるようなプログラムを記述してはならないということです。
つまり、永久ループや長いディレイ、I/O終了を待つwhile文などは使えません。

常にできるだけ早い周期でUSBのイベントをチェックするポーリングに戻してやる
必要があります。





【汎用USBドライバをPCに接続するには】

この汎用USBドライバの展開ファイルの中に、USBデバイスインストール用のINFファイル
が同梱されています。
USBデバイスを初めて接続したときに、ドライバのインストールを要求されますが、そのとき
この同梱された 「mchpcdc.inf」のある場所を指定します。

このINFファイルの中に、USBデバイスの特定のベンダIDとプロダクトIDが記述されていて
これと一致するデバイスであれば自動的にインストールが開始されます。
IDが異なるUSBデバイスとして作成した場合には、このINFファイルを修正する必要があります。
修正個所は、[DeviceList] となっている個所に下記1行がありますので、ここに追加する
形で修正すれば良いようになっています。


  赤字部分が追加した部分です。

  [DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000A
, USB\VID_09B9&PID_0046


また接続したときに表示されるメッセージやデバイス名称を変更したいときには、同じように
INFファイルの最後の方にある「String Definition」を変更すれば可能になります。


【PC側の汎用USBドライバDLLの使い方】

 PC側の汎用USBドライバとして用意されている「MPUSBAPI..DLL」ファイルによって提供
される関数は、下表のようになっています。
いずれも、CまたはC++から直接使える関数となっています。アプリケーションの例題も用意
されていますので、宣言部などはそのままコピーしてつかうことができます。


関数名 機能
MPUSBGetDLLVersion MPUSBAPI.DLLのバージョンを取得する
MPUSBGetDeviceCount 指定VIDとPIDに一致するデバイスの数を調べて返す
MPUSBOpen 指定VIDとPIDのエンドポイントのハンドルを返す
MPUSBRead INエンドポイントからデータを取得する
MPUSBWrite OUTエンドポイントにデータを出力する
MPUSBReadInt インタラプトモード転送でデータを取得する
MPUSBClose エンドポイントをクローズする



【PC側プログラムの作り方】

 Visual C++.Netを使って実際のプログラムの作り方を説明しましょう。
まずDLLの読み込みと関数宣言部です。これはお決まりの記述なのでそのままコピー
して使えます。







  トップページへ