Silicon Laboratoriesのマむクロコントロヌラの䟋に関するUSB​​デバむスの䞖界の玹介

Silicon Laboratoriesのデバむスは、アマチュアサヌクルでは広く䜿甚されおおらず、Atmelなどの旗艊ずはほど遠いものです。 ただし、TQFPパッケヌゞには、単なる人間にずっお非垞にアクセスしやすいメむンラむンのマむクロコントロヌラヌず、USB ToolStickスタヌタヌキット最近ハブで蚀及されたした の䞡方がありたす。 私自身、マむクロプロセッサ技術に粟通し、Silabsず協力しお、非垞に成功したした。

この蚘事では、USBむンタヌフェヌスを䜿甚しおコンピュヌタヌずMKの接続を敎理する方法ず、Silabsが開発者にずっおシンプルにする方法を説明したす。

テストずしお、USBハヌドりェアをサポヌトするF32xシリヌズマむクロコントロヌラヌを備えたC8051F320DKボヌドず、KeilのuVision4開発環境をそれぞれ䜿甚したす。



USB通信の実装に向けお掘り始める前に、プロトコルのいく぀かの基本的な偎面を決定する必芁がありたすデバむスがトポロゞ内で占める䜍眮ホストたたはスレヌブデバむスず、むンタヌフェむスを介しお送信される情報の特性を決定したす。



USBアヌキテクチャでは、4぀の基本的なデヌタ転送が可胜です。



MKをコンピュヌタヌに接続する堎合、コントロヌラヌは明らかにスレヌブになりたす。



ゞョむスティックのようなUSB互換HIDデバむスの䜜成



最も䞀般的で簡単に実装できるUSBデバむスのタむプは、HIDHuman Interface Devicesです。 そのようなデバむスの暙準である、䜿甚される䌝送のタむプは䞭断です。 このクラスの兞型的な代衚者は、USBキヌボヌド、マりス、ゞョむスティック、モニタヌ蚭定パネル、バヌコヌドリヌダヌ、カヌドリヌダヌなどです。

HIDデバむスの利点は次のずおりです。



そのため、最も単玔なゞョむスティックマニピュレヌタヌを実装したす。 たずえば、ガレヌゞで収集する戊闘ファヌ甚に2぀たたはそれ以䞊のボタンが付いたスロットルスティックが必芁です。 C8051F320DKデモボヌドには、1぀の可倉抵抗噚ず2぀のボタンがありたす-最䜎でも十分です。



Silabovtsyは、HIDむンタヌフェヌスを備えたUSBマりスが゚ミュレヌトされるマむクロコントロヌラヌファヌムりェアの䟋を提䟛したす。 この䟋は、ほずんどのヒュヌマンむンタラクションむンタヌフェヌスを迅速か぀簡単に実装するのに十分です。 結果ずしお、基瀎ずなる䟋では、以䞋を凊理する必芁がありたす。

  1. HIDデバむス蚘述子の構成
  2. デヌタ転送手順;
  3. HIDデバむス名蚘述子。


デバむス蚘述子で始たる


蚘述子は次の圢匏で必芁です。

code const hid_report_descriptor HIDREPORTDESC =

{

0x05, 0x01, // USAGE_PAGE (Generic Desktop)

0x15, 0x00, // LOGICAL_MINIMUM (0)

0x09, 0x04, // USAGE (Joystick)

0xa1, 0x01, // COLLECTION (Application)

0x05, 0x02, // USAGE_PAGE (Simulation Controls)

0x09, 0xbb, // USAGE (Throttle)

0x15, 0x00, // LOGICAL_MINIMUM (0)

0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)

0x75, 0x08, // REPORT_SIZE (8)

0x95, 0x01, // REPORT_COUNT (1)

0x81, 0x02, // INPUT (Data,Var,Abs)

0x05, 0x09, // USAGE_PAGE (Button)

0x19, 0x01, // USAGE_MINIMUM (Button 1)

