KiNOKO-DAQ 関連情報 掲示板

このスレッドに記事を投稿する
前のスレッド | 次のスレッド | 掲示版ホーム

PENTALNADのMPX201A(Flash ADC)モジュール
2002 年 8 月 14 日 10 時 34 分
投稿者: 岩井

さんしろう様、こんにちは。新潟大学の岩井です。先週はお世話になりました。

さて、また困っているので、何か、助言のようなものを頂けたら、と思いまして。
今、PENTALNADのMPX201AというFADCを使っています。この人の持ってる各レジスタへのアクセスは問題ないのですが、この人の持ってるDaughterboardと呼ばれるメモリモジュールへアクセスすると、なんか変な具合です。

どう、変かというと、/dev/vmedrv32d32dmaでアクセスしていまして、(分解能は12ビット)メモリ内のデータを例えば、1000サンプリング吐かせてみます。
これは、100μsに相当していて、入力している正弦波が3波長分見えなければおかしいんですが、

0xffff1280
0xffff1310
0xffff13b0
0xffff1440
0xffff14e0

こんな感じに上の16ビットは1で埋められてます。なので、

unsigned short sdata = data & 0x0000ffff;

とかして、下の16ビットだけ1000サンプリング拾うようにしてるんですが、これをプロットすると、6波長分見えてしまうのです。つまり、16ビット(1個のデータ)ずつ飛ばして読んでるせいで、200μs相当のデータを読んでしまっているようです。

これを回避しようとして、/dev/vmedrv32d16にしてみたり、ポインタのインクリメントを16ビット分にしてみたりとか、やってみましたが、ダメです。

何か良い方法をご存知ないですか?または根本的になにかおかしいでしょうか?



2002 年 8 月 19 日 4 時 33 分
投稿者: 榎本 三四郎

こんにちは。遅くなってすいません。

この MPX201A というものについて何も知らないので何とも言えませんが、
とりあえず DMA を使わずにデータを読んでみたらどうなるでしょうか。
DMA は何かとトラブルが多いし、アクセスに失敗するとシステムが固まること
もあるので、完全に動くようになるまではなるべく使わないほうがいいと思います。
普通の PIO で read() するか、あるいは mmap() して一つづつ値を見てみる
とかして、まずモジュールを理解するのが絶対に楽です。もしできるなら、
バスアナライザやロジックアナライザでやりとりされているデータをモニタできると
問題の分離に役立ちます。

あと、アクセスモードは A32D32 で正しいのでしょうか? やったことはないのですが、
A32D16 のモジュールに A32D32 の DMA でアクセスするとそういうデータが帰って
くる場合があるような気もします。
(コントローラがアドレスを 4byte づつインクリメントしてモジュールが LWORD を
無視すると...)


その後
2002 年 8 月 29 日 9 時 42 分
投稿者: 岩井 剛

おはようございます、新潟大学の岩井です。ちょっと無理しすぎて、肺炎になっちゃって、しばらく入院してました。一昨日から復帰して、またVMEモジュールをいじくってるんですが、ちょっと、言葉が足りなかったみたいなんで、まず、MPX201Aというモジュールの説明を。

このモジュールはFlash ADCなんですが、他のモジュールと同じようにいくつかCSR等のレジスタを持っていて、さらに内部にメモリモジュールを抱えています。メモリモジュールのオフセットとかはMPX201Aのレジスタで設定します。なので、使い方としては、まず本体をmmapして、いろいろ設定してあげた後にメモリモジュールをmmapしてあげます。

MPX201Aには外部から、ゲートとクロックと入力(アナログパルス)を与えてあげて、ゲートが開いてるあいだ、クロックの数だけ入力パルスをサンプリングします。(実際にはどれだけサンプリングするかはMPX201Aで設定しますが)

アクセスモードにつきましてはマニュアルの記述をそのまま引用すると、

┏━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━━┓
┃          ┃VXI     ┃MEMORY        ┃
┣━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━┫
┃Addressing Modes  ┃A16     ┃A32          ┃
┣━━━━━━━━━━╋━━━━━━╋━━━━━━━━━━━┫
┃Data Transfers   ┃D16\D08 E0 ┃D32\D32 BLT\D64 BLT  ┃
┗━━━━━━━━━━┻━━━━━━┻━━━━━━━━━━━┛

とあります。なにやら意味不明な記述もあるんですが、多分、本体がA16D16で、メモリモジュールの方がA32D32でいいと思います。今はPIOでやってますし、A32D16等の他の全ての転送モードでも試験してみてます。


今、どうゆうことをやってるかというと、正弦波を2048サンプリングさせてその値を見ています。この2048サンプリングの中には2波長のデータが含まれるようにクロックと入力を調節しています。

単純に16bitずつ2048個のデータを取ってくると、(左がサンプリング番号で右がカウント)

