USBフレームワークの使い方


【USBフレームワーク概要】

 USBフレームワークは、マイクロチップ社がUSB2.0対応PIC用に提供している
もので、標準USBプロトコル規格を満足するファームウェアです。
リアルタイムOS無しで動作するようになっていて、main関数の中でUSB送受信の
有無をポーリングしながら使うようになっています。
ベンダID、プロトコルIDも設定可能、使用するエンドポイント数も設定できます。

USBフレームワークは前記の入手方法で入手して展開すると、Cドライブの下に
下記のようなフォルダ構成でファイルが格納されています。
例えばRS232C over USBのCDCクラスの場合には下記のようになりっています。





【USBフレームワークの構成】

USBフレームワークの全体モジュール構成は下表のようになっています。

ファイル名 内容・機能 備考
usbcfg.h 最重要設定ファイルで、実際に使うUSBデバイスクラスを
決める定義ファイルです。
セルフパワー、バスチェックをするかしないかも定義する
必須
内容はクラス
毎に異なる
usbdsc.h
usbdsc.c
標準デスクリプタをROM内定数として生成する関数
エンドポイントの使い方を変えるときは変更が必要
Configuration、Interface、Endpoint、Stringの情報を含む
ベンダID、プロダクトIDを設定する
必須
変更必要
typedefs.h USBライブラリ内で使用する基本のユーザ定義型を
宣言しています
必須
usb.h USBライブラリに必要なファイルをまとめてインクルード
するためのファイル
必須
usbmmap.h
usbmmap.c
USBのステータスフラグの型宣言のヘッダファイル
エンドポイントで使用するRAMのメモリを確保する関数
エンドポイントの使用宣言はusbcfg.hで行う
必須
usb_compile_time
_validation.h
コンパイル時にエンドポイントのバッファサイズをチェック
するためのファイル
オプション
usbgen.h usbgen.c
 hid.h  hid.c
 cdc.h  cdc.c
  など
クラスごとの送受信実行関数
USBデバイスの機能毎にクラスを作成し実際の読み書きの
関数を定義する
エンドポイントの初期化、USB送受信関数を含む
いずれかの
クラスが必須
usb9.h
usb9.c
USB規格の第9章を満足するプロトコルプログラム
Plug&Playの標準リクエストに対応する各処理関数を含む
必須
usbctrltrf.h
usbctrltrf.c
エンドポイント0で行うコントロール転送に対応するSetup、
Out、Inの転送を処理する関数を含む
必須
usbdrv.h
usbdrv.c
実際のI/Oを行う関数群。Reset、Attach、Stall、Error、Suspend
などUSBに関する大部分のの動作を実行する関数を含む
必須
usbdefs_ep0_buff.h
usbdefs_std_dsc.h
標準デスクリプタ、エンドポイント0のバッファの型定義 必須
io_cfg.h ユーザープログラムの環境に合わせたポートの設定
必須なのはセルフパワーとバスチェック用のポート定義のみ
オプション
ユーザー作成
main.c ユーザープログラム
USB初期化とメインループでのUSBポーリングが必要
必須
ユーザー作成

  (最後の2ファイルはユーザー作成関数)


【USBフレームワークの動作】

上記で呼び出されるUSBフレームワークの中味の動作は概略下記のようになります。





このUSBフレームワークの動作は下記のようになります。
(1) main関数でまず初期化されます。
  この初期化関数の中に、USBの初期化とユーザプログラムの初期化を含めます。

(2) メインループの中でUSBTask()関数を実行します。
  この関数の中で、USBDriverService()関数が起動され、まずプラグ&プレイの標準リクエストの
  処理を開始します。このUSBDriverService()関数がUSBフレームワーク動作の中心的な役割を
  果たし、すべてのUSB関連のイベントを監視していて、対応する処理関数を呼び出します。
  ただし、ユーザアプリのUSB送受信は、SIEのバッファのフラグチェックだけで行われますので
  ユーザアプリのProcessIO()関数側で実行されます。

(3) 標準リクエストの処理
  受信したデータがエンドポイント0(EP0)のコントロール転送で、標準リクエストデータの場合には、
  USBCtrlEPService()関数を呼び出します。
  この関数では、USBを接続した場合の最初のプラグ&プレイの接続シーケンスを制御します。
  この標準リクエストデータの場合には、usb9.cにあるUSBCheckStdRequest()関数が呼び出され
  USB規格の第9章に従ったプロトコルを実行します。
  この中でデバイスクラスに依存する部分は、クラス部のUSBCheckxxxRequest()関数が実行され
  ます。この関数名のxxxの部分がクラス毎に変わることになり、例えばHIDクラスの場合にはhidとなり
  RS232Cクラスの場合にはcdcとなります。
  
  プラグ&プレイ手順(Enumarationという)のとき重要なのがSET_CONFIGURATION要求処理の部分
  で、USBStdCfgHnadler()関数で処理されますが、この中でエンドポイントの生成が行われます。
  従って、エンドポイントはクラス毎に異なる部分ですので、ここに対応したエンドポイント処理が必要
  です。それが、クラス部にあるxxxInitEP()関数で、xxxの部分がクラスごとに変わることになります。

