GPIBのハンドシェイク
GPIBのハンドシェイクとは
ここの所、GPIBドライバのファームウェアを書いていて、色々文献では判らなかったことがはっきりしてきたので、メモ代わりに書いておこうと思う。
GPIBは古くは HPIBと言って、HP社が開発したパラレルインターフェイスで、主に測定器どうしを繋げたり、パソコンから測定器を制御する目的から生まれたインターフェイスです。
このインターフェイスはバスにぶら下がる機器がすべてパラレル接続なので、変わったハンドシェイク方法を用いているので、そのあたりから説明します。
1)基本的にはバスは TTL 。特にハンドシェイクする信号はオープンコレクタタイプの出力ポートになっている。
2)バスの論理は負論理。 TTL の時代なので、 GND に引き込むほうがアクティブな動作である。従って、バスに流す信号は負論理で、例えば "A" という信号はアスキーコードでは 0x41 であるが、バスはこれが反転した 0xBE となっています。
3)ハンドシェイク線の1つ目は Ready の NRFD
これは [ Not Ready For Data ] の略ですが、通常 Ready ならば 準備 OKで High になるところ、負論理なので Low にしたいところが、この信号は繋がっている全ての機器が Ready になったのを検出したいので、オープンコレクタならば全部 OK のときにはじめて True になるのは ハイインピーダンス状態。つまり High になれば全部の機器が OK で、1つでも NG ならばショート状態の Low になる信号です。
すると今までの負論理と反対の極性になってしまうので、頭に[ NOT ] をつけて反転したものだと定義したのです。
4)もう1つは ACK の NDAC
このインターフェイスはバスにぶら下がる機器がすべてパラレル接続なので、変わったハンドシェイク方法を用いているので、そのあたりから説明します。
1)基本的にはバスは TTL 。特にハンドシェイクする信号はオープンコレクタタイプの出力ポートになっている。
2)バスの論理は負論理。 TTL の時代なので、 GND に引き込むほうがアクティブな動作である。従って、バスに流す信号は負論理で、例えば "A" という信号はアスキーコードでは 0x41 であるが、バスはこれが反転した 0xBE となっています。
3)ハンドシェイク線の1つ目は Ready の NRFD
これは [ Not Ready For Data ] の略ですが、通常 Ready ならば 準備 OKで High になるところ、負論理なので Low にしたいところが、この信号は繋がっている全ての機器が Ready になったのを検出したいので、オープンコレクタならば全部 OK のときにはじめて True になるのは ハイインピーダンス状態。つまり High になれば全部の機器が OK で、1つでも NG ならばショート状態の Low になる信号です。
すると今までの負論理と反対の極性になってしまうので、頭に[ NOT ] をつけて反転したものだと定義したのです。
4)もう1つは ACK の NDAC
名前は [ Not Data ACcepted ]で、やはり「データー受信したよ」の反転信号です。
しかしながら、この2つのハンドシェイク信号は名前とは裏腹に、 High で OK ってレベルなので、オシロで見るには判りやすい。
5) ハンドシェイクを送る側の信号は DAV
[ DAta Valid ]で、データーが有効な期間を示しますが、ここは負論理なので Low の時に有効です。
右図にハンドシェイクの様子を示します。
①まず送り側(トーカー)は NRFD,NDAC が共に Low であることを確認してデーターバスに信号をセットします。正確にはNDAC が Low であること、NRFD,NDAC が共にHigh でないことで始めますが、GPIBの場合始めにコマンドデーターから始める場合が常なので、この場合「コマンドを始めるよ」という合図の ATN という信号を Lowにした直後は NRFD,NDAC とも Lowになります。
受け側(リスナー)は受信準備が出来ると NRFD を High(オープン状態)にします。全てのリスナーが High になったタイミングでこの NRFD が High になります。
② 送り手(トーカー)は、NRFDが High になったのを確認してデーターが有効なのを示す、 DAV をアクティブ( Low)にします。
③DAV= Low をリスナーが確認して NRDFを LOW にすると共にデーターバスラインからデーターを読み取ります。(読んだ信号を反転してメモリーにストア)
④信号を読んだ後、リスナーは NDAC をHigh(オープン)にします。全ての機器が読み終えるとバス上の NDACは High になります。
⑤ トーカーは NDAC =High を確認して DAV を元に戻します。( High )
⑥DAV = High をリスナーが確認してNDAC を再び Low にします。
⑦ NDAC , NRFD が共に Low になったのを確認してトーカーはデーターバスの内容を変え、再び①の手順からハンドシェイクを行います。
ここで、今回重要だったのが、コマンドを受けたときの NDAC の処理でした。
上記ハンドシェイクのように通常はハンドシェイクの最後に NDAC = Low にします。コマンド受信中はトーカーから誰が次のデーター送信時に話すのか(TA トーカーアドレス)誰が受信するのか(LA リスナーアドレス)が指示されるのですが、リスナーが自分以外だった場合、リスナーはとりあえず次のデーター区間( ATN = High )の間は無関係です。それでリスナーは ATN = High となったタイミングで NDAC をオープンにします。(これはリスナーに指定されたアドレスに機器がある場合は その機器がNDAC = Low としますので、実際にリスナーと繋がっている場合上記①の開始の段階で NDAC を見ることで確認できるからです)
このNDAC反応を利用して、NI の「測定器スキャン」コマンドは機器がバスにいるかどうかをチェックしており、今回無事にスキャン動作に対応できたのは、この部分に対応できたからです。
他に [ *IDN?]というコマンドで、機器名などを返す必要がありますが、なかなか GPIBのドライバも奥が深いですね。通常のリスナーになる場合のハンドシェイクは資料などにも載っているのですが、自分がリスナーじゃない場合などという信号の出し方は教えてくれてませんから大変でしたね。
しかしながら、この2つのハンドシェイク信号は名前とは裏腹に、 High で OK ってレベルなので、オシロで見るには判りやすい。
5) ハンドシェイクを送る側の信号は DAV
[ DAta Valid ]で、データーが有効な期間を示しますが、ここは負論理なので Low の時に有効です。