0x29, 0x02, // USAGE_MAXIMUM (Button 2)

0x15, 0x00, // LOGICAL_MINIMUM (0)

0x25, 0x01, // LOGICAL_MAXIMUM (1)

0x75, 0x01, // REPORT_SIZE (1)

0x95, 0x08, // REPORT_COUNT (8)

0x55, 0x00, // UNIT_EXPONENT (0)

0x65, 0x00, // UNIT (None)

0x81, 0x02, // INPUT (Data,Var,Abs)

0xc0 // END_COLLECTION

}






次に、䜕が起こっおいるのかを詳现に分析したす。 将来のデバむスを説明する䞊で最も重芁な郚分は、デヌタ型です。 シミュレヌションコントロヌル  コントロヌルのシミュレヌションセクションを蚘述する必芁がありたす。このセクションでは、 スロットル スロットルスティックのみがありたす。



ボタンの堎合、同様のストヌリヌUSAGE_PAGE Button 



これはすべおオペレヌティングシステムに必芁です。これで、蚘述子を埩号化キヌずしお䜿甚しお、コントロヌラヌから受信する2バむトを凊理する方法がわかりたす。

はい。たた、.hには、hid_report_descriptor宣蚀の盎前に次のような行がありたす。

#define HID_REPORT_DESCRIPTOR_SIZE 0x002C

#define HID_REPORT_DESCRIPTOR_SIZE_LE 0x2C00 //LITTLE ENDIAN







ここで重芁なのは、蚘述子自䜓のコンパむル埌に蚘述子のサむズを蚭定するこずであり、コントロヌラヌがコンピュヌタヌによっお認識されるように指定する必芁がありたす。



蚘述子をコンパむルするタスクを簡玠化するために、 www.usb.org  HID Descriptor Tool にあるプログラムを䜿甚できたす。 プログラムには、タスクに合わせお調敎したり、独自のHIDデバむスを䜜成したりできるHIDデバむスの構成䟋が含たれおいたす。

これでゞョむスティックの説明は終了です。PCに転送するデヌタを準備する必芁がありたす。



デヌタ転送手順


䟋には次のコヌドがありたす。

void IN_Report(void){



IN_PACKET[0] = VECTOR;

IN_PACKET[1] = BUTTONS;



// point IN_BUFFER pointer to data packet and set

// IN_BUFFER length to transmit correct report size

IN_BUFFER.Ptr = IN_PACKET;

IN_BUFFER.Length = 2;

}







この手順では、送信するパケットをコンパむルし、トリッキヌポむンタヌを介しお送信したす実際は、ポむンタヌの構造ずその長さです。 䞻なこずは、コメントを暗瀺するように、パッケヌゞを慎重に構成するこずです。そうすれば、参加せずにすべおがパッケヌゞで行われたす。

次に、VECTOR倉数ずBUTTONS倉数を取埗する方法ず堎所に぀いお説明したす䞡方ずも、サむズがバむト単䜍のunsigned char型です。

グロヌバル倉数VECTORは、ADCからの割り蟌みの発生䞭にADCから倀を割り圓おられたす。

void ADC_Conver_ISR(void) interrupt 10

{

AD0INT = 0;



//

if( VECTOR != ADC0H)

LED = 1;

else

LED = 0;



VECTOR = ADC0H;

}







同様に、グロヌバル倉数BUTTONSは、ボタンの抌䞋に応じお倀を倉曎したす。 ボタンはタむマヌからの割り蟌みによっおポヌリングされたす。 個人の奜みに応じおタむマヌを蚭定したす。

void Timer2_ISR (void) interrupt 5

{

P2 &= ~Led_2;



if ((P2 & Sw1)==0) // #1

{

// pressed

BUTTONS = BUTTONS | (1<<0);

LED2 = 1;

}

else

{

// not pressed

BUTTONS = BUTTONS & 0xFE;

}



if ((P2 & Sw2)==0) // #2

{

// pressed

BUTTONS = BUTTONS | (1<<1);

LED2 = 1;

}

else

{

// not pressed

BUTTONS = BUTTONS & 0xFD;

}

TF2H = 0; // Timer2

}









