AKI−USBを使いたい!
最終更新 2004.02.04
- ・概要
-
みなさんもご存知のとおり、秋月電子よりH8用のUSBキットが発売されました。
「とうとう出たか」という感じです。ちょうど2002年の1月ごろ後閑哲也氏のホームページで感化され、自身で
H8やPICとのインターフェースをいろいろと作ってみました。
当時のソースと柏野さんという方の汎用USBドライバを使って、ウィンドウズのDOSより文字列を送信し
受信はエンドポイント0で受信可能数を問い合わせて受信というような例を紹介していきたいと思います。
後閑哲也氏が公開していたソースを改造して、CQ出版社のTECHI「USBハード&ソフト開発のすべて」
(以下、TECHIと表記します)で紹介されている、エンドポイント0によるベンダリクエストを使用した受信可能数
の問い合わせをして受信という方法を使用したいと思っています。
ハードウェアは秋月電子のAKI−USB(CPUボードはAKI−3048を使用します)でやりたいと思います。
今回、改造したソースの公開を許可してくれた後閑氏には、この場を借りてお礼をいいたいと思います。
Labviewでの通信方法等はソフトウェアのページで少し紹介していますので、興味ある方は覗いてみてください。
- ・開発環境
-
コンパイラ:H8用GCC h8300-hms-gcc-3.0.3-1+binutils-2.11.1(for Windows)
ロムライタ:H8ROM書き込みツール for Windows
- ・設定されている情報等
-
ソフトウェアでUSBN9604に対し設定した内容は、以下の通りです。
・パイプ1・3・5は受信用(OUT)、0・2・4は送信用(IN)としました。
エンドポイント番号 |
パイプ番号 |
データ方向(ホストから見て) |
1 |
0 |
IN |
2 |
1 |
OUT |
3 |
2 |
IN |
4 |
3 |
OUT |
5 |
4 |
IN |
6 |
5 |
OUT |
・このうちパイプ5を送信用とパイプ4を受信用として使用しました。
(USBN9602がこの2つのみ64バイトFIFOだったので、そのソースの名残みたいです)
・H8のIRQ5を使用し、割り込みによる処理にしました。
・エンドポイント0(デフォルトパイプ)はSET ADDRESSのリクエスト受信後、常に受け付けるようにしました。
(このエンドポイント0でベンダリクエストを受け付けるためです)
・暫定的にベンダIDをFF08H,プロダクトIDをFFC0Hにした。
ベンダID:各ベンダ(製品を出す会社など)がUSBフォーラムより取得するユニークなID。
プロダクトID:ベンダ独自につけるID(たとえば製品ごとに違うIDをつけるなど)
- ・動作説明
-
後から細かいところまで付け加えていきますが、とりあえず概要のみ説明します。
このソフトウェアは、最終的にはRS−232CをUSBで置き換えるという前提で作っています。ドライバを作る
気力と根性がなかったので作っていませんが、ドライバ側がなんとかなれば仮想COMポートになるぞという
ものです。(TECHIの11章に出ているドライバを使ってみましたが、うまくいきませんでした)
さて、ホスト(PC)がUSBのバス権をすべて握っています。つまりホストによって送信と受信をしますので、
デバイス側が勝手にデータを送ることはできません。また、デバイス側が送信準備できていないのにホスト側
が読み出そうとすると、用意ができるまでホストは待たされてしまいます。ということは232Cみたくできない
じゃないかということになりますが、では同じようにするにはどうしたら良いでしょうか?
ここでいつも受け付け可能にしてあるエンドポイント0を利用します。このエンドポイントはプラグ&プレイ時
などに使用する双方向性のパイプ(デフォルトパイプ)です。(ほかのパイプ1〜5は片方向のみです。)
数ms(たとえば10ms)ごとにベンダリクエストというリクエストを送り、デバイス側は現在送信できるバイト数を
必ず返します。こうすることで、ホスト側は受信が可能になった時点でデバイスに対して読み取りをし、無駄な
待ちを防ぎます。デバイス側のプログラムとしては、送信用・受信用のリングバッファを設けておきます。
ベンダリクエストが来た時点で送れるデータが送信用バッファtxbuffにあったときは、ホストに対し送信できる
バイト数を返します。このとき、USBN9604の送信FIFOに対してもデータを書き込んでおきます。
(FIFOサイズが64バイトなので、MAX64バイトです。)
ホストは、返ってきた受信可能バイト数に対し、64バイトより大きければ64バイトを読み取り、少なければ
そのバイト数を読み取ります。残りは次回のベンダリクエストでまたバイト数を取得し読み取ります。
デバイスがデータを受信したときは、受信用バッファrxbuffに対しデータを書き込んでおきます。
こうすることでアプリケーションからは送信時は送信バッファに対し書き込むだけ、受信時は受信バッファより
読み出すだけで232C通信と同様のインターフェースを持つことができます。
また、PB0〜PB3LEDのうち、PB3はエンドポイント0の送信ルーチン(tx_0())、PB2はエンドポイント0の
受信ルーチン(rx_0())、PB1は送信ルーチン(tx3())、PB0は受信ルーチン(rx3())の処理中に点灯します。
また、リセット後に動作確認としてPB0〜PB3が順番に光ります。(LCDをつけないときの動作確認用です)
LCDの表示は「INIT_DONE」->「PLUG&PLAY」->「CONFIGURE」と推移します。
スタートアップ画面後、すべての初期化処理が終わった時点で「INIT_DONE」が表示されます。この後、ホスト
よりSet Addressが転送された時点で「PLUG&PLAY」が表示されます。ここで割り当てられたノードアドレス
も表示されます。さらに、Set Configurationでコンフィギューレーションをしたとき(コントロール転送での
やりとりが完了)に、「CONFIGURE」が表示されます。この時点でホストにドライバが組み込まれたことに
なります。
- 汎用ドライバUUSBD設定
-
詳しくはUUSBDの説明を見てください。ここではuusbd.infの設定を説明します。
1.「新しいデバイスを〜」の項目に、以下の行を追加する。(すでに書かれているものの下でいいです。)
%USB\VID_FF08&PID_FFC0.DeviceDesc%=UUSBD.Dev, USB\VID_FF08&PID_FFC0
2.一番下の「デバイスを追加したら〜」の項目に、いかの行を追加する。
USB\VID_FF08&PID_FFC0.DeviceDesc="AKI-USB TEST Driver"
3.パソコンにソフトを焼きこんだAKI−USBを接続するとデバイスドライバの指定画面が出ますので、
uusbd.infとuusbd.sysを入れたフォルダを指定する。
4.ウィンドウズ「システムのプロパティ」で、「UUSBD用USBデバイス」とその中に「AKI-USB TEST Driver」と
表示されれば成功です。
- ・ユーザーインターフェース関数
-
init_usbn(void); USBN9604の初期化
getusbrxcnt(void); 受信バッファ内のデータ数を調べる
getusbbufn(char *buf,int n); 受信バッファからnバイト取り出す
setusbbufn(char *buf,int n); 送信バッファにnバイト書く
getusbbuf(char *buf,int n,char dl); 受信バッファからnバイトまたはデリミタまで取り出す
setusbbuf(char *buf); 送信バッファに書く
- その他機能
-
シリアル通信によるコマンド機能
−変更情報−
USBのバージョンが間違っていた。(1.1は0110Hとするべきである。)
- 注意事項
-
・ソースコードまたはMOTファイルで使用しているベンダID<FF08H>,プロダクトID<FFC0H>は
個人的趣味で使用するため、任意でつけたものです。本来ベンダIDはUSBインプリメンターズフォーラム
にて正式取得しなければいけません。このことを認識したうえでご使用ください。
・このソースコードまたはMOTファイルを商用利用しないでください。
・これらソースコードおよびMOTファイルを使用したことによる、いかなる損害に対してもその責任を負いません。
また、ソフト不具合やバグの修正をする義務を負わないこととします。
戻る
Copyright Junnichi Tomaru