HOME

 Atmel USB CDCデモ (WindowsXP SP2にて動作確認しました)

はじめに

 ここでは、ATMEL STK526デモボードのプロジェクトファイルを使用してUSB CDCを試してみようとおもいます。

 

1.AT90USB162  基板の準備

ユユニバーサル基板を使用

USBマウスと同じです。そちらを参考にしてください。RXD,TXDが今回新しく使用するPINです。

ループバックで実験するのであれば、RXDとTXDをショートしてください。

RXD    8PIN

TXD    9PIN

AT90USB162 USBマウス実験 回路図

2.開発環境の準備

AVRStudio4.13(最新版)をダウンロードしてください(再コンパイルする場合、必須)

WinAVRの最新版 2007.5.27をダウンロードしてください(再コンパイルする場合、必須)

USB ブートローダーでのプログラミングツール FLIP3をダウンロードしてください(書き込みに必須)

  FLIP 3.2.2 for Windows (Java Runtime Environement included)  ←通常はこちらをダウンロード

 AtmelのAT90USB162の情報ページ  

情報ページにある USB DFU Bootloader Datasheet  はFLIP3について書かれています(必読)

 

3.CDCプログラムのダウンロードとコンパイル

AVR USB Software Packages (Atmelサイト)ここから以下のプログラムをダウンロード

   AT90USB162/82 CDC Virtual Com Port project (1 MB, revision 1.0.1)

   解凍してできたAtmelフォルダーごとをC:\にコピーしてください。

   フォルダ構成は変更しないでください。

   例  c:\Atmel\at90usb162-cdc-1_0_1のようになります。

   上記のgccフォルダ内のmouse.apsをダブルクリックして、AVRStudio4を起動します。

C:\Atmel\at90usb162-cdc-1_0_1\at90usb162\demo\cdc\conf\config.hを開いて、

#define FOSC 8000

上記の記述は8MHzですが、水晶16MHzなら #define FOSC 16000 に変更する必要があります。このプログラムは8MHzまたは16MHzだけ選択できます。

 AVRStudio4にてBuildすると、gccフォルダにcdc.hexができます。

 8MHzのcdc.hex    16MHzのcdc.hex

 ご注意: cdc.hexは日本語が入ったフォルダに入れないでください。日本語フォルダはFLIPソフトで読み込めません。

  

4.FLIPのUSBドライバーのインストール

 FLIPはUSB経由で書き込みをおこなうソフトです。ですからライターを用意する必要はありません。 ハードが完成したらUSB接続してください。Windowsがドライバーを要求してくるので、ドライバーの場所を以下にしてFLIP用のUSBドライバーをインストールします。

  C:\Program Files\Atmel\FLIP 3.2.2\usb

 FLIPの使用方法は開発環境の準備で説明した USB DFU Bootloader Datasheet に詳細にかいてありますので、詳しく知りたいかたはご覧ください。

 

5.基板のUSBブートローダー起動手順

1.USBをPCに差し込み基板と接続します。

2.基板のHWBスイッチを押します。

3.基板のRESETスイッチを押します。

4.基板のRESETスイッチを離します。

5.基板のHWBスイッチを離します。

6.これにより基板のUSBブートローダーが起動されます。

 

  BootLoaderが起動したときのデバイスマネージャー

 

      LibUSB−Win32 Devices ・・・・・ AT90USB162と表示されます。

 

6.FLIPによる書き込み手順

準備.基板のUSBブートローダーを起動しておきます

1.FLIPソフトを起動します。

2.@アイコンにてデバイス選択します。→AT90USB162

3.AアイコンにてUSBポートをOPENします。

4.Bアイコンにてcdc.hexファイルをロードします。

5.Cボタンにて消去、書き込み、ベリファイをおこない、プログラムを転送します。

 

7.USBデバイスとして認識

 FLIPで書き込んだあと、一度USBを外してもう一度挿せば新しいデバイスとしてドライバを要求してきます。

 CDC用INFファイルはat90usbxxx_cdc.iniです。INFファイルの場所でC:\Atmel\at90usb162-cdc-1_0_1\at90usb162\demo\cdcを指定してください。

  at90usbxxx_cdc.ini

正常に読み込まれると、「AT90USBxxx CDC USB to UART MGM」として認識されます。

 