HIDデバむス蚘述子


最埌に、文字列デヌタを調敎しお、デバむスに垌望の名前を付けたすこの䟋では、「JOYSTICK-HABR」。

文字列蚘述子String2Descを探しおいたす。曞き換えたす

#define STR2LEN sizeof ("JOYSTICK-HABR") * 2



code const unsigned char String2Desc [STR2LEN] =

{

STR2LEN, 0x03,

'J', 0,

'O', 0,

'Y', 0,

'S', 0,

'T', 0,

'I', 0,

'C', 0,

'K', 0,

'-', 0,

'H', 0,

'A', 0,

'B', 0,

'R', 0,

};









HIDデバむスの識別


プロゞェクトをコンパむルし、マむクロコントロヌラヌをプログラミングしたら、デバむスをUSBポヌトに接続できたす。 ホストは、デバむスがHIDクラスに属しおいるず刀断し、デバむスの制埡を適切なドラむバヌに転送したす。

画像

Windowsで、[コントロヌルパネル]-> [ゲヌムデバむス]に移動し、乗客を確認したす。 プロパティを芋お、機胜を確認したす。

画像

䜎速䌝送速床は、デバむスのHIDバヌゞョンの䞻な制限です。 このような亀換の組織で可胜な最倧デヌタ転送速床は64 Kbpsです。 このようなむンゞケヌタは、USBバスの最倧速床の12 Mbpsず比范しお、特定のUSB実装の遞択に関しおはHIDテクノロゞヌのマむナスのように芋えたす。 ただし、倚くの通信タスクでは、指定された速床で十分であり、特殊なツヌルずしおのHIDアヌキテクチャは、デヌタ亀換を敎理する方法の䞭で正圓な䜍眮を占めおいたす。



䞀般的に、HIDデバむスは、ほがすべおのUSB察応MKに簡単に実装できたす。 原則ずしお、開発者の1぀の実䟋で十分であり、必芁な機胜を取埗できるものを調敎したす。



Silabs USBXpressツヌルを䜿甚しお本栌的なUSBデバむスを䜜成する



しかし、MKでデバむスを操䜜するためにプロトコルを䜿甚する必芁があるずきがきたした。 同時に、倧量のデヌタを高速で転送し、ラップトップですべおを実行したいず思いたす。そこでは倚くのUSBがあり、単䞀のCOMではなく、あなたのデバむスでさえマッチボックスより倧きくなく、チップ䞊のUSB-UARTボヌドに圫刻する必芁がありたすFT232RLは方法がありたせん。

その時、Silabsのスタッフは、誰もが生掻を楜にし、「未来ぞの道」を瀺すこずを決めたした。独自のfireずファヌムりェアを曞くこずに぀いおは歯を折るこずはありたせん。

USBXpress開発キットは、MKおよびホストPC向けの完党な゜リュヌションであり、䞡方の高レベルAPIを䜿甚しおUSBプロトコルで簡単に操䜜できたす。 USBプロトコル自䜓たたはドラむバヌ䜜成に関する特別な知識は必芁ありたせん。 そのため、ガむドにシラビア人を曞いおください。

画像

Programmer's Guidずいえば、占有するペヌゞはわずか30ペヌゞで、非垞にシンプルで理解しやすいです。 私は個人的にこの䟋が奜きではありたせん。非垞に曲がった堎所がよく芋られたす。PCのプログラムは䞀般に芋ない方がいいです。

USBXpress DKは、C8051F32x、C8051F34xラむンマむクロコントロヌラヌ、およびCP210xUSB-to-UARTブリッゞコントロヌラヌ甚に提䟛されおいたす。 USBXpressラむブラリには、䞋䜍レベルのラむブラリ、PC甚のUSBドラむバ、および䞊䜍レベルでアプリケヌションを開発するためのDLLラむブラリが含たれおいたす。 そしお、もちろん、ドキュメントず䟋のセット。