(3) ユーザー送受信処理
  ユーザが実行するプログラムの部分はmainのProcessIO()関数内に記述します。つまりメインループ
  の中でポーリング方式でUSBの送受信をしながら必要な処理を実行することになります。
  このユーザ処理の中でUSBの送受信を行う場合には、クラス毎に定義されている送受信用の関数を
  使うことになります。
  また、エンドポイントを使った送受信は、USBのバッファのフラグチェックだけで行いますので、この
  ProcessIO() 関数内でポーリングチェックする必要があります。

【USBDriverService関数の機能】

この関数では、すべてのUSBのイベントを処理します。つまりUIRレジスタとUIEレジスタの割り込みフラグ
をチェックしてイベント発生を検知し処理します。処理後USB転送完了フラグ(TRNIF)をクリアします。
従って例えばユーザープログラムでUSB転送を行う場合には下記のように記述します。

メインループが実行される都度1回だけUSB転送をする場合には、上側のような記述とします。
これで、ビジで転送しなかった場合にも、再度USBDriverServeice()関数が実行されますから、他の
イベントがあっても問題なく実行されます。

メインループの1回の実行ごとに複数のUSB転送を行う場合の記述は下側のように記述します。
これで判るように、1回の転送ごとに必ずUSBDriverServeice()関数の実行が必要になります。
これでいつUSBのイベントが発生しても直ぐ対応処理できるのと、転送完了フラグのクリアを矛盾なく
行うことができます。
(完了フラグが4レベルのFIFOバッファとなっていて、4つまでは連続転送できますが、それ以上に
なると転送異常となって転送不可能となります。)






【usbcfg.hのパラメータ詳細】

usbcfg.hファイルでは基本のパラメータを定義しています。そのパラメータの意味は
下記のようになっています。
名称 意味内容 デフォルト値
(HIDの場合)
EP0_BUFF_SIZE エンドポイント0のバッファのサイズを指定します。
LowSpeedの場合は8バイト固定
FullSpeedの場合は8,16,32,64のいずれか
8
MUX_NUM_INT 内蔵するインタフェースの最大数を指定する
複数コンフィギュレーションの場合も最大値のみ
MODE_PP ピンポンバッファの使用モードを指定する
_PPBM0、_PPBM1、_PPBM2のいずれか
詳細はデバイスデータシートによる
_PPBM0
UCFG_VAL USFGレジスタの初期値を指定
_LSか_FS  :速度指定
_TRINTか_TREXT :トランシーバの内部、外部指定
_PUEN :内蔵プルアップのイネーブル
_OEMON :SIEの出力モニタ
_UTEYE :アイパターンテストモードイネーブル

_FS
_TRINT
_PUEN
MODE_PP
USE_SELF_POWER_SENSE_IO オンボード電源が入ってりうことをIOピンでチェック
することを表す。
IOピンを使わない場合にはコメントアウトする
define
USE_USB_BUS_SENSE_IO USBからの電源が入ったことをIOピンでチェックする
ことを表す。
IOピンを使わない場合にはコメントアウトする。この
場合は常時USBモジュールがイネーブルとなる。
define
USB_USE_GEN
USB_USE_CDC
USB_USE_HID
どのUSBクラスを使うかを指定する。 USB_USE_HID
MAX_EP_NUMBER 使用するエンドポイント番号の最大値を設定
これでエンドポイントバッファの確保をする


【MPLAB IDEプロジェクトの生成】

MPLAB IDEを使ってUSBフレームワークを使ったプロジェクトを作成する方法です。
まず一番簡単な方法は、入手したデモ、サンプルプロジェクトを改版して作成する
方法です。CDCクラスのサンプル、つまり「RS232C Over USB」を例題として説明します。

(1) サンプルプログラム(CDC_RS232_Emulation.EXE)を実行し展開します。
  これで「C:\MCHPFSUSB\fw\Cdc」というディレクトリの中に、ワークスペース一式が
  生成されます。

(2) MPLAB IDEを起動し、File → Open Workspace で上記ディレクトリの中にある
  「MCHPUSB.mcw」を指定して開きます。

(3) プロジェクトの環境を設定します。
  Project → Build Options → Project で開く Generalのタブの中で下図のように
  それぞれのディレクトリを設定します。
  Library Path と LinkerScript PathはMPLAB C18コンパイラをインストールした
  ディレクトリを指定します。




(4) ビルドの実行
  Project → Build All としてビルドを実行すれば正常にコンパイル完了するはずです。

(5) カスタマイズする
  ユーザーが作成すべき部分を修正しながら新規に作成します。






  トップページへ