ATXMegaのUSBハードウェアモジュール。 HID実装ガイド

Atmelの8ビットマイクロコントローラーのUSBハードウェアモジュールは長い間使用されてきました。 しかし、XMegaコントローラーファミリ用のロシア語での「ステップバイステップ」の明確なガイドは見つかりませんでした。 したがって、私は自分の経験を共有します。 経験は非常に表面的ですが、USBスタックの複雑さを短時間で掘り下げる機会のない開発者は、USBを介してコントローラーとコンピューターを確実に相互作用させることができます。 Atmel YouTubeチャンネルには、これを行う方法に関するビデオがあります。 ただし、多くの人にとっては、ビデオを見るよりも読む方が便利です。この投稿はこれらの人々向けです。 また、PC側での実装について説明します。



鉄。 ATXMega256A3BUコントローラーを使用しました 。 これは同じATXMega256A3ですが、ハードウェアで実装されたUSBモジュールを備えています。 ちなみに、ピン間互換性があると思いましたが、これは完全に真実ではありません。注意してください! コントローラD +およびD-の端子を、抵抗なしでコンピュータコネクタの対応するピンに直接接続しました。 しかし、私の場合、それはコンピューターではなく、USBハブマイクロサーキット、そしてコンピューターでしたが、これが問題を大きく変えるとは思いません。



ソフトウェアマイクロコントローラー。 Atmel USBスタックが既にプログラマーによって実装されているファームウェアのバックボーンを作成するには、 Atmel Studioバージョン6に組み込まれているASFウィザードを使用します。 開始日には、新しいプロジェクトを作成する必要があります([ファイル]-> [新しいプロジェクト])。 次に、開いたウィンドウで、図に示されている項目を選択する必要があります。



画像



新しいプロジェクトを作成した後、ASFウィザードを実行する必要があります(メニューASF-> ASFウィザード)。 [Availbleモジュール]タブで、USBデバイス(サービス)を見つけて、[追加]をクリックする必要があります。 その後、USBデバイス(サービス)が[選択されたモジュール]タブに表示され、その前にドロップダウンリストが表示されます。 その中で、hid_genericを選択します。 次に、[概要]ボタンをクリックします。これでプロジェクトの作成は終了です。 今、彼はそれを意味で満たす準備ができています。 main.cプロジェクトファイルには、次の内容が表示されます。



#include <asf.h> int main (void) { board_init(); // Insert application code here, after the board has been initialized. }
      
      





board_init()関数は、デバッグボードXMEGA-A3BU Xplainedを初期化します。 私はこのボードを持っていませんでしたが、自分のボードを持っていなかったため、この機能を捨てました。 次に、USBを初期化する関数が必要です。 これはudc_start()です。 それはasf.hの腸のどこかで発表されるので、私たちは静かにそれを処方します。 conf_usb.hファイルに記述されている設定に従ってUSBを初期化しますこのファイルはプロジェクトフォルダーにあります。 USB HIDを構成するために特に重要なこのファイルの行は次のとおりです。



 #define USB_DEVICE_VENDOR_ID 0x03EB #define USB_DEVICE_PRODUCT_ID 0x2013 #define USB_DEVICE_POWER 500 // Consumption on Vbus line (mA) #define USB_DEVICE_ATTR USB_CONFIG_ATTR_SELF_POWERED #define USB_DEVICE_MANUFACTURE_NAME "Company Name" #define USB_DEVICE_PRODUCT_NAME "Varior Lens" #define USB_DEVICE_SERIAL_NAME "00001" #define UDI_HID_GENERIC_REPORT_OUT(ptr) my_callback_generic_report_out(ptr) extern void my_callback_generic_report_out(uint8_t *report); #define UDI_HID_REPORT_IN_SIZE 64 #define UDI_HID_REPORT_OUT_SIZE 64 #define UDI_HID_REPORT_FEATURE_SIZE 4
      
      







定義は自分で話す名前を定義します。 ネットワーク上のベンダーIDと製品IDに関する十分な情報があります。 UDI_HID_REPORT_IN_SIZEとUDI_HID_REPORT_OUT_SIZEは、それぞれ入力バッファーと出力バッファーのサイズです。 my_callback_generic_report_out()関数は、コンピューターからデータパケットを受信すると呼び出されます。 その中で、受信したデータを処理できます。