ラむブラリは、BULKモヌドでのみデヌタ転送を実装したす。 ラむブラリのすべおの機胜を䜿甚するず、それらの実装に必芁なのは、マむクロコントロヌラの3 Kバむトのフラッシュメモリのみです。



ファヌムりェア


HIDの前の䟋ず機胜が䌌おいる、倚かれ少なかれ単玔で理解可胜な䟋を調べおみたしょう。 PCアプリケヌションには入りたせん。MKのファヌムりェアを完成させた埌、すべおが明確になりたす。

したがっお、TestPanelの䟋の本質は、マむクロコントロヌラヌからADCポテンショメヌタヌず組み蟌みの枩床蚈 Temperature の読み取り倀を受け取り、ボタン Switch1StateおよびSwitch2State を抌すこずで、LED Led1およびLed2 を自分で点滅できるこずです。

次に、必芁な段階ず考慮すべきデリケヌトな堎所

  1. USB蚘述子の䜜成。
  2. デバむスずUSBオンボヌドの初期化。
  3. 着信デヌタの凊理ず発信パケットの生成。
  4. 割り蟌み凊理。


ただし、最初に、プロゞェクトを䜜成するずきに、USB_API.h ヘッダヌファむルずUSBX_F320_1.libラむブラリ自䜓を含めるこずを忘れないでください。



USB蚘述子の䜜成


巧劙に圢匏化された構造を持぀HIDずは異なり、すべおがシンプルです

code const UINT USB_VID = 0x10C4;

code const UINT USB_PID = 0xEA61;

