歩き遍路 平成19年春(J1) 記録の準備
Visual C#で組込みUSBホスト経由して
   USBキーボードと通信(2) 
        キーボードと通信

 パソコンでVisual C#を使って、FT245R、PIC18F4520、組込みUSBホストSL811を経由してUSBキーボードと通信しました。
 通信内容は、USBキーボードのキー押下の内容取得とUSBキーボード上のLEDの点灯・消灯です。


●実験の構成

  実験の構成写真です。

・パソコンのUSBポートからのUSBケーブルは、
 マイコンボードの真ん中のFT245に繋ぎます。

 パソコンはVisual C#で作った通信アプリソフトとFT245用D2XXドライバを実行します。

・マイコンボードの下部は、コントローラの
 PIC18F4520でICEと接続しています。
 PIC18F4520はC18コンパイラを使います。

・マイコンボードの上部は、組込みUSBホストの
 SL811でUSBキーボードと接続しています。

 写真には写っていませんが SL811とUSBキーボードの間に、USBモニタが入っています。







●実験の内容と結果

 
上から、Visual C#で作った通信アプリソフトのGUI、USBモニタ画面、USBキーボードのLEDの点灯・消灯状況を示します。
 図中丸で囲った数字は操作手順を示します。又、ボタンの文字は、コマンド番号と機能を示します。

@ LEDを点灯・消灯するチェックボックスをチェックして「82h 初期化LedCmd出力」ボタンを押下します。
 Visual C#で作った通信アプリソフトは、82hと番号が付いたコマンドをFT245経由でPIC18F4520のコントローラに送ります。
 PIC18F4520のコントローラが82hと番号が付いたコマンドを受け取ると、マイコンボードのLEDの点灯・消灯と、組込みUSBホストSL811のレジスタを初期化します。この初期化でUSB信号のSOFが出るようになります。
 82hはコントローラPIC18F4520に送るコマンド番号で、 初期化LedCmd出力は機能を示します。

A 「73h SetAdrs3」押下で、USBモニタ画面のAに示す様に組込みUSBホストSL811から SET ADDRESS コマンドが発行されます。
 USBキーボードは応答するのですが ハンドシェクフェーズで NAK を返します。
 Bの「87h 0Byte IN Adrs0」押下で、再度 IN コマンドを発行して ACK の応答を得ます。
 これで、USBキーボードのUSBアドレスは 3 が設定されます。

C 「74h SetConfg」押下で、USBモニタ画面のCに示す様に組込みUSBホストSL811から SET COFIGURATION コマンドを発行。
 Aと同じ様に ハンドシェクフェーズで NAK の応答を、Dの「88h 0Byte IN Adrs3」押下で、再度 IN コマンドを発行して ACK の応答を得ます。このときUSBアドレスは 3 でIN コマンドを発行します。Bの「87h 0Byte IN Adrs0」押下ではUSBアドレスは 0 でIN コマンドを発行します
 これで、USBキーボードの動作準備完了です。

E 「78h GetKeyData8bCmd」押下で、USBモニタ画面のEに示す様に組込みUSBホストSL811から IN コマンドが発行されます。
 USBキーボードは、IN コマンドの応答として押下中のキー番号を返します。
 1番目は、キー押下無しです。
 2番目は、0のキー押下です。
 3番目は、0と1のキー押下です。

F  LEDを点灯・消灯するチェックボックスをチェックして、「51h UsbKbLed出力」押下で、USBモニタ画面のFに示す様に組込みUSBホストSL811から クラス定義コマンドが発行されます。このクラス定義コマンドは USBキーボードにデータを送るSET REPORT で1バイトのデータを送るよと言ってます。続いて1バイトのデータが送信されます。このデータの注目点は、LEDを点灯・消灯するチェックボックスのチェック内容と同じ 5 です。ここで LEDを点灯・消灯するデータを送っています一番下のUSBキーボードのLEDの点灯・消灯状況の図にその結果を示します。

 USBキーボードを少ないコマンドで制御しました。本来なら GET DESCRIPTOR 等を使う必要があるのですが今回は接続しているデバイスが分かっているので決め打ちでプログラムしました。






























































●困った事

 デバッグしている時に困った事がありました。
・SL811から完了信号が帰らない。
 SL811には2組の動作指令が有るのですがチャネルAに指令してもチャネルBの動作完了信号が戻り困りました。
 1ms毎のAlive信号は出ているし、レジスタの書き込みと読み出しも出来ているの完了信号が帰らないのです。
 何日も悩んだのですが、完了信号が正常に出て喜んだのですすが次の日からダメになりました。

 原因は単純でリセットが正常に掛かって無かったからです。リセットを確実にすれば正しく完了信号が出るようになりました。


●プログラム

 パソコンのVisual C#で作った通信アプリソフトとコントローラPIC18F4520のC18コンパイラを使ったファームウエアの構造は単純です。
 Visual C#で作った通信アプリソフトのGUIでボタンを押下すると該当のコマンドがFT245Rを経由してPIC18F4520コントローラに発行します。PIC18F4520コントローラは、受け取ったコマンドの番号を見て組込みUSBホストSL811に該当の一連を動作をして組込みUSBホストSL811からUSB信号を発行します。ベタでプログラムしてますのでコマンド番号とコメントで容易に理解できますので確認ください。


 ここVisual C#で作った通信アプリソフトを置きます。
 ここにPIC18F4520のファームウエアを置きます。



ホームへ戻る