要約
このアプリケーションノートは、MAX3420Eを適正に動作させるために正しく実行しなければならない各項目のチェックリストです。順序だった検証プロセスやデバッグ時のポイントを記載しています。
はじめに
MAX3420Eをお気に入りのマイクロコントローラに接続して基板を設計しました。これを起動してUSBに接続しましたが、何も起こりません。さてどうすればよいのでしょうか。引き続き、以下をお読みください。
USB周辺機器を初めて起動させることは1つの難関でもあります。以下は、MAX3420Eが正常に動作するために必要な各項目のチェックリストです。これらが正しい状態になっていなければなりません。
USB「B」コネクタピンの確認
意外にもこのコネクタピンの確認が間違って行われがちです。使用したコネクタの部品図は上面図だったのでしょうか、それとも底面図だったのでしょうか。ピン1はどこにありますか。機械技術者でもなければ、このような部品図には困惑することでしょう。図1および図2を参考にしてください。
図1. USB Bコネクタの内側
図2. PCBの底面から見たBコネクタピンの配置
図3. USBケーブルワイヤのコネクタ
抵抗計を用いてMAX3420EとUSBコネクタ間の配線をチェックすることをお勧めします。D+とD-は逆になりやすいので特に注意してください。また、MAX3420EとD+およびD-ピン間には33Ωの抵抗器があることに留意してください。一般的な導通チェッカはこのような低い抵抗があっても「ビープ音」を発します。USBケーブルをプローブで調べる必要のある場合は、図3を参考にしてください。
USBの「健全性」チェック
この項では、デバイスをUSBに接続したときに生じる状況について説明します。健全性チェックによって、D+ワイヤとD-ワイヤの状態がわかります。この方法は、USBバスアナライザを利用することができないときに有用です。
プロセッサをリセットし、PCのUSBポートにケーブルを接続します。コードをステップ実行して初期化が終り、CONNECTビットをセットするステートメントの直前で停止します。このビットをセットするステートメントは、次のようになります。
wreg(rUSBCTL,bmCONNECT); // Connect to USBこのステートメントを実行する前は、D+とD-の両方がローになっているはずです。これはケーブルのホスト側の回路がこれらの信号を15kΩの抵抗器でグランドにプルダウンしているからです。さて、CONNECTステートメントを実行すると、D+とVCC(3.3V)間に1.5kΩの内部抵抗器を接続するようMAX3420Eに命令が出されます。これによって、D+はハイ状態になり、その後に少量のバースト状のパルスが続きます(図4)。
図4. CONNECT = 1をセットするとD+がハイ状態になり、少量のバースト状のパルス波形が現れます。
上側の波形がD+で、下側の波形がD-です。バーストは約18秒間続いた後、消滅します。D+はハイを、D-はローの状態を維持し、以下に示すWindows XPの短いメッセージがポップアップ表示されます(図5)。
図5. Windows XPの警報メッセージ
何が起こっているのでしょうか。
ここで、コードをシングルステップで実行していることを思い出してください。これまでに行ったことは、D+のプルアップ抵抗器を接続しただけです。このプルアップが、新しいUSBデバイスが接続されたことをPCに通知し、PCは接続されたデバイスを識別するためにデバイスへの信号送信を開始します。この信号が図4のブリップです。マイクロコントローラのコードは実行されていないため、MAX3420Eに対して応答を返すように指示が出されることはありません。PCは応答がないことを認識し、最終的に(18秒後)このデバイスを無視することを決定します。D+がハイでD-がローのバス状態は「USBバスサスペンド」または単に「サスペンド」と呼ばれています。ホストはあらゆる信号の送信を停止し、MAX3420EのD+プルアップ抵抗器によって、D+信号はハイに維持されます。
図6. バス上で生じている状況(NAKは表示されていません)
図6は、LeCroy Instruments社のUSBバスアナライザで取得したバスのトレースです(LeCroyは同アナライザの製造元であるCATCを買収)。PCは、プラグインイベント(CONNECT = 1)を検知すると、USBバスリセットコマンドを発行します(図には示されていません)。次にTransfer 0で、タイプ「DEVICE」の「GET_DESCRIPTOR」と呼ばれる要求を送出します。5.687秒後、PCは2度目のUSBバスリセットコマンドを発行し、再度5.578秒間デバイス記述子の取得を試みます。PCは3度目のバスリセットを実行し、さらに5.580秒間、記述子の取得を試みた後、断念してバスをサスペンド状態にします。ファームウェアは動作していないため、PCの要求はリッスンされておらず、肯定応答(ACK)は返されません。
図7. パケットとNAKハンドシェークを示すために、図6の第1回目の転送を展開した図
理解しやすいよう、図6のトレースには、MAX3420Eによって返されたNAK(否定応答)ハンドシェークは含まれていません。図7は、さらに詳細を示すために最初の転送をパケットレベルに展開しています。これによると、Transfer0は3つのパケットで開始されていることがわかります。
- ホストが、接続されたデバイス宛に(この状況では、USBはアドレス0を送信)SETUPパケット(63)を送信する。
- ホストが、8バイトの「op-code(オペコード)」を含んだDATAパケット(64)を送信する。
- 周辺機器(MAX3420E)がACKパケット(65)を返し、ホストから送信された2つのパケットをエラーなしに受信したことを通知する。
次に、ホストはIN要求の送信をTransaction 1から開始します。各IN要求に対し、MAX3420EからNAK(否定応答)ハンドシェークが返されます。これはプログラムが実行されていないためであり、したがって、MAX3420Eに接続されたマイクロコントローラがSUDAV IRQ (Setup Data Available Interrupt Request:セットアップデータの利用可能な割込み要求)を受け取ることはありません。
注:MAX3420Eは、SUDAV IRQをアサートすることによってSETUPパケットが到着したことをマイクロコントローラに通知します。これによって、マイクロコントローラは、パケットデータをデコードしなければならないこと、また要求データを返送して応答しなければならないことを認識します。
このようなIN-NAKのやりとりが5.687秒間続き、この間にPCはバスをリセットして第2回目の試行を開始します。図4に見られる少量のブリップはこのIN-NAKのやりとりです。スコープを詳細に観察すると約5秒後にパターンがわずかに変化していることがわかります。これがバスリセット(約30ミリ秒間、D+とD-の両方がロー状態)で、新たなSETUPパケットがこの後に続きます。その後、IN-NAKのやりとりがさらに5秒間続きます。
参考:別のアナライザ
図8. Beagle
図6や図7を生成することができるUSBバスアナライザを購入することが、予算上難しい場合もあります。このアプリケーションノートは、ユーザがスコープと抵抗計のみ所有していることを想定していますが、USBの開発作業にはUSBバスアナライザを入手することを強くお勧めします。ここで使用したLeCroy/CATCはインタフェースが見た目に美しく、多くのソフトウェアを備え、さらに最も重要なこととして、業界標準のUSB測定機器としての評判もあります。これまでに多くの課題(ハードウェア、ソフトウェア、チップなど)が、CATCトレースを交換し正確な状況を明確にすることで解決してきました。バスは嘘をつきません。
ありがたいことに、低価格のUSBアナライザも販売されています。図8は、Beagle-USBの画面ショットです。BeagleアナライザはLeCroy/CATCの何分の一の価格で、バストラフィックを表示することができます。図8のIndex 10を図6のPacket 64と比較すると、これらがSETUPパケットのデータをまったく同様に表示していることがわかります。
経過の確認
図4の信号を確認することができた場合、USBコネクタが正しく配線され、MAX3420Eに正常に電力が供給されていることが検証されたことになります。ここまでの結果が得られていない場合は、以下の項目を実行してみてください。
- MAX3420E RES#ピンをプローブで調べ、ハイ(HIGH)であることを確認してください。
- 水晶発振器をプローブで調べ、12MHzで発振していることを確認してください。USB仕様を満たすには、12MHz ±0.25%で発振する必要があります。この許容範囲を超えている場合は、並列共振の水晶発振器用に規定されている、正しい値の負荷コンデンサを用いていることを確認してください(18pFが標準値です)。
- VCCが3.3Vになっていることを確認してください。
- VLがシステムのインタフェース電圧になっていることを確認してください。ただし、この電圧は3.6Vを超えないようにしてください。
- 3.3VのレギュレータによってVBUSからMAX3420EのVCCピンに電力を供給している場合は、USBに接続されていることを確認してください。接続されていなければ、MAX3420EのVCCには電力が供給されません。
注:デバッグは、バスパワー設計よりも自己給電設計の方が簡単です。USBケーブルが接続されているかどうかに関係なくファームウェアが実行されるからです。外部電源を用いてプロトタイプに電力を供給することをお勧めします。後で必要に応じてバスパワーに変換することが可能です。
次のステップでは、コントローラが、SPIバスを経由してMAX3420Eレジスタセットと正常にやりとりしていることを確認します。
rreg()とwreg()の確認
マキシムのサンプルコードを使用する場合も、あるいは最初から独自に作成する場合も、記述するコードはすべて、MAX3420Eのレジスタの読出しと書込みのための関数を必要とします。以下のサンプルは、これらの関数プロトタイプを使用しています。
unsigned char rreg(BYTE r); // Read a MAX3420E register byte void wreg(BYTE r,BYTE v); // Write a MAX3420E register byteUSB転送を処理するコードに取りかかる前に、これらの関数をテストする簡単なルーチンを記述します。図9をサンプルとして参考にしてください。
図9. 「rd」をシングルステップで8回実行して検査し、MAX3420EへのSPIインタフェースを検証します。
図9のテストコードはMAX3420Eをリセットし、次に1が1つずつシフトするパターン8バイトをUSBIENレジスタに書き込みます。各バイトに1ビットがセットされ、00000001から始まって、次は00000010、最後が10000000となります。この関数をシングルステップで実行して「rd」の値を8回調べ、値が0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80であることを確認します。rdがこれらの値であれば、SPIインタフェースを通じてレジスタが書込みと読出しの両方の動作を正しく行っていることが確認されたことになります。USBIENレジスタに書き込むことが可能で、さらにその内容を確実に読み戻すことができれば、どのMAX3420Eレジスタに対しても書込みと読出しを実行することができます。
図10. MAXQ2000マイクロコントローラにRowley CrossStudioを使用し、シングルステップを実行して変数の値を検査します。カーソルを「rd」上に置くとその値がポップアップ表示されます。
図10は、MAXQ2000マイクロコントローラにCrossStudioを使用してデバッグしたときの画面ショットです。変数「rd」上にカーソルを置くとポップアップウィンドウが開きます(この画面ショットではカーソルを表示していません)。コードをシングルステップで実行している間は、すべての変数をこの方法で調べることができます。
テストコードは、マイクロプロセッサのSPIポートをセットアップすることから始まります。SPI_Init()関数は、各マイクロプロセッサのタイプとIOピンの固有の配置に応じて異なります。次にコードは、PINCTLレジスタに値0x10を書き込むことで、MAX3420E SPIインタフェースをフルデュープレクス動作に設定します。これによってFDUPSPIビットがセットされます。さらにコードは、CHIPRESビットをアサートし、その後デアサートすることによってMAX3420Eを初期の状態にします。コードの始めにチップリセットをインクルードし、各デバッグサイクルの最初にMAX3420Eを初期の状態にすることをお勧めします。
図10のコードで正しい結果が得られない場合は、SPI信号を検査してこれらの動作を検証する必要があります。
図11. 最初のwreg()呼出しを実行します。
テストプログラム、test_SPI()の最初のwreg()呼出しによって、MAX3420Eのレジスタ17に値0x10が書き込まれます。SPIバストレースは図11のようになります。
注:図11に示されたトレースはSPIモード(0,0)を使用しています。このモードでは、SPIデータはSCLKの立上りエッジでサンプリングされ、SCLKの休止レベルはローです。トレースのパルス幅はSPIインタフェースによって異なる場合がありますが、SCLKの立上りエッジで示される値は同じになります。
各SPIアクセスの第1バイトはコマンドバイトで、図12のフォーマットにしたがいます。図11のSCLKの最初の立上りエッジにおけるMOSIトレースを調べると、ビットパターンは10001010で、レジスタ17(ビット7~3が10001、つまり値は17)を示していることがわかります。また、ビット1がハイであるため書込み動作であることがわかります。2つ目のバイトのビットパターンは00010000です。これがレジスタ17に書き込まれるデータで、0x10です(ビット4、つまりFDUPSPIレジスタビットだけがセットされる)。したがって、このSPIアクセスによってレジスタ17に0x10が書き込まれ、FDUPSPIビットがセットされることになります。
図12. MAX3420Eコマンドバイトのフォーマット
これらのトレースをキャプチャする簡単な方法は、スコープまたはロジックアナライザをSS#の立下りエッジでトリガし、次にwreg()呼出しをシングルステップで実行するように設定することです。
図13. USBIENレジスタへの最初の書込み(test_SPI()関数)
test_SPI()の次のステートメントでrreg()関数をチェックします。ループの初回実行時に、図13に示すように、値0x01がUSBIENレジスタに書き込まれます。
図14. rreg()関数の最初の呼出し
次にtest_SPI()関数は、USBIENレジスタから値を読み戻します。1回目のループを通過した時点では、この値は1になります(図14)。ループを通過するごとに、書込みと読戻しのビットは、1つのSCLKエッジ分だけ左に移動します。
MAX3420Eのレジスタの書込みと読出しの検証が終われば、コードのデバッグをさらに先に進めることができます。これまで行ってきた確認ステップはすべて「健全性チェック」のカテゴリに含まれます。ここからは、実際にUSBトラフィックを取り扱う第1のステップに進みます。ここでは、プロセッサのアテンションが必要であることを通知するさまざまなMAX3420Eの割込み要求ビットに対応します。
IRQビットの初期設定
USBバストラフィックが開始されてから初めてMAX3420Eの割込みビットをアサートすることが論理的であると思われますが、実際にはMAX3420Eの電源を投入するときにアサートされるIRQビットもあります。また、USBケーブルを接続したときや、CONNECT = 1をセットしたときにアサートされるものもあります。以下の項では、このスタートアップシーケンス時に想定される状況についての概要を説明します。
RESETの解除
MAX3420Eのリセットを解除すると、USBにまだ接続されていなくとも、特定の割込み要求ビットがアサートされます。アサートされるビットは、以下のとおりです。
EPIRQレジスタ
- IN3BAVIRQ
- IN2BAVIRQ
- IN0BAVIRQ
USBIRQレジスタ
- OSCOKIRQ
注:MAX3420EのIRQレジスタビットは、対応するイネーブルビット(EPIENおよびUSBIENレジスタ内にある)がセットされているかどうかにかかわらずアクティブです。イネーブルビットは、INTピンを駆動するロジック回路に要求ビットが渡されるかどうかを決定します。詳細については、アプリケーションノート3661『MAX3420Eの割込みシステム』を参照してください。
USBにプラグインした後
USBに接続すると(CONNECT = 0)、USBトラフィックがない場合でも、さらにいくつかのUSBIRQビットがアサートされます。EPIRQビットは前項の場合と同じですが、USBIRQビットについては、以下に示すように他にもアサートされます。
USBIRQレジスタ
- OSCOKIRQ
- VBUSIRQ(場合による)
注:USBコネクタのVBUSピンをMAX3420EのVBCOMP入力ピンに接続することはオプションです。VBCOMPピンはMAX3420Eの内部に電力を供給しているわけではなく、単に内部のVBUSコンパレータに配線されているだけです。
CONNECT = 1をセットした後
USBに接続すると、ホストはバスリセットを発行し、Get_Descriptor-Device要求を生成し、最終的にバスをサスペンド状態にします。これらの動作は、USBIRQレジスタ内の別のIRQビットをセットします。USBバスをリセットするとVBUSIRQビットがクリアされることに留意してください。
EPIRQレジスタ
- IN3BAVIRQ
- IN2BAVIRQ
- IN0BAVIRQ
- SUDAVIRQ(トラフィックの開始後)
- OSCOKIRQ
- URESIRQ
- URESDNIRQ
- SUSPIRQ(最終的)
これより後で生じる状況については、コードに依存します。前述したとおりにすべてが観察された場合、システムが正常な状態にあることを確信した上で、次のコードのチェック作業に進むことができます。
デバック方法:3ステップで割込みを起動する
残りのチェック作業では、PCが命令する、またその結果としてMAX3420Eが通知する、さまざまなUSB要求にファームウェアが正しく応答していることを確認します。コードを開始し、USBに接続しても何も起こらない場合(おそらくWindowsのUSBエラーメッセージが表示される)、プログラムが割込みを処理していない可能性があります。以下のデバッグ方法を参考にして、割込み処理に関する問題を解決してください。
ステップ1:IRQビットのポーリング
最初にIRQビットをじかにポーリングし、対象のIRQがアサートされたときにプロセッサが動作するようにコードを記述します。メインプログラムのループがじかにポーリングを行う場合でも、割込みをイネーブルにする(各IENビット = 1およびIE = 1)ことは有益です。これによって、MAX3420E INTピンの動きを観察することが可能で、その動作を把握するのに役立つからです。このステップを実行することで、実質的にマイクロコントローラの割込みシステム(およびコード)のチェック作業が不要となり、USBを正しく機能させることに集中して取り組むことができます。EPIRQおよびUSBIRQレジスタを継続的に読み出すときに浪費されるSPIサイクルについて懸念することはありません。ここでの目的は正しくUSBを動作させることです。
ステップ2:INTピンのポーリング
USBが正しく動作していることを確認したら、第2のステップとしてMAX3420EのINTピンをポーリングし、保留状態の割込みの有無をチェックするようプログラムを修正します。ステップ1でコードを検証した場合、現在のコード位置はメインループであり、ここで、EPIRQレジスタとUSBIRQレジスタを絶えず読み出して保留状態の割込みをチェックしています。MAX3420EのINTピンに接続されているマイクロコントローラの割込みピンをポーリングするステートメントを挿入することによって、この継続的に実行されるチェックを変更することができます。MAX3420EのINTピンがアサートされなければ、EPIRQとUSBIRQレジスタを読み出すステートメントはスキップすることが可能です。このチェックの簡素化によって、IRQビットはアサートされたときにのみテストされるようになり、マイクロコントローラとMAX3420E間のSPIトラフィックが大幅に減少します。
ステップ3:マイクロコントローラの割込みコードのチェック
第3の、最後のステップとして、MAX3420Eをマイクロプロセッサの割込みシステムに組み込みます。通常、MAX3420Eハンドラにプログラムの実行を自動的に指示する割込みベクトルを記述する必要があります。