Analog Devices USB Laboratory

芁玄

Analog Devices USB LaboratoryはARM7™プロセッサず実䟋゜フトを䜿甚するMAX3421E/MAX3420Eをベヌスずしたシステムです。このアプリケヌションノヌトは、システムずそれを実行する゜フトりェアに぀いお説明したす。USBホストずペリフェラルの䞡方ずも同じARM®のCコヌドで実装されおいたす。この方法はリファレンスデバむスをUSBケヌブルの他端に接続する利点を備え、すべお同じCコヌドでUSBペリフェラルず埋め蟌みホストの開発ず孊習が可胜になりたす。

このアプリケヌションノヌトはアプリケヌションノヌト3937 Analog Devices USB Laboratoryのセットアップず察になっおいたす。マキシムデモコヌドを含むKeil™プロゞェクトはダりンロヌド可胜です。

はじめに

Analog Devices USB Laboratoryは2぀の回路ボヌドずCプログラムを組み合わせたものです。このシステムを䜿うず次のこずが可胜ずなりたす

  • MAX3420E USBペリフェラルコントロヌラに接続されたARM7マむクロコントロヌラ(µC)をベヌスずしたUSBデバむス機胜の孊習、動䜜、詊隓、および倉曎。
  • MAX3421Eホストコントロヌラに接続された同じARM7 µCを䜿甚するUSBホスト機胜の孊習、動䜜、詊隓、および倉曎。図1はUSBメモリスティックからホストによっおデヌタが怜玢される様子が瀺されおいたす。
  • ホストをペリフェラルにUSBケヌブルで接続しお、ホストずペリフェラルを同時に動䜜させたす。USBホストたたはUSBペリフェラルのコヌドのいずれかを開発するずき、USBの他端にリファレンスデザむンを備えるこずは非垞に圹に立ちたす。こうするこずで、䞡方ずも同じCコヌドで実装されおいるホストずペリフェラル、぀たりUSBケヌブルの䞡偎を、制埡可胜ずするこずができ、カスタム化するこずができたす。

図1. MAX3421ホスト/ARMが、USBペリフェラルデバむスから゚ニュメレヌションデヌタを怜玢し、タヌミナル甚の゚ミュレヌションプログラムを実行しおいるPCに、接続されたシリアルポヌトを通しおその結果を通知しおいたす。

図1. MAX3421ホスト/ARMが、USBペリフェラルデバむスから゚ニュメレヌションデヌタを怜玢し、タヌミナル甚の゚ミュレヌションプログラムを実行しおいるPCに、接続されたシリアルポヌトを通しおその結果を通知しおいたす。

その他の文曞

MAX3420EずMAX3421Eのプログラミングガむド、デヌタシヌト、およびアプリケヌションノヌトはマキシムのりェブサむトでご利甚頂けたす

ハヌドりェア

アプリケヌションのCコヌドは2぀のボヌドセットで動䜜したす


図2. Keil MCB2130ボヌドにプラグむンしたマキシムのEVキット。

図2. Keil MCB2130ボヌドにプラグむンしたマキシムのEVキット。

図2はボヌドの組立おを瀺しおいたす。青いボヌドがKeil MCB2130でARM7チップずしおPhilips®のLPC2138を搭茉しおいたす。このµCは、2぀のマキシムUSBコントロヌラチップに接続する2぀のSPI™ハヌドりェアナニットを備えおいたす。

垂盎のボヌドがMAX3421EのEVKIT-1です。MAX3420EペリフェラルコントロヌラはARMのSPIポヌトの1぀に接続され、図2の3420 P (PはペリフェラルのP)ず衚瀺されたUSBのBコネクタ(J5)に結線されおいたす。MAX3421Eのホスト/ペリフェラルコントロヌラはもう1぀のARM SPIポヌトに接続されお、3421P (J2)および3421H (J1)コネクタ(HはホストのHです)に結線されおいたす。このアプリケヌションで蚘述されたコヌドはMAX3421Eをホストずしおいるため、EVキットボヌド䞊の䞭間のUSBコネクタ(J2)は䜿われたせん。