0 3255
1 3255
2 3286
3 3286
:
:
2044 3194
2045 3194
2046 3225
2047 3225

というふうになって、どうも同じ値をひろってきてるみたいです。ちなみにきっちり2波長見えてます。

32bitずつデータをとって、その下位16ビットを使ってみると、

0 314
1 310
2 304
3 299
:
:
1021 334
1022 326
1023 320
1024 2047
1025 2047
1026 2047
1027 2047
:
:
2045 2047
2046 2047
2047 2047

0-1023の間で2波長見えてます。どうも一個飛ばしでデータを読んでるような気がします。0-1023までのデータが0-2047までに広がってないとおかしいのです。

その他にも32bitずつデータを取って、インクリメントは16bitずつ、とかやってみましたがダメです。msync()しなくちゃいけないのかな?とか思って、やってみましたが、意味ないみたいだし、他の転送モードは全然ダメです。

こんな感じで完全に煮詰まりました。自分に出来そうなことは全てやった感があります。なにか他に出来ることはありますでしょうか?すみませんが、アドバイスをお願い致します。



2002 年 9 月 2 日 16 時 30 分
投稿者: 榎本 三四郎

こんにちは。僕も風邪でしばらく家にいました。肺炎に比べれば全然大したことないですけど。

どうもまだ良く理解していないんですが、16bit と 32bit で 2048 サンプル読むと、
データサイズが倍違いますよね? 32bit の下位 16bit のデータは後半が全て 2047 で、
これは多分データではないと思います。(1 が 11 個というのも不思議な気もしますが)

モジュール上にはデータサイズを示すレジスタなどはないのでしょうか?
また、マニュアルにはデータフォーマットは書いてないのでしょうか?

もしメモリ領域が本当にメモリなら(FIFOなどでないなら)、デバッグのためには、
read() ではなくて mmap() してやれば、1ワードごとに値がどうなっているか
調べることができて、理解しやすいかもしれません。

役に立たなくてすいません。


うーん
2002 年 9 月 2 日 22 時 57 分
投稿者: 岩井 剛

お手数おかけして、すみません。

> モジュール上にはデータサイズを示すレジスタなどはないのでしょうか?
> また、マニュアルにはデータフォーマットは書いてないのでしょうか?

とりあえず、この線で、もう一度マニュアル読み直してみます。ありがとうございました。なんか、わかりましたら、また報告します。
お体には気をつけて。


アドレスは?
2002 年 10 月 13 日 23 時 43 分
投稿者: 葛西 和夫

ADC モジュールはアドレスによって転送モードが決定されるのもあると聞いたことがあります。(私もハード屋ではないので詳しくはないのですが)
マニュアルを確認してみて下さい。
私も今、BIT3のアダプタでADCとTDCの制御を行おうとしています。出来たら情報交換も兼ねて、ここを使用させて頂きたいと思っています。
誰かハードに詳しい人もここを見ていてくれると助かるのですが。
又、良かったらソースコードを送って下さい。


Re: アドレスは?
2002 年 10 月 18 日 21 時 12 分
投稿者: 岩井 剛

はじめまして、葛西様。新潟大学の岩井というものです。
実はここは自分が質問したいときしか利用してないんで(さんしろうさんごめんなさい)、書き込みに気づきませんでした。すみません。

マニュアルはつくばに置いてきてしまって、今、見れないんで、マニュアルについてはまた後日ということで。でも、たしか「0x○○○○から0x○○○○の値のどれかを設定するように」くらいしか書いてなかったと思います。

それと、ソースコードですが、一応、添付しますが、独自でクラスライブラリを作ってそれらをアプリケーションプログラムから使う、という形なので、ちょっと見ただけではいまいち要領を得ないかもしれませんが、TVmeMpx201aModule.cc がFADCを表現したもので、TVmeDaughterBoardMemoryModule.cc が FADCに搭載されているメモリモジュールを表現したものです。
DarkReadoutList.cc がアプリケーション側の実装ファイルでして、ここでベースアドレスを 0xc000 に決定しています。

相変わらず、上の書き込みで書いた問題(一個飛ばしでデータを読んでしまう、もしくはそのように見えてしまう)は解決してないです。しょうがないので、2倍のデータを読んで解決してます。

添付ファイル: TVmeMpx201aModule.cc (2.6 kb)


一度にひとつしか添付できないようなので
2002 年 10 月 18 日 21 時 14 分
投稿者: 岩井 剛



添付ファイル: TVmeDaughterBoardMemoryModule.cc (3.1 kb)


もうひとつ
2002 年 10 月 18 日 21 時 14 分
投稿者: 岩井 剛



添付ファイル: DarkReadoutList.cc (1.1 kb)


このスレッドに記事を投稿する