USBは初期化された後、使用できます。 一般的なプログラムコードは次のようになります。



 #define F_CPU 32000000UL #include <asf.h> int8_t ui_hid_report [64]; uint8_t report [64]; void my_callback_generic_report_out(uint8_t *data){ for (uint8_t i = 0; i < 64 i++){ report [i] = data[i]; } //    report      } void main(){ irq_initialize_vectors(); cpu_irq_enable(); sysclk_init(); udc_start(); sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_TC0); //    0 while(1){ //      ui_hid_report   udi_hid_generic_send_report_in(ui_hid_report); } }
      
      







sysclk_enable_module行(SYSCLK_PORT_C、SYSCLK_TC0)について少し説明します。 実際、sysclk_init()関数はデフォルトでほとんどの周辺機器のクロッキングをオフにします。 私はそれが何の原理なのか理解できませんでしたが、周辺機器をオンに戻す方法を見つけました:) sysclk_enable_module()を使用して、引数として含める必要があるものを追加できます。 プロジェクト全体で検索を使用し、検索パラメーターとしてsysclk_disable_moduleを指定すると、正確に追加できる内容を理解できます。



このコードをコントローラーに入力してコンピューターに接続すると、HID互換デバイスがデバイスマネージャーに表示されます。 デバイスとプリンターでは、#define USB_DEVICE_PRODUCT_NAME行に示された名前のデバイス。 私の場合、次のようになります。







コンピューター用ソフトウェア。



すべて同じAtmelは、コンピューターの側面でこれを行う方法の例を親切に提供します。 これらはVisual Studioで作成されており、私はあまり強くないので、C ++ Builderで書き直す必要がありました。 この機会に、私の同僚は私に言った:「出て行け」。 しかし、彼らはとても豊かで幸せです。 一般に、ビルダーの例を挙げます。



最初のステップは、AtUsbHid.dllライブラリを接続することです。 Atmelovskの例のあるフォルダーに入れて、プロジェクトのフォルダーにドロップする必要があります。 開始するには、適切な場所にある.hプロジェクトファイルで、次の行を記述します。



 typedef ULONG HIDStatus; typedef HIDStatus WINAPI __import tcloseDevice(void); typedef HIDStatus WINAPI __import tfindHidDevice(const UINT VendorID, const UINT ProductID); typedef HIDStatus WINAPI __import twriteData(UCHAR* buf); protected: tcloseDevice *closeDevice; tfindHidDevice *findHidDevice; twriteData *writeData;
      
      







さらに、プログラムの本文で、たとえばフォームを作成するとき、次のように記述する必要があります。



 HINSTANCE AtUsbHidhandle; AtUsbHidhandle = LoadLibrary("AtUsbHid.dll"); if (AtUsbHidhandle == 0) ShowMessage("  AtUsbHid.dll"); else{ closeDevice = (tcloseDevice*)GetProcAddress(AtUsbHidhandle,"closeDevice"); findHidDevice = (tfindHidDevice*)GetProcAddress(AtUsbHidhandle,"findHidDevice"); writeData = (twriteData*)GetProcAddress(AtUsbHidhandle,"writeData"); }
      
      







これで、HIDデバイスを操作するための関数が用意されました。 findHidDevice(VID、PID)は、対応するVIDおよびPIDを持つデバイスをシステムで検索します。 その後、あなたは彼らと働くことができます。 writeData()はデバイスに配列を送信します。 これはすべて、たとえば次のように使用できます。



 #define VID 0x03EB #define PID 0x2013 char a = 0; a = findHidDevice(VID, PID_1); if (a != 0){ Label1->Caption = ""; } UCHAR leds[64]; leds[0] = 255; leds[1] = 10; leds[2] = 20; leds[3] = 30; writeData(leds); closeDevice();
      
      







これが、ATXMegaにHIDデバイスを実装する方法です。 もちろん、USB設定の微妙さとニュアンスはこの記事では公開されていません。 ただし、このトピックに精通し始めたばかりの人にはアクションの指示があり、それを選んで整理するためにカードを渡す必要があります!



そしてもちろん、最後に、これが私にとってどのように機能するかについてのビデオを間違いなく持っています。 調整可能なズーム、フォーカス、アイリスを備えたビデオカメラ。






All Articles