バスマスタ転送機能を用いて、サンプリング(入力)/ジェネレーティング(出力)する場合の 設定手順を説明します。
初期化とモード設定が完了したら、サンプリング/ジェネレーティング条件を設定します。
サンプリング/ジェネレーティング条件には、以下の3種類があります。
・スタート条件設定:入出力を開始するための条件 (ソフトスタート、外部スタート等)を設定する(DioDmSetStartTrg)
・クロック条件設定:入出力を行なうタイミング(内部クロック、外部クロック等)を設定する (DioDmSetClockTrg)
・ストップ条件設定:入出力を完了するための条件(ソフトストップ、指定個数停止など)を設定する、 (DioDmSetStopTrg)
また、各設定に対して、それを補足する条件設定関数(例:個数指定停止時の個数設定など)があります。
これらのサンプリング/ジェネレーティング条件設定は、常に同じ条件でデータを入出力する場合には、初期化後に一度行なっておけば、それ以降は同じ条件で動作が行なわれます。
データ転送毎に異なる動作条件で転送を行なう場合には、変更すべき設定のみを、転送開始する前に設定してください。
サンプリング/ジェネレーティングのパターンは、以下の表の中から選択できます。
スタート条件 |
クロック条件 |
ストップ条件 |
|
---|---|---|---|
種類 |
ソフトウェアスタート |
内部クロック |
ソフトストップ |
種類 |
外部スタート立上り |
外部クロック |
外部スタート立上り |
種類 |
外部スタート立下り |
ハンドシェイク |
外部スタート立下り |
種類 |
パターン一致(入力のみ) |
SCコネクタEXTSIG1 |
SCコネクタEXTSIG1 |
種類 |
SCコネクタEXTSIG1 |
SCコネクタEXTSIG2 |
SCコネクタEXTSIG2 |
種類 |
SCコネクタEXTSIG2 |
SCコネクタEXTSIG3 |
SCコネクタEXTSIG3 |
種類 |
SCコネクタEXTSIG3 |
|
|
リセット関数によって、前回の転送時のカウンタ値やFIFO内容をリセットする必要があります(DioDmReset)。
バスマスタ転送は、ボードに転送先のメモリアドレスを設定しておき、転送をスタートするとボードからそのメモリアドレスへデータの転送を行ないます。
従って、転送開始前に入力値を受け取るバッファ領域を、ボードに設定しておかなければなりません(DioDmSetBuff)。
設定したバッファ領域は、物理的に他のアドレスに移動しないようにロックされます。
ロックされた領域は、転送完了によってアンロックされます。
アンロックされた領域に対する転送は危険ですので、バッファの設定は転送を行なう毎にかならず行なわなければなりません。
バッファ領域をヒープやスタックなどに取った場合、この領域は転送が完了するまで、開放されないようにしなければなりません。
転送完了までにバッファ領域が開放されてしまった場合、その領域は他の処理に使用されます。
他の処理に使用されている領域にデータ転送が行なわれると、プログラムが例外を発生してしまう可能性があります。
プログラムの安全性を重視するのであれば、バスマスタ転送に使用する領域は、グローバルな領域を使用することをお勧めします。
転送時の動作としては、バッファ内にデータを全部転送した時点で転送を完了する1回転送と、同じバッファ領域に対して無限回数繰り返してデータを転送する無限転送を用意しています。
バスマスタ転送は、ハードウェアに転送元のメモリアドレスを設定しておき、ジェネレーティングを実行する前にそのメモリアドレスからボード内のFIFOにデータの転送を行なっておきます。
出力を行なう場合は、出力データを格納したバッファ領域を、ハードウェアに設定しておかなければなりません(DioDmSetBuff)。
設定したバッファ領域は、物理的に他のアドレスに移動しないようにロックされます。
ロックされた領域は、転送完了によってアンロックされます。
バッファの設定は転送を行なう毎にかならず行なわなければなりません。
バッファ領域をヒープやスタックなどに取った場合、この領域は転送が完了するまで、開放されないようにしなければなりません。
転送完了までにバッファ領域が開放されてしまった場合、その領域は他の処理に使用され、出力したいデータ以外のデータが書き込まれます。
そのままの状態で転送が行なわれると、予期せぬデータを出力してしまう可能性があります。
プログラムの安全性を重視するのであれば、バスマスタ転送に使用する領域は、グローバルな領域を使用することをお勧めします。
転送時の動作として、バッファ内のデータを全部転送した時点で転送を完了する1回転送と、同じバッファ領域に対して無限回数繰り返してデータを転送する無限転送を用意しています。
同一データを指定回数だけ繰返して転送したい場合、その回数分のサイズのバッファを用意して、1回転送を使用してください。
サンプリング/ジェネレーティング条件を設定し、バッファを設定したら、動作をスタートします(DioDmStart)。
動作をスタートすると、スタート条件が満たされた時点でサンプリング/ジェネレーティングが開始され、ストップ条件が満たされた時点でサンプリング/ジェネレーティングが終了します。
ソフトウェアスタートにした場合、DioDmStart関数を呼び出したタイミングで、サンプリング/ジェネレーティングが開始されます。
入力データは、一旦ボード内のFIFOに蓄えられ、バスが空いたタイミングを利用して、アプリケーション中のメモリに転送されます。
出力データは、直ちにボード内のFIFOに送られ、クロック条件が成立した時点で外部に出力されます。
ストップ条件が満たされると、サンプリング/ジェネレーティングが終了します。
アプリケーションから動作の終了を捕らえるには、ステータスを監視する方法(DioDmGetStatus)と、メッセージによって終了を確認する方法(DioDmSetStopEvent)の2つが用意されています。
動作途中で、転送数を確認して(DioDmGetCount)、処理を行なうこともできます。
サンプリング/ジェネレーティングが終了すると、ロックされていたバッファ領域がアンロックされます。