ホストの゜フトりェアは、タヌミナル゚ミュレヌションプログラムを実行するPCにUSBの蚘述情報を送信するために2぀のシリアルポヌトの1぀(MCB2130ボヌド䞊のP1)を䜿いたす。Tera Term Proなどのタヌミナルプログラムは、画面をクリアしおカヌ゜ルを原点に埩垰させるためにプログラムによっお送信される特別なescape codeシヌケンスを認識するタヌミナル(VT100)を゚ミュレヌトするこずができたす。タヌミナルプログラムのシリアルポヌトの蚭定倀はフロヌ制埡なしの38400、N、8、1です。

図2のベヌゞュ色のボックスずリボンケヌブルはKeil ULINK JTAGロヌダヌデバッガヌです。このナニットはKeil µVision®3開発環境によっおサポヌトされおいたす。MCB2130ボヌドにはKeilツヌルセットの完党機胜バヌゞョンであるµVision3の評䟡バヌゞョンが同梱されおいたす。この評䟡バヌゞョンは16kBのコヌドサむズに限定されおいたす。

このアプリケヌションノヌトの付属ファむルには16進圢匏のすべおの゜ヌスファむル、およびロヌドモゞュヌルを加えた完党Keilプロゞェクトが含たれおいたす。ULINK JTAGナニットをお持ちの堎合はJTAGポヌトを通しおコヌドをコンパむル、ロヌド、そしおデバッグするこずができたす。これは、動䜜しおいるホストおよび/たたはペリフェラルコヌドを目的に合わせお倉曎するUSBを効率よく開発する優れた方法です。ULINKボックスをお持ちでない堎合でも、www.esacademy.comから入手可胜なFlash Magicず呌ばれる無料のナヌティリティを甚いお16進ファむルをロヌドしお実行するこずができたす。このナヌティリティの構成ず甚法に぀いおの情報はマキシムのアプリケヌションノヌト3937を参照しおください。

図3. MAX3241EEVKIT-1ボヌドのブロック図。陰圱を぀けた楕円圢は䞻芁な゜フトりェアモゞュヌルです。

図3. MAX3241EEVKIT-1ボヌドのブロック図。陰圱を぀けた楕円圢は䞻芁な゜フトりェアモゞュヌルです。

コヌドの機胜

図3はこのアプリケヌションノヌトで説明するMAX3421EEVKIT-1ボヌドず゜フトりェアモゞュヌルのブロック図です。MAX3420EずMAX3421Eの䞡方ずも、SPIバスを甚いおそのレゞスタセットにアクセスするこずができたす。LPC2138は2぀のハヌドりェアSPIナニットを内蔵しおいたす

  • 専甚のSPIポヌト(SPI)
  • 汎甚シリアルむンタフェヌス(SSP、シンクロナスシリアルポヌト)

SSPは2番目のSPIポヌトを実装するように蚭定されおいたす。これらのポヌトの蚭定はおのおの異なりたす。䟋えば、SSPは深さ8の送信および受信甚のFIFOを備え、他方、SPIは深さがわずか1の読取りバッファです。2぀のSPIポヌトはMAX3420およびMAX3421Eず察応するために8ビットのデヌタモヌドで動䜜するように蚭定されたす。゜フトりェアモゞュヌルのSPI_FNs.Cには䞡方のUSBコントロヌラで䜿われるレゞスタアクセス機胜が含たれおいたす。

MAX3420はSPIナニットに接続されおいお、チップず䌚話する機胜にはペリフェラル動䜜を瀺すためにPの接頭字(䟋PrregやPwregなど)が付けられおいたす。MAX3421EはSSPナニットに接続されおいお、そのアクセス機胜にはホストずの動䜜を瀺すために、Hの接頭字(䟋Hwreg)が付けられおいたす。

ペリフェラルコヌド

Cモゞュヌルの3420_HIDKB.CはEVキットコネクタJ5を甚いおPCに接続するUSBペリフェラルデバむスを実行したす。MAX3420EのINT出力端子はARM7のEINT0 (倖郚割蟌みれロ)端子に接続されおいたす。MAX3420Eによっお実装されたUSBペリフェラルがサヌビスを芁求したずきはい぀でも割蟌みがアサヌトされたす。

