【USBN9603/9604とは】
USBN9603/9604は、National Semiconductor社が開発した、USBデバイス用の
コントローラICです。
このICには、下記のような機能が内蔵されていて、USBのハードウェアレベルでの
通信はすべて処理してくれます。
1.USBトランシーバとイベント検出
2.SIE(Serial Interface Engine)
・物理レイヤーとMedia Access Controller(MAC)を含む
3.エンドポイント用FIFO
4.上位マイコンインターフェース
パラレルインターフェース、DMAコントローラ、マイクロワイアを含む
【USBN9603/9604の特徴】
・フルスピードに対応(12Mbps)
・USB仕様 Ver1.0、Ver1.1に対応
・7個のFIFOを内蔵しエンドポイントに対応
8バイト 双方向 : 1個 コントロール転送用エンドポイント
64バイト 送信専用 : 3個
64バイト 受信専用 : 3個
・多様なマイコンインターフェース
分離パラレルバスインターフェース (アドレスとデータ独立バス)
マルチプレックスパラレルインターフェース (アドレスとデータ共用バス)
DMAインターフェース
MicroWire(SPI)シリアルインターフェース
・多くの状態を内部レジスタで保持し、このレジスタのRead/Writeで制御
を行います。
【USBN9603の構成】
USBデバイスコントローラであるUSBN9603の内部構成は下図のようになって
います。
(ナショナルセミコンダクタ社データシートより)
(1) Transceiver
このトランシーバには、データを送受信するための差動ドライバと受信部、
それと、各ラインの電圧レベルを監視するレシーバが含まれています。
(2) Vreg
USBバスのドライブに必要な、3.3Vという電圧を供給するための電圧
レギュレータです。
(3) SIE(Serial Interface Engine)
USB通信のシリアル通信制御を行う部分で、プロトコルの一部も分担して
いて、ACK、NAKの自動応答や、データの自動送信、受信も実行します。
これらの制御。状態はすべて内部レジスタをRead/Writeすることで実行し
ます。
(4) Endpoint Pipe Controller(EPC)
エンドポイントとなるFIFOとそのコントローラで、実際に通信を行うデータ
の送受信バッファとなります。図のように全部で6個+1個のFIFOから構成
されていて、EP1からEP6のバッファはいずれも64バイトの大きさがあります。
これらのFIFO内のデータの受け渡しは、すべて内部レジスタ経由で行います。
(5) Microcontroller Interface
上位のマイコンとのインターフェース部で、DMA機能を含むパラレル接続と
MicroWire/Plusというシリアル接続とがサポートされています。
実際の制御はすべてこのコントローラ内部のレジスタへのアクセスで実行し
ます。
(6) Clock Generator
USBN9602から改善されてPLL機能が内蔵され、24MHzの外部クリスタル
発振から内部で2倍の48MHzのクロックを生成しています。
【USBN9603/9604の状態遷移】
USBコントローラは、下図のような状態遷移をします。この遷移は、ホストとの
接続により引き起こされるイベントにより起こるものと、コントローラ自身が
USBバスの状態の変化を検出して起こるもの、さらには、USBコントローラに
接続されたマイコンのプログラムによって起こされるものとがあります。
1.NodeOperation
通常の動作状態で、Configurationができる状態
2.NodeSuspend
USBバスが3msec以上信号が無い状態が続いたとき、このSuspend状態にし
ALTEVレジスタのSD3ビットをONにして割込みを発生します。
本Suspend状態は、ホストからのResumeコマンドを受信したときか、USBバス
が活性化されてWakeUpしたときに解除されNodeResume状態に移行します。
3.NodeResume
Suspend状態でUSBバスが活性化したことを検知したら、最小5msec間IDLE
状態にしたあと、1msecから5msecの間、USBバスをK状態にする。
ホスト側は、これに続いてさらに20msec以上K状態継続させた後、EOPを出力
する。デバイスがEOPを受信できたら、通常動作状態に移行する。
100msec以内にこのEOPが受信できないときは、デバイスはResume状態を
継続する。
4.NodeReset
Suspend状態にあるとき、ResumeかReset信号を検知したら、割込みを発生
して通知するとともに、10msec以内にUSBの信号を受信できる状態にする
必要がある。
【エンドポイント0の状態遷移】
エンドポイント0はコントロール転送を行うための特別なFIFOとなっています。
特にこのコントロールパイプだけは双方向転送が可能になっているので、やや
複雑な動きをしますが、送信と受信を同時に許可することは出来ません。
まず、このエンドポイント0の状態の遷移を説明すると、下図に示すように、
通常はTXC0、RXC0ともFLUSHした状態、つまりIDLEの状態にあります。
ここでまず、受信をイネーブルにすると、右側に行って、RXWAITで受信待ち
となります。この状態の時、SETUPかOUTのトークンがホストから送信される
とデバイス側である、USBN9603のFIFO0にデータが受信されRXの受信状態
となります。受信が完了するとACKを自動応答して、RXイベント割込みを発生
します。
この割込みにより、デバイスコントローラがデータをFIFOから取り出すと、IDLE
の状態に戻ります。
また、SETUPトークンの場合にはIDLE状態から直接RXの受信状態に遷移し
ます。
デバイスから送信をする場合には、まず、送信データがある場合には、TXD0
レジスタにデータを転送します。(常に最大8バイトです)
そしてそのあとにTXC0のTX_ENビットをONにするとTXWAITの送信待ちとなり
ます。送信するデータが無い場合には、直接TX_ENをイネーブルにすれば
TXWAITとなります。
この状態で、ホストからINトークンが送信されると、自動的にデバイス側のFIFO0
からデータが送信されてTX状態となり、送信がすべて行われた後、TXイベント
割込みを発生し、IDLE状態に戻ります。
このように、送信データをFIFO0にセットして送信イネーブルにしておけば、後は
自動的にホストからのINトークンに応答する形で返信されますので、プログラム
でINトークンを監視する必要がないので便利です。
受信のときにもOUTかSETUPに続くデータは自動的にFIFO0に受信されますので
プログラムは受信をイネーブルにするだけで良いことになります。
【内部レジスタ】
USBN9603は制御をするために非常に数多くのレジスタを内部に持っています。
すべての操作はこのレジスタへのRead/Writeで実行することになります。
下図はUSBNの状態を検出するためのイベントレジスタの一覧で、それぞれが
8ビットで構成されていて、ビット毎にイベントの区別が割り振られています。
使い方は、まずMain Eventである「MAEV」の内容を確認し、そのビット内容に従っ
て、その下位のレジスタをReadします。そしてさらにその下位のレジスタをRead
することで発生元のイベントの要因を知ることができます。
制御の方も、同様に、MCNTRL、CCONF、RID、NFSRというレジスタが用意され
ていて、それぞれのビットをセットすることで機能制御を行うことが出来ます。
【上位マイコンとのインターフェース】
マイコンとのインターフェースとして下記の3種類の方法があります。さらに
パラレルにはDMAモードがあります。DMAの詳細はデータシートをご覧下さい。
(1) パラレルインターフェース
8ビットデータバス、A0、CS、WR、RDという4本の制御信号を使った一般的な
マイコンのインターフェースです。
制御方法は、まずA0をHighにしてレジスタのアドレスをデータバスからWriteし、
そのあとで、A0をLowにして指定レジスタのRead/Writeを行います。
アドレスを変更しない限り同じレジスタまたはFIFOへのRead/Writeとなります。
(2) マルチプレックスパラレルインターフェース
昔のi8085というマイコンのインターフェースと同じで、8ビットのデータバスと
ALEというアドレスストローブ、CS、WR、RDの4本の制御信号を使います。
まずデータバスにレジスタのアドレスを出力しALEにHighのパルスを出力すると
そのアドレスはUSBNの内部でラッチされます。
その後のRead/Writeは指定されたレジスタへのアクセスとなります。
(3) マイクロワイア(SPI)インターフェース
SPI方式のシリアル信号で接続する方法で、マイコンとのインターフェースの信号
数が、SI、SK、SOの3本だけで良いと言うメリットがあります。
SPI通信のマスターにはマイコン側がなって、通信の制御を行います。従って
シリアル転送のクロックSKはマイコン側から出力されることになります。
ここで注意が必要なことはクロックのSKが出力されるとSIもSOも同時にシフトす
るということです。逆にSKが出ないと何も転送されません。
SPIでのレジスタのRead/Writeのタイミングは下図のようになります。またSPI
で出力するコマンドのフォーマットは下表のようになっています。
注)アドレスは6ビットのレジスタアドレス
コマンド内容
CMD ADDR名 称 サイクル 機 能 00 アドレス Basic Read 1 アドレスを取り込む。前回のデータを出力する。 2 次のアドレスを取り込む。指定されたアドレスのレジスタの
データを出力。
同じアドレスを連続して指定すれば、FIFOの内容を順次
読み出す。01 アドレス 無し (前回と同じデータがシフトされる) 10 アドレス Standard Write 1 書き込み先アドレスを取り込む。前回のデータを出力する 2 書き込むデータを取り込んでレジスタに書き込む。
(SIのデータを空読みする必要がある)11 アドレス Burst Write 1 書き込み先アドレスを取り込む。前回のデータを出力する 2〜n 書き込むデータを順次取り込んでレジスタに書き込む。
それらのデータはFIFO内に順次書き込まれる。
(SIのデータを空読みする必要がある)
終了はCSがHighになった時。
タイミングで注意が必要なのは、Readで1バイトのデータを読み出すためには、
2回のコマンド出力が必要になることで、つまり1回常に余分にダミーコマンドが
必要になります。
またWriteの時にもSIデータが入力されるので、マイコン側は、空読みしてバッファ
を空にする必要があります。
【USBN9603/9604の基本的な動かし方】
上記のレジスタのRead/Writeを行うことで機能制御を行いますが、基本となる
制御は下記のように行います。
(1) 送信動作
・送信させるEPCxに対してFIFOをFlushし、既に入っているかもしれないデータ
を破棄する。 (TXCxレジスタのFLUSHビットを1にしてWriteする)
・送信させるEPCxのFIFOに送信データをセットする。
(TXDxレジスタにデータをWriteする、連続Writeすれば順次FIFOに格納される)
・次に送るべきPIDを選択して、TXCxレジスタのTOGGLビットをセットするかクリ
アする。TOGGLEビットをセットすればDATA1、クリアすればDATA0として出力
される。
・対応するTXCxレジスタのTX_ENビットをセットして送信を実行する。TX_ENビット
をセットしておけば、ホストからのINパケットを受信したときに自動的に送信出
力する。
・対応する送信完了割込みを待つ。割込みイベントは、MAEVのTX_EVビットONで
検出でき、TXEVレジスタのビットによりどのFIFOの送信完了かを知ることができ
ます。
ただし、初期化の時に、対応するイベントのマスクはあけておく必要があります。
(2) 受信動作
・受信するEPCxに対応するRXCxレジスタのRX_ENビットをセットして受信状態に
する。また、対応するイベントのマスクレジスタ(RXMSK)をあけておく必要が
あります。
・対応する受信完了割込みを待つ。
割込み元はは、MAEVレジスタのRX_EVビットと、RXEVレジスタで知ることが
出来ます。
・対応するFIFOからデータを読み出す。
RXDxレジスタをReadすることで読み出せます。連続して読み出せば順次FIFO
内のデータが読み出せます。
・FIFOをFlushして残っているデータを破棄する。
(RXCxレジスタのFIFOビットを1にしてWriteする)
(3) フラッシュ動作
・Control Register(TXCn)のFLUSHビットをセットし、他の全てのビットをクリアして
Writeする。FLUSHビットそのものもクリア動作完了後一緒にクリアされる。
(4) 初期化
・SWRSTビットをセットしてソフトウェアリセットをする。リセット後、SWRSTビット
そのものもクリアされる。
・このとき割込みの出力方法も指定しておく。
・クロックの設定
・ノードアドレスを0のデフォルト値にする。endpoint0のコントロールレジスタEPC0
をクリアする。EPC1からEPC6はconfiguration後Enableにする。
・各マスクレジスタをendpointの使い方に合わせてセットする。
・EndpointとFIFOの番号は下記となっている。
Endpoint# TX FIFO# RX FIFO#
0 0 0 half duplex
1 1
2 1
3 2
4 2
5 3
6 3
・endpoint0はhalf duplexになっているので、受信動作に入る前には送信側を
Flushする必要がある。
・最後にOPR_STをセットして動作を開始してから、NATをセットして接続開始
準備状態にします。(NAT:Node Attach)
・これでホスト側が認識できることになります。
・内部レジスタの読みこみ
多くのレジスタの状態ビットは、レジスタを読みこむとクリアされる
ものが多いので、いったん読んだらプログラムで保存して参照可能にする
必要がある。
(5) NAKとSTALLの扱い
・ホストが応答できないときにNAKイベントが発生する。
・ホストがデバイス側からの送信を中止させるためにも使うことがある。
・デバイス側がUSB受信動作を出来ない状態の時には、EPCxレジスタのSTALL
ビットを1にしてWriteすれば、ホストに対してSTALL状態を返送する。