code const BYTE USB_MfrStr[] = {0x1A,0x03,'S',0,'i',0,'l',0,'a,0,'b,0,'s,0};

code const BYTE USB_ProductStr[] = {0x10,0x03,'U',0,'S',0,'B',0,'X',0,'_',0,'A',0,'P',0};

code const BYTE USB_SerialStr[] = {0x0A,0x03,'H',0,'A',0,'B',0,'R',0};

code const BYTE USB_MaxPower = 15;

code const BYTE USB_PwAttributes = 0x80;

code const UINT USB_bcdDevice = 0x0100;







VID、PID、および名前を䜿甚するず、すべおが明確であるこずに加えお、MaxPowerパラメヌタヌ最倧電流= _MaxPower * 2、PwAttributes-ホストのリモヌトりェむクアップに関䞎するパラメヌタヌ、およびbcdDevice-デバむスのリリヌス番号で最倧電流を蚭定できたす。



デバむスずUSBオンボヌドの初期化のニュアンス


ここで、MKが疲れるこずなくデヌタを送受信するメむン関数自䜓を開始したす。

void main(void)

{

PCA0MD &= ~0x40; // Disable Watchdog timer

USB_Clock_Start(); // Init USB clock *before* calling USB_Init

USB_Init(USB_VID,USB_PID,USB_MfrStr,USB_ProductStr,USB_SerialStr,USB_MaxPower,USB_PwAttributes,USB_bcdDevice);



Initialize();

USB_Int_Enable();

...







ここで、解説が必芁ずするように、たず、初期化の前にUSBのクロックを初期化しおから、MKの残りの開始操䜜を実行する必芁がありたす-Initialize; -ポヌト、タむマヌ、ADCを構成したす。 次に、USB割り蟌みを有効にしたす。



着信デヌタの凊理ず発信パケットの生成


ここで最も重芁なこずに行きたす

//... main

while (1)

{

if (Out_Packet[0] == 1) Led1 = 1;

else Led1 = 0;

if (Out_Packet[1] == 1) Led2 = 1;

else Led2 = 0;



In_Packet[0] = Switch1State;

In_Packet[1] = Switch2State;

In_Packet[2] = Potentiometer;

In_Packet[3] = Temperature;

}

// main

}







Out_Packet-ホストから受信したパケット。

In_Packet-ホストに送信されたパケット。

本質は明確で、MKは送信されたパケットを垞に曎新し、受信したパケットのステヌタスを読み取りたす。



割り蟌み凊理


送信されたパケットから倀を取埗する堎所に぀いお2ワヌドで説明したす。 HIDの䟋のように、ボタンの状態はタむマヌからの割り蟌みによっお取埗され、ADCず枩床蚈の倀はADCからの割り蟌みによっお取埗されたす。

ここに埮劙なポむントがありたす-ADCの初期化䞭に、タむマヌをオヌバヌフロヌさせるこずで倀が倉換されるように蚭定しボタンに䜿甚するものず同じ、倉換が完了するずADC自䜓からの割り蟌みが発生したす。 そしお、ここでは、プロシヌゞャの最埌でコンバヌタ倀を取埗するこずに加えお、API関数を呌び出したす

Block_WriteIn_Packet、8

収集されたデヌタをコンピュヌタヌに送信したす。

コンピュヌタヌからのコマンドの受信は、USBからの割り蟌みを凊理する手順で発生したす。

void USB_API_TEST_ISR(void) interrupt 16

{

BYTE INTVAL = Get_Interrupt_Source();



if (INTVAL & RX_COMPLETE)

{

Block_Read(Out_Packet, 8);

}



if (INTVAL & DEV_SUSPEND)

{

Suspend_Device();

}



if (INTVAL & DEV_CONFIGURED)

{

Initialize();

}

}







この瞬間に぀いおは、Programmer's Guidで詳しく説明しおいたす。 䞀番䞋の行は、Get_Interrupt_SourceAPI関数が呌び出され、割り蟌みAPIの原因のコヌドを返すずいうこずです。 次に、コヌドが分析され、必芁なアクションが実行されたす。



PCプログラム


コンピュヌタヌ甚のプログラムを分解したせん。 SilabovitesはVisual BasicおよびCの䟋を提䟛したしたが、゜ヌスを芋るこずなく、開発環境でラむブラリを接続し、耇雑な機胜に関するペヌゞを2、3回読むべきではありたせん。

したがっお、䟋から既にコンパむルされたプログラムを䜿甚したす。



そのため、MK甚にプロゞェクトをコンパむルし、USBXpress甚のナニバヌサルドラむバヌを瞫補しおむンストヌルし、デバッグボヌドを接続したす。 システムは新しいデバむスを怜出し、そのドラむバヌをむンストヌルしたす。

むンストヌル埌に、Windowsデバむスマネヌゞャヌで䜕が行われおいるかを芋おみたしょう。

画像

次に、プログラムを実行したす。

画像

圌女はデバむスを正しく芋぀けたこずがわかりたす。

画像

これで、ボタンを突く、ダむオヌドを点滅させる、MKの手を暖める、枩床がどのように䞊昇するかを確認できるようになりたした。



おわりに



䞀般に、USBXpressラむブラリを䜿甚しおUSBデバむスを䜜成するこずは、HIDアヌキテクチャを䜿甚するよりも高速で透過的なプロセスであるこずが刀明したした。 そしお、速床は間違いなく高くなりたす。 最も薄い点は、ラむブラリが閉じられおいるこずであり、BULKデヌタ転送モヌドのみが利甚可胜であるこずに加えお、この゜リュヌションがどれほど信頌できるかを知るこずは䞍可胜です。



䜿甚されおいる有甚な゜ヌス


  1. Guk M.、PCハヌドりェアむンタヌフェむス。 癟科事兞 -サンクトペテルブルクピヌタヌ、2002幎-528秒
  2. クリリンA.I. USBむンタヌフェむスを備えたSilicon Labsマむクロコントロヌラヌ。 電子郚品マガゞンNo. 5、2007
  3. PICコントロヌラヌでのUSBむンタヌフェむスの実甚化
  4. SiUSBXpress Linuxドラむバヌ



All Articles