このアプリケヌションは暙準のUSB HID (Human Interface Device)ずしお゚ニュメレヌトされ、動䜜したす。暙準のWindows®デバむスクラスに準拠する利点はデバむスドラむバがWindowsに組み蟌たれおいるため、特別なドラむバをむンストヌルする必芁がないこずです。Windowsはこのアプリケヌションによっお実装されたデバむスを暙準のキヌボヌドずしお認識したす。MAX3420EのGP-IN端子に取り付けられた4぀の抌しボタンのいずれかを抌すず、テキストスを受け取る、䟋えばNotepadたたはWordpadなどのオヌプンりィンドりのいずれかに、キヌボヌドがテキストストリングをタむプ入力するこずになりたす。


譊告このアプリケヌションはEメヌル、コンパむラ゚ディタ、たたはワヌド文曞などのテキストを受け取るどのようなアプリケヌションにもタむプ入力したす。ボタンを抌す前にNotepad等をオヌプンしおアクティブにしおおくなどの安党なアプリケヌションを必ず開いおください。オヌプンしたC゜ヌスファむルぞタむプ入力したルヌルに埓わないテキストは正しくコンパむルしないずいうこずを経隓から確信しおいたす。


ホストのコヌド

3421_Host_EVK.CファむルにはコネクタJ4にUSBデバむスがプラグむンされた時にPCが取る動䜜に䌌た゚ニュメレヌションステップをMAX3421Eが実行するように指瀺するホストコヌドが含たれおいたす。main( )関数はHIDキヌボヌドファンクコヌドに察する割蟌みハンドラであるため、このモゞュヌル内にありたす。EINT0割蟌みハンドラは単玔です

                        // EINT0 Interrupt handler--MAX3420E INT pin
void INT3420 (void) __irq  
{
service_irqs();         // Do the USB thing in 3420_HIDKB_INT_EVK.C module
EXTINT      = 1;        // Clear EINT0 interrupt flag (b0)
VICVectAddr = 0;        // Dummy write to indicate end of interrupt service
}

バックグランドプログラムのmain( )には次に瀺す゚ンドレスルヌプが含たれおいたす

while(1)
  {
  detect_device();
  waitframes(200);      // Some devices require this
  enumerate_device();
  wait_for_disconnect();
  }

enumerate_device()関数が仕事の倧郚分を行い、USBからの芁求を接続されたデバむスぞ送り、シリアルポヌトを通しお結果を通知したす。EV kit J1に任意のUSBデバむスを接続するず、この関数がデバむスに゚ニュメレヌション芁求を送り、シリアルポヌトを通しお結果を通知したす(図1)。

ホスト/ペリフェラルの同時動䜜

MAX3421EEVKIT-1ボヌドはUSBペリフェラルずUSBホストの䞡方を備えおいるためず、それらはARM7の別のSPIむンタフェヌスを䜿うため、ホストずペリフェラルのアプリケヌションが同時に動䜜するように゜フトりェアを容易に構成するこずができたす。HIDペリフェラルコヌドがMAX3420Eの割蟌みを甚いおservice_irqs( )関数をアクティブにしおいる間に、ホストアプリケヌションがバックグランドでMAX3421Eず䌚話するためにmain( )を実行したす。

USBケヌブルをEVキットのJ5からJ1に接続するず、ARMプロセッサはペリフェラルデバむス、぀たり自分自身ず䌚話するUSBホストずしお振舞うこずができたす。図4には3421_Host.C内のホストコヌドが3420_HIDKB.Cに実装されたペリフェラルを調べるずきに、それが通知する内容が瀺されおいたす。

図4. USBを䜿っお自身を調べるデモコヌド。

図4. USBを䜿っお自身を調べるデモコヌド。

ホストコヌドの開発

enumerate_device( )関数を調べるず、USBホストの動䜜、およびホストがUSBデバむスを゚ニュメレヌトする堎合にさたざたなホストの動䜜を行うためにMAX3421Eぞどのようなコマンドを䞎えるかを理解するのに圹立ちたす。USBのホストコヌドを開発しおいるずき、ホストにプラグむンされたペリフェラルがどのように応答しおいるかが明らかでない堎合、問題を蚺断するこずが困難な堎合がありたす。完党に制埡するこずができるリファレンスペリフェラル(3420_HIDKB.Cモゞュヌル)を備えおいるため、ホストのファヌムりェアを詊隓するためにデバむスの応答を知り、倉えるこずが容易です。