①まず送り側(トーカー)は NRFD,NDAC が共に Low であることを確認してデーターバスに信号をセットします。正確にはNDAC が Low であること、NRFD,NDAC が共にHigh でないことで始めますが、GPIBの場合始めにコマンドデーターから始める場合が常なので、この場合「コマンドを始めるよ」という合図の ATN という信号を Lowにした直後は NRFD,NDAC とも Lowになります。
受け側(リスナー)は受信準備が出来ると NRFD を High(オープン状態)にします。全てのリスナーが High になったタイミングでこの NRFD が High になります。
② 送り手(トーカー)は、NRFDが High になったのを確認してデーターが有効なのを示す、 DAV をアクティブ( Low)にします。
③DAV= Low をリスナーが確認して NRDFを LOW にすると共にデーターバスラインからデーターを読み取ります。(読んだ信号を反転してメモリーにストア)
④信号を読んだ後、リスナーは NDAC をHigh(オープン)にします。全ての機器が読み終えるとバス上の NDACは High になります。
⑤ トーカーは NDAC =High を確認して DAV を元に戻します。( High )
⑥DAV = High をリスナーが確認してNDAC を再び Low にします。
⑦ NDAC , NRFD が共に Low になったのを確認してトーカーはデーターバスの内容を変え、再び①の手順からハンドシェイクを行います。

ここで、今回重要だったのが、コマンドを受けたときの NDAC の処理でした。
上記ハンドシェイクのように通常はハンドシェイクの最後に NDAC = Low にします。コマンド受信中はトーカーから誰が次のデーター送信時に話すのか(TA トーカーアドレス)誰が受信するのか(LA リスナーアドレス)が指示されるのですが、リスナーが自分以外だった場合、リスナーはとりあえず次のデーター区間( ATN = High )の間は無関係です。それでリスナーは ATN = High となったタイミングで NDAC をオープンにします。(これはリスナーに指定されたアドレスに機器がある場合は その機器がNDAC = Low としますので、実際にリスナーと繋がっている場合上記①の開始の段階で NDAC を見ることで確認できるからです)
このNDAC反応を利用して、NI の「測定器スキャン」コマンドは機器がバスにいるかどうかをチェックしており、今回無事にスキャン動作に対応できたのは、この部分に対応できたからです。
他に [ *IDN?]というコマンドで、機器名などを返す必要がありますが、なかなか GPIBのドライバも奥が深いですね。通常のリスナーになる場合のハンドシェイクは資料などにも載っているのですが、自分がリスナーじゃない場合などという信号の出し方は教えてくれてませんから大変でしたね。
| 固定リンク
「アナログ」カテゴリの記事
- MIDAS Venice Mixerの修理(電源編)(2024.12.05)
- MIDAS Venice Mixerの修理(2024.12.04)
- 真空管のはなし(2024.05.21)
- パワーアンプ RAMSA WP-1200A の修理(2023.08.06)
- BOSE Power AMP 1701 の修理の話(2023.07.15)
コメント
その昔、製造ラインで測定器を制御したくIBM PCよりも安価な MSXに目を付けました。
MSXのカートリッジに TI (だったと思います)の GP-IB制御用ICと UV EPROM、ピギーバックのコネクタの片割れを搭載しました。
MS BASICから File Openして書き込んでポインタを渡したような記憶があります。
30数年前なので記憶が、、、、
確か、ハンドシェイクの全容が分かるまで大変でしたが、その後はすんなりでした。
懐かしいお話をありがとうございます。
投稿: Maeda | 2013年8月13日 (火) 21時36分
Maeda さん こんにちは
MSXも懐かしいですね。たしかに仕様が公開されている Z80 マシンですから、当時制御用パソコンとしては便利だったでしょうね。
昔はプリンタポートをBasicから直接制御出来たりして、ハード屋には良い時代だったなぁ...
投稿: SUDOTECK | 2013年8月14日 (水) 16時29分