8.通信テスト

 AVR側はループバックにしました。USARTのボーレートは1Mbpsとしました。

 データフォーマット: 非同期、8ビット、ストップビット1です。

 PC側は仮想COMポートになりますが、F2DKcommというDLLライブラリを使ってサンプルプログラムを改造して送受信とコンペアできるようにしました。ボーレートは921Kbps?が設定できたのですが、ほんとでしょうか。

 PCからの送受信は4バイト毎に1msecのwaitを入れないとコンペアエラーが発生してしまいます。たぶんUSBの1回の送受信で4バイト送受をしているのではと思われます。あまりにも少ない転送容量なので、コントロール転送かもしれません・・・。そんなバカな! あとでもう少し調べます。

 AVR側はせっかくUSB2.0で12Mbpsなのに無駄なwaitが入っているので遅い結果です。納得いきません。たしかUSB2.0でもホストPCが遅いとUSB1.1にもならないとけないのですが、そんなはずもないし、いったいどうなっているのやらというところです。

 AVR側のUSARTの受信バッファが4バイトということも考えられます。または最大4バイトで1回のUSBパケットに乗るということかもしれません。

この先は、AVR側のソースを見て解析してご報告します。

 

● AVR側のソース考察

C:\Atmel\at90usb162-cdc-1_0_1\at90usb162\demo\cdc\usb_specific_request.cをみると

void usb_user_endpoint_init(U8 conf_nb)

{

  usb_configure_endpoint(INT_EP,      \

                         TYPE_INTERRUPT,     \

                         DIRECTION_IN,  \

                         SIZE_32,       \

                         ONE_BANK,     \

                         NYET_ENABLED);

 

  usb_configure_endpoint(TX_EP,      \

                         TYPE_BULK,  \

                         DIRECTION_IN,  \

                         SIZE_32,     \

                         ONE_BANK,     \

                         NYET_ENABLED);

 

  usb_configure_endpoint(RX_EP,      \

                         TYPE_BULK,     \

                         DIRECTION_OUT,  \

                         SIZE_32,       \

                         ONE_BANK,     \

                         NYET_ENABLED);

  Usb_reset_endpoint(INT_EP);

  Usb_reset_endpoint(TX_EP);

  Usb_reset_endpoint(RX_EP);

}

 

TXにバルク用のエンドポイントが32バイト、RXにもバルク用のエンドぽんとが32バイト割り当てられています。これは1回のUSBパケットで最大32バイト転送できることを意味します。

 

エンドポイントとは:

USBバッファと同意味と思います。違ったらご指摘ください。

 

PC (OUTエンドポイント)   → デバイス (OUTエンドポイント)

PC (INエンドポイント)      ←  デバイス (INエンドポイント)

 

PC(ホスト)からみて、方向のIN/OUTが決められています。

 

 

● ソフトウエアUSBアナライザ

 

 ここで、ソースの解析を離れてソフトウエアUSBアナライザの評価板があったので試してみました。ソリトンウエーブからダウンロードできるUSBモニタ(Device Monitoring Studio)というものです。

 

データ:128000バイト 4バイト単位の送信の繰り返し

 

 

 これを見るとRead・Writeともにmax3952バイト/secとなっています。グラフからみると平均でmaxくらいでているようなのですが、aveが650バイト/secとなっています。

 

 さらにパケットを見ると、デバイスへの送信が4バイト単位でwriteできますが、readは200バイト以上まとめてINエンドポイントに入ってくるようです。PCへのreadはPC側のUSBのINエンドポイントメモリ1つにまとめられているのかもしれません。

 

 それとわかったことは、一度の送信を4バイトにする限り、1msecのwaitは不要であることがわかりました。OUTエンドポイントは32バイトまであるので、この4バイト送信(PC→DEVICE)の制限はAVRのUSARTに関連するものではないかと思います。

 

 

 

データ:256Kバイト 256バイト単位の送信の繰り返し

 

 

 

 senshuさんの提案により、AVR側のUSARTを使わないで転送をしてみました。PCからAVRへの送信のみの時間が測定できました。送信パケットにはセットしたデータがあったので、送信は成功していると思われます。

 

 今回は送信速度が一定ではなく、徐々にあがって、徐々に下がっていくものでした。256KBを4秒で送信したので、実質64KB/secとなります。グラフのmaxは128KB/secなので最大瞬間風速なのでしょう。

 

 送信パケットが256バイトだったので、送信単位を256バイトにしましたが、1024バイト単位でも送信できるようです。その場合maxが188KB/secとなっていました。速度が上がるようなので、たぶんPC側のOUTエンドポイントがダブルとかトリプル、クオッドの構成になっているのでしょう。

 

 グラフの山の平坦がないので、もっとデータ数を増やせば平坦部分ができて、平均128KB/secに近づくのではと想像されます。この予測が正しいか、次の機会に測定してみます。

 

 

データ:2560Kバイト 256バイト単位の送信の繰り返し

 

 

 

 AVR側のUSARTを使わない転送のデータ容量2560KBを試してみました。

 

 今回は送信速度が一定です。2560KBを22秒で送信したので、実質116KB/secとなります。平坦部分は128KB/secとなっていて予測どおりです。

なお、今回からグラフを直線表示しています。前回までは、曲線表示でした。

 

 

 

 

 

 

 

inserted by FC2 system