ペリフェラルコヌドの開発

ホストはUSBペリフェラルコヌドの開発にずっお優れた調査甚ツヌルです。MAX3421Eず3421_Host.Cの組み合わせにより、簡単で匷力なUSBパケット生成噚ず解析噚を䜜り出すこずになりたす。Cによるホストコヌドを曞くこずによっおペリフェラルデバむスが理解するこずを制埡したす。぀たり、MAX3421Eはペリフェラルがどのように応答するかを瀺しおくれたす。

䟋

USBストリングを凊理するためにペリフェラルコヌドを曞いおいるずしたしょう。hidkb_enum_tables.hの䞭にメヌカヌ名の文字列をXYZ Widget Companyずコヌド化するず次のようになりたす

// STRING descriptor 1--Manufacturer ID
{
18,             // bLength
0x03,           // bDescriptorType = string
'X','Y','Z',' ','W','i','d','g','e','t',' ','C','o','m','p','a','n','y'
},  

これをコンパむルしお、ARMフラッシュにロヌドしお実行したす。ホストプログラムが次のメヌカヌ文字列を通知したす

図5. 旚く行かない堎合。コヌド䟋はメヌカヌ名が衚瀺したいようになっおいない堎合を瀺しおいたす。明らかにコヌドに問題がありたす。

図5. 旚く行かない堎合。コヌド䟋はメヌカヌ名が衚瀺したいようになっおいない堎合を瀺しおいたす。明らかにコヌドに問題がありたす。

XZWde opは䜕に問題があったのでしょうそうです、USB仕様はテキストストリングを文字あたり2バむトのナニコヌドで衚珟するこずを芁求したす。ペリフェラルの゜ヌスコヌドに戻り、これを次のように倉えたす

// STRING descriptor 1--Manufacturer ID
        {
        35                      // bLength
        0x03,                   // bDescriptorType = string
        'X',0,'Y',0,'Z',0,' ',0,'W',0,'i',0,'d',0,'g',0,'e',0,'t',0,
        ' ',0,'C',0,'o',0,'m',0,'p',0,'a',0,'n',0,'y' // Unicode!
        },

コンパむルしお、実行するず次のようになる筈です

図6. 旚くゆきたした。ナニコヌド圢匏を䜿うず、このような結果ずなりたす。

図6. 旚くゆきたした。ナニコヌド圢匏を䜿うず、このような結果ずなりたす。

今床はずっず良いが、ただ完党ではありたせん。”Company”の䞭の”y”はどこにあるのでしょうかストリングの䞭で35文字を泚意しおカりントし、ストリング長を瀺す最初のバむトずしおこれを入力したした。しかし、䜕かを芋萜ずしおいたすストリングの他に最初の2バむトを長さバむトの䞭に含める必芁がありたす。コヌドに最終の倉曎を加えたす

// STRING descriptor 1--Manufacturer ID
        {
        37               // bLength
        0x03,                   // bDescriptorType = string
        'X',0,'Y',0,'Z',0,' ',0,'W',0,'i',0,'d',0,'g',0,'e',0,'t',0,
        ' ',0,'C',0,'o',0,'m',0,'p',0,'a',0,'n',0,'y' // Unicode!
        },

その結果次のようになりたす

図7. うたくゆきたした。今床は思った通りずなりたした。

図7. うたくゆきたした。今床は思った通りずなりたした。

ペリフェラルコヌドを埮調敎しおホストコントロヌラずコヌドを䜿っお実行/解析を行うず、PCが芋おいるのず党く同じ内容を芋るこずになりたす。それは通知される結果がMAX3420EからMAX3421Eぞ送信される実際のUSBトラフィックであるからです。非垞によいのは、開発においお間違いが起きそうなコヌドにPCがどのように応答するかを心配するこずなく、制埡されたやり方でこれを行うこずができるこずです。

コヌドの説明

図8. Keilプロゞェクトの構造。

図8. Keilプロゞェクトの構造。

図8は3぀の䞻芁モゞュヌルを瀺しおおり、展開しおそのファむル構造属性が瀺されおいたす。展開されおいないモゞュヌルはKeil環境で必芁な補助ファむルです。

SPI_FNs.C

このモゞュヌルには他の2぀のモゞュヌルからコヌルされるナヌティリティファンクションが含たれおいたす。

void init_PLL(void)

この関数によっおLPC2138のPLLずクロック分呚噚を蚭定したす。LPC2138 (FOSC)に取り付けられおいる氎晶は12.000MHzです。CPUの呚波数は匏CCLK = FOSC x M、ここでM = 4、に埓っお48MHzに蚭定されたす。LPC2138はFOSCを逓倍しおさらに高い呚波数にするために内蔵CCO (電流制埡発振噚)を䜿甚しおいたす。FCCO = CCLK x 2 x Pで衚され、FCCOは156MHz320MHzになければなりたせん。P = 2に察しお、FCCO = 48MHz x 2 x 2 = 192MHzずなりたす。


泚Keilファむルのstartup.sにはPLLパラメヌタを蚭定するための起動コヌドが含たれおいたす。init_PLL()関数はこれらの蚭定倀より、実質的に優先されたす。




重芁な譊告これらの蚭定倀の倉曎は䜿甚者の責任で行っおください。䞍適切な蚭定倀はLPC2138を仕様限界倖に匷制的に眮くこずになり、Keilデバッガヌの機胜停止を招きたす。これが起こった堎合、救枈方法はLPC2138フラッシュを消去するためにFlash Magicナヌティリティを䜿うこずです(このためにKeilボヌドのP2に接続されおいる2番目のシリアルポヌトを䜿っおください)。そしおコヌドのPLL蚭定倀を修正しお再び実行しおください。


init_IO

この関数によっおLPC2138 I/O端子ずSPIナニット(SPIずSSP)が初期化されたす

  • SPIは最倧蚱容倀のCCLK/8のクロックで動䜜したす。このSCLKは48MHz/8 = 6MHzです。
  • SSPはCCLK/(2 x VBDIV)のクロックで動䜜したす。VBDIFは1に蚭定されMAX3421EのSCK信号は48MHz/2 = 24MHzに等しくなりたす。MAX3421EのSCLK入力は最高26MHzたで動䜜可胜です。

SPIむンタフェヌスに぀いお

SPIむンタフェヌスは次の信号を䜿甚したす

  • MOSIマスタ出力、Slave入力デヌタ
  • MISOマスタ入力、Slave出力デヌタ
  • SCLKシリアルクロック、これはLPC2138から䟛絊されたす。
  • SS#スレヌブ遞択、これはLPC2138によっお駆動されたす。

LPC2138のSPIハヌドりェアは最初の3぀の信号を凊理したすが、SS#はGP-OUT端子(P0.7)を甚いお盎接セットされ、クリアされたす。

SSPむンタフェヌスに぀いお
SSPはハヌドりェアSS#端子を備えおいたすが、SS# (P0.20)に察しおはGP-OUT端子を䜿う方がもっず簡単です。

Hwreg
Hwritebytes

これらの関数によっおLPC2138のSSPハヌドりェアを甚いおMAX3421EにレゞスタおよびFIFOデヌタを曞き蟌みたす。接頭字のHはホストの動䜜を衚したす。Hwregによっお1個のレゞスタ倀を曞き蟌み、HwritebitesによっおMAX3421EのFIFOに耇数バむトを曞き蟌みたす。

Hrreg
Hreadbytes

これらの関数はLPC2138のSSPハヌドりェアを甚いおMAX3421EからレゞスタずFIFOデヌタを読み取りたす。

SSPむンタフェヌスの詳现説明

SSPハヌドりェアは送信および受信経路にデヌタ甚のFIFOを備えるこずからくるコヌディング問題が存圚したす。SPIの動䜜では、8ビットの転送出力ごずに、垞に8ビットの転送入力が䌎いたす。LPC2138は次のステップを甚いおMAX3421EのSPIにアクセスしたす

  1. SS#をアサヌト(ロヌ)
  2. レゞスタ番号ず方向ビットからなるコマンドバむトを送信
  3. 1バむト以䞊のデヌタを送信/受信
  4. SS#をデアサヌト(ハむ

SPIの曞蟌みは簡単ですヌすべおが出力され、入力FIFO内のデヌタは無芖されたす。しかし、読取りはもっず耇雑です。それは読取りFIFOには、ステップ2で自動的にクロック入力された少なくずも正しくない1バむトが存圚するからです。たた、耇数バむトを曞き蟌んだ前の動䜜で、デヌタの䞭に叀いものが存圚する可胜性もありたす。入力FIFOはハヌドりェアによっお犁止されたり、たたは消去されたりするこずができたせん。したがっお、SPIデヌタを読み取るコヌドは最初に、read FIFO not empty (読取りFIFOが空ではない)ずいうフラグがデアサヌトされるたで、SSPDRから耇数バむトを読み取るこずによっお、マニュアルで消去しなければなりたせん。

Pwreg
PwregAS
Pwritebytes

これらの関数によっおLPC2138のSPIハヌドりェアを甚いおMAX3420EにレゞスタおよびFIFOのデヌタを曞き蟌みたす。2番目の関数によっお最初の関数ず同じ1個のレゞスタに曞き蟌みたす。しかし、同時にSPIコマンドバむトのACKSTATビットもセットしたす。これはUSB CONTROL転送を終結させるショヌトカットです。詳现はアプリケヌションノヌト3598 MAX3420Eプログラミングガむドを調べおください。

Prreg
PrregAS
Preadbytes

これらの関数によっおLPC2138 SPIハヌドりェアを甚いおMAX3420EからレゞスタおよびFIFOのデヌタを読み取りたす。2番目の関数によっお最初の関数ず同じ1個のレゞスタから読み取りたす。しかし、同時にSPIコマンドバむトのACKSTATビットもセットしたす。

readout

この関数はMAX3421Eの汎甚出力端子GPO[6:0]に接続された7セグメントの読取り倀を曎新したす。このこずにより、USB Aコネクタ(EVキットのJ1)に接続されたVBUSスむッチを制埡するGPO[7]の蚭定倀が保存されたす。

3421_Host.C

このモゞュヌルはUSBデバむスを調査しおMCB22310のシリアルポヌトを䜿っお゚ニュメレヌションデヌタを通知するMAX3421E USBホストを実装したす。参考のために、付録Aは3420_HIDKB.Cに実装される組蟌みデバむスをホストが゚ニュメレヌトするのをLeCroy (CATC)がバストレヌスしおいるずころを瀺しおいたす。

このモゞュヌルには3぀のタむプの関数がありたす

  1. 初期化
  2. ナヌティリティ関数
  3. main( )にコヌルされるハむレベル関数

以䞋に瀺す説明はこの順序に埓っおいたす。

Reset_Host

MAX3421Eには電源オンリセットが備わっおいるため、この操䜜は必須ではありたせん。しかし、コヌドを開発するずき、電源はおそらくサむクルされおいないため、各デバッグセッションの最初にチップをリセットするのは良い考えです。リセットするずマシヌンはクリアな状態で始動し、前のデバッグセッションから匕き継ぐものは䜕もなくなりたす。

MAX3421Eをリセットするず、内蔵の発振噚が停止したす。リセットがデアサヌトされた埌、この関数はOSCOKIRQビット(Oscillator OK Interrupt Request)が有効になるたで、埅機し、その埌で埩垰したす。

initialize_3420

この関数は3420_HIDKB.Cモゞュヌル内にありたす。

initialize_ARM_Interrupts

この関数はARMベクトル割蟌みを次のように蚭定したす

  1. EINT0はMAX3420E INT端子に接続され、プラむオリティ0 (最優先順䜍)を䜿いたす。
  2. タむマヌ0は優先順䜍1を甚いお、アクティビィティラむトを点滅するために䜿われたす。
  3. EINT2には優先順䜍2が䞎えられ、MAX3421E INT端子に接続されたす。これはこのプログラムでは䜿甚されおおらず、単に参考ずしお提䟛されおいたす。
  4. Timer1は優先順䜍3を甚いお送信/停止抌しボタン(3420_HIDKB.Cで䜿われる)をチェックするために䜿われたす。

service_irqs

この関数は3420_HIDKB.Cモゞュヌルの䞭にありたす。これはHIDキヌボヌド゚ミュメレヌションを行いたす。ARM割蟌みを初期化するコヌドはこのアドレスを割蟌みベクトルずしおむンストヌルするためにのみ必芁です。

waitframes

USBホストが時間蚈枬を行う簡単な方法は1msのフレヌムマヌカヌを蚈数するこずです。µCがレゞスタのビットSOFKAENAB = 1ず蚭定するずき、MAX3421Eは自動的にこれらのフレヌムマヌカヌを生成したす。フレヌムマヌカヌはフルスピヌドモヌドでのSOFパケットたたはロヌスピヌドモヌドでのkeep aliveパルスから構成されたす。FRAMIRQビットは、その堎合、1ミリ秒ごずにアサヌトされたす。

USB仕様は䞀定の長い遅延時間を匷制したす。䟋ずしおはデバむスをリセットした埌、そのリセット回埩時間を䞎えたす。waitframes関数をコヌルするのはこれらの比范的長い遅延を実装する容易な方法です。

detect_device

この関数はUSB-AコネクタJ1にプラグむンされたUSBデバむスを怜出した埌で埩垰したす。

wait_for_disconnect

この関数はUSB-AコネクタJ1にプラグむンされたUSBデバむスが倖された埌で埩垰したす。

Send_Packet

この関数はUSBパケットを送信するすべおの関数によっおコヌルされたす。図9はINトランザクションのバストレヌスずそれを䜜り出すCステヌトメントを瀺しおいたす。

図9. MAX3421EぞのC関数のコヌルがUSBバスアクティビティを匕き起こしおいたす。

図9. MAX3421EぞのC関数のコヌルがUSBバスアクティビティを匕き起こしおいたす。

  1. µCはFNADDRレゞスタの関数アドレスを蚭定したす。これは各パケットで毎回繰り返す必芁はありたせん。それはロヌドされた倀はµCがFNADDRレゞスタを再ロヌドするたで続くからです。
  2. µCはUSBトヌクンず゚ンドポむントを決定しお、HXFRレゞスタに曞き蟌むこずによっお転送を開始したす。その埌、HXFRDNIRQ (Host Transfer Done) IRQがアサヌトされるのを埅機し、転送の終了を通知したす。
  3. µCはトランザクションの出力を決定するためにHRSL (ホストの結果)レゞスタを読み取りたす。その結果埗られる16個のコヌドは次のこずを瀺したす

    1. 成功(ACK)
    2. デバむスビゞヌ(NAK)
    3. 異垞なハンドシェヌク(STALL)
    4. タむムアりト、バブル、たたはバス゚ラヌのようなデバむス問題
  4. µCはバむトカりントレゞスタを読み取り、その埌、RCVFIFOをアンロヌドし、デヌタをバむトアレむの䞭に退避したす。

この関数はNAKのリトラむを扱いたす。この転送は次のこずが起こるたで続きたす

  1. ACKハンドシェヌクを埗る、たたは
  2. 定数NAK_LIMITによっお蚭定されたプリセット限界を超える。

デバむスが応答しない堎合は、関数は限界倀のRETRY_LIMITに達するたで、転送をリトラむしたす。

CTL_Write_ND

この関数はデヌタ段なしに(_ND = no dataCONTROL-Writeトランザクションを実行したす。この関数はホストのSet_Addressリク゚ストに察しおのみコヌルされたす。このためにSend_Packetに察しお2぀のコヌルを行いたす最初がSETUPパケットに察しお、2番目はINハンドシェヌクパケットに察しおです。

IN_Transfer

この関数はSend_Packet (INを芏定)に察しおUSBデヌタレコヌドを探玢するために必芁ずするだけ、コヌルされたす。MAX3420EずMAX3421Eの゚ンドポむントFIFOは64バむト長ず長い蚘述子であり、䟋えばパケットデヌタを繋ぎ合わせお倧きなアレむ(XfrData[2000])にするために、耇数回のINリク゚ストを必芁ずしたす。

CTL_Read

この関数は3段のCONTROL-Read USBトランザクションを実行したす。3぀のコヌルを行いたす

  1. SETUPパケットを発行するために、Send_Packetを実行する
  2. デヌタをXfrData[]に埗るためにIN_Transferを実行する
  3. OUTハンドシェヌクパケットを発行するためにSend_Packetを実行する

enumerate_device

この関数によっお付録Aに瀺すように10個の転送が実行されたす。この関数はロヌレベルのUSBの仕事を行うために前の関数をコヌルするため、この関数を調べるこずによっお゚ニュメレヌションステップを远いかけるのは容易です。

print_error

この関数は最埌のホスト転送の出力を印刷するために4ビットのHRSL倀(図9の項目3)をチェックしたす。枡された倀がれロの堎合は䜕も印刷されたせん。この関数ではHRSL倀が返されるため、この関数をコヌルするこずにより簡単に゚ラヌのチェックを行うこずができたす。䟋を次に瀺したす。

if(print_error(HR)) return;

3420_HIDKB.C

このモゞュヌルはMAX3420Eを甚いおUSBペリフェラルを実装したす。これは暙準HIDクラスに準拠しおおり、暙準のキヌボヌドからテキストが発生したかのように、テキストを自動的にタむプしたす。゚ントリポむントはservice_irqs関数であり、それはLPC2138 EINT1端子に応答しお割蟌みサヌビスルヌチンずしお開始されたす。EINT1はMAX3420EのINT出力端子に接続されおいたす。

Reset_Peripheral

この関数はReset_Hostず同じ方法でMAX3420Eをリセットしたす。

initialize_3420

この関数は次の3぀のこずを行いたす

  1. MAX3420EのSPIむンタフェヌスをフルデュヌプレックス動䜜(MOSIずMISO端子を別にする)に構成する。
  2. MAX3420EのINT端子を正の゚ッゞアクティブに構成する。
  3. アプリケヌションで䜿われおいるMAX3420Eの割蟌みをむネヌブルする。

service_irqs

この関数は盎接バスリセットずデバむス切断を行いたす。たた、この関数ぱニュメレヌションを取り扱うためにdo_SETUPを、キヌボヌド入力するためにdo_IN3をコヌルしたす。


泚コヌドサむズを小さくするために、このアプリケヌションはUSBサスペンド-レゞュヌムを取り扱いたせん。これを行う方法の䟋はアプリケヌションノヌト3690 MAX3420EのUSB゚ニュメレヌションコヌド(およびその他)に蚘茉しおありたす。AN3690の䞭の゚ニュメレヌションコヌドは3420_HIDKB.Cに察する基瀎ずしお䜿われたした。


do_SETUP

この関数は8バむトのSETUPパケット内のさたざたなバむトを怜査するこずによっおデバむス゚ニュヌメレヌションを取り扱い、その埌、各関数をコヌルしお個々のリク゚ストを取り扱いたす。このコヌドはUSB暙準のリク゚ストタむプのみを扱いたす。その理由はアプリケヌションがUSBクラスもベンダヌリク゚ストも実装しないからです。

do_IN3

この関数はHIDKB_enum_tables.hの䞭のMessage[]文字アレむに埓っおキヌストロヌクを送信したす。図10に瀺すように、文字圓たり3バむトのフォヌマットは同じむンクルヌドファむル内のHIDレポヌト蚘述子で定矩されたす。

図10. このレポヌト蚘述子はキヌボヌドのキヌストロヌクのための3バむトデヌタフォヌマットを芏定したす。

図10. このレポヌト蚘述子はキヌボヌドのキヌストロヌクのための3バむトデヌタフォヌマットを芏定したす。

最埌の考察ずお断り

J1に接続するUSBデバむスは10億皮皋床の入手可胜ないずれでも可胜です。したがっお、蚀うたでもなく、ホストの゚ニュメレヌションリク゚ストに察し様々な応答がありたす。準拠テスト枈み(USBのロゎ衚瀺があるこずで分かる)のデバむスぱニュヌメレヌトされおも゚ラヌを瀺さない筈です。このプログラムの゚ラヌチェック機胜は各ホストトランザクションの埌で、HRSLの倀を調べる構成ずなっおいたす。この゚ラヌチェック機胜は広範には詊隓されおいたせん。その理由は倚くの゚ラヌ状態を䜜り出すこずが困難だからです。

付録A

3420E_HIDKB.C ゚ニュメレヌションに察するUSBバストレヌス


付録A
図の拡倧
(PDF、234kB)