2014年1月26日日曜日

Communication Box 23 (GPIB IPの作成 12)

問合せコマンド(query command)が連続して実行できない理由が判った。
GPIBバスのIFC、REN、ATN、EOI、SRQの信号は基本的にLINEレジスタから制御する。


この内、EOIはやや特殊である。
ライトはIPがコントローラとして動作していて且つコマンドモードの場合に有効となる。つまり、その場合にライトした値がバスに出力される。これに対してリードは常にバスの信号の状態を返す。問合せコマンドに対する応答データを受信後バスをコマンドモードに戻す際に、ソフトウェアを以下のように記述していた。

  pGPIB->LINE |= LINE_ATN

これで、ATNのみをTRUEにしているつもりだった。GPIBバスのコマンドモードとデータモードはATNのレベル(HかLか)によって決まる。また、上記のとおりEOIはリードとライトで参照する対象が異なるのでこの記述だと、データモード側のEOI値(現在のバスの状態)が、コマンドモード側のEOIに設定されてしまう。 問合せの応答データの最終バイトにはデリミタとしてEOIがアサートされるが、このEOIがネゲートされるタイミング次第では上記のモード切替のリードでアサートされたEOIがリードされることになり、それがコマンドモードで設定されることになる。これが原因で、以降のコマンド送出が滞ってしまっていた。コマンドモードでEOIに1をライトするのはパラレルポールを行う場合のみであり、それ以外ではEOIは0をライトしなければならない。したがって、上記は以下のように記述すべきであった。

       pGPIB->LINE = (pGPIB->LINE & ~LINE_EOI) | LINE_ATN

つまり、リード値のEOIの部分をマスクしてATNの部分を1にする。このようにソフトウェアを修正することで連続実行も可能となった。この部分はレジスタの仕様を変更したほうがいいかな。。。コマンドモード時以外は0になるようにした。

オシロ2台をGPIBバスに接続して、それぞれに問合せコマンドを発行してみた。


プログラム


結果


それぞれで3回づつ連続した場合




FIFOの閾値とか、割込み、シリアル/パラレルポール等々、まだ確認すべきものはあるが、一応これで基本的な送受信の確認は取れたと思う。


0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...