JAJU896 June 2023 ADS131M08 , MSPM0G1507
電圧と電流のサンプリング時に発生するさまざまなイベントを、図 3-3 に示します。灰色の項目は、テスト・ソフトウェアではなくハードウェア設定によって行われます。
図 3-3 に示されているプロセスを実行するため、各相について、すべての OSR ごと (この設計では 512 ごと) に新しい電流サンプルが準備され、SPI バスを経由して MSPM0+ MCU に、毎秒 8000 のサンプルが送られます。各サンプル には 30 バイト、ADC チャネルごとに 3 バイトのデータが含まれています。ADS131M08 デバイスからの最新の位相電流および電圧のサンプルが、N - 1 番目の電流および電圧のサンプル、または Iphx[N - 1] および Vphx[N - 1] に対応していると想定します。新しいサンプルの準備ができた時点で、ADS131M08 によって DRDY ピンが Low にアサートされます。ADS131M08 の DRDY ピンの立ち下がりエッジにより、MSPM0+ MCU で GPIO ポート割り込みが発生し、ポート ISR がトリガされて、バックグラウンド・プロセスがポート ISR 内で実行されます。バックグラウンド・プロセスを、図 3-4 に示します。このプロセスは主に、テスト・ソフトウェアでタイミング・クリティカルなイベントを処理します。
バックグラウンド・プロセスでは、以前に取得した電圧サンプル (Vphx[N - 2]) と、以前に取得した電流サンプル (Iphx[N - 2]) が保存され、後から per_sample_dsp 関数で使用できます。この関数は、計測パラメータの計算に使用される中間ドット積の数量を更新します。
以前に取得した電圧と電流のサンプルを保存した後、チップ・セレクトを Low にアサートし、ADS131M08 との通信がイネーブルされます。次に DMA が、ADS131M08 デバイスの最新の電流と電圧のサンプル (Iphx[N - 1] と Vphx[N - 1]) へのリクエストを送信し、ADS131M08 からのデータ・パケット応答を受信するように構成されます。現在のサンプルの要求と受信は、DMA モジュールによって自動的に行われます。
MSPM0+ MCU の DMA によって送信されるパケットと、DMA によって受信および結合される ADS131M08 からの応答パケットを、図 3-5 に示します。送信および受信パケットには 10 ワードが含まれ、各ワードは 3 バイト長なので、SPI バス経由で 30 バイトの DMA トランザクションが発生します。
ADS131M08 デバイスから ADC データを要求するとき、ADS131M08 に送信する必要がある最初のワードはコマンド・ワードです。テスト・ソフトウェアでは、ADS131M08 の設定を変更する必要はなく、標準的な ADC のサンプル読み出し時にレジスタを読み取る必要もないため、ADS131M08 に NULL コマンドが送信され、設計者はデバイスの状態を変更せずに ADS131M08 から ADC サンプルを取得できます。NULL コマンドの実際のサイズは 16 ビットですが、24 ビットのワードが使用されるため、16 ビット・コマンドの末尾に値 0x00 を追加してパディングする必要があります。したがって、送信される NULL コマンド・ワードの値は 0x00 00 00 です。MSPM0+ MCU がコマンド・ワードをシフトアウトするのと同時に、MCU は前のパケットのコマンド・ワードに対する応答ワードをシフトインします。NULL コマンドに対する応答ワードは、STATUS レジスタの内容です。この設計では、STATUS レジスタの内容は使用されないため、ADS131M08 から受信された最初のワードは無視されます (ソフトウェア・コードで処理されない)。
コマンド・ワードを書き込んだ後で、読み取る各バイトについてダミーの書き込みを行う必要があります。ADS131M08 デバイスからバイトを読み取るには、SPI クロックをイネーブルする必要があり、そのためにはダミー・バイトの書き込みが必要です。ダミー・バイトの書き込みごとに、SPI 送信レジスタに値 0x00 が書き込まれます。コマンド・バイトの書き込み直後に 3 つのダミー・バイトを書き込むと、MSPM0+ MCU は ADS131M08 のチャネル 0 から、3 バイトの ADC 値を受信できます。次の 21 のダミー・バイトを書き込むと、チャネル 1、チャネル 2 の順に、チャネル 7 までの ADC データが取得されます。最後に、次の 3 つのダミー・バイトを書き込むと、CRC ワードを取得します。CRC ワードは 24 ビットですが、実際の CRC は 16 ビットしかなく、24 ビット・ワードの最上位ビットに配置されています。このため、CRC ワードを解析するとき最後のバイトは必要ありません (ただし、ADS131M08 を適切に動作させるため、この 0 でパッドされたバイトのダミー書き込みは送信する必要があります)。
図 3-3 は、DMAが Iphx[N - 1] パケットの全体を受信するたびに、DMA ISR が自動的に呼び出されることを示しています。ISR 内では、9 つのコマンドおよび ADC ワード (合計 9 × 3 = 27 バイト) にわたって CRC が計算されます。この CRC 計算は 2 つのモードで行うことができます。MSPM0G3507 MCU の CRC モジュールを使用する方法と、memcpy() 関数を使用して 27 バイトの ADC データを、CRC16 が自動計算される特別なメモリ領域に移動する方法です。
どちらの方法も、テスト・ソフトウェアに正しく実装されています。verify_add_CRC() ルーチンを参照してください。memcpy() の実装は、バイト単位のフィードで CRC16 レジスタを使用するより約 5 倍も速く計算できるため、デフォルトで使用されます。CRC モジュールには 8 ビットまたは 16 ビットのデータをフィードできます。データは合計 27 バイトなので、CRC モジュールはバイトごとに更新されます。パケット全体で計算された CRC は、ADS131M08 から送信されたパケットで取得された CRC と比較されます。送信された CRC は、バイト 28 と 29 から解析されます (バイト 30 は CRC16 のゼロパディングなので、このバイトの値は無視されます)。
計算された CRC と解析された CRC が等しい場合、CRC チェックは成功し、ADC データが解析されて、N - 1 の時点での電圧および電流サンプルの値が得られます。解析された電圧と電流のサンプルは一時バッファに格納され、次の割り込みで per_sample_dsp 関数が呼び出されると、この情報が使用されます。DMA を介した SPI 転送が終了すると、CS (チップ・セレクト) ラインが自動的に MSPM0+ MCU から再び High になり、次の電流サンプル読み取りの準備ができる前に ADS131M08 の通信が正しくリセットされます。
最新の電流および電圧サンプル Iphx[N - 1] および Vphx[N - 1] を DMA チャネルを使用して MSPM0+ MCU に転送すると同時に、ADS131M08 は次の電圧 (Vphx[N]) および電流サンプル (Iphx[N]) を既にサンプリングしています。一方、テスト・ソフトウェアは、ADS131M08 から取得した以前の電圧 (Vphx[N - 2]) と電流サンプル (Iphx[N - 2]) に対して、サンプル単位の処理を実行します。このサンプルごとの処理を使用して、計測パラメータの計算に使用される中間ドット積の数量を更新します。サンプル処理の後、バックグラウンド・プロセスは、エネルギー比例パルスの計算と出力に「per_sample_energy_pulse_processing」を使用します。per_sample_energy_pulse_processing が完了すると、テスト・ソフトウェアはポート ISR を終了します。