iMXR1176 SDK 25.09.00 Manifest 3.15.0
ゴール
i.MX RT1176に搭載されているLTC2164 16ビットADCからデータを取得しています。データパスは次のとおりです。
LTC2164(フルレートCMOS出力)→FlexIO2(パラレルRX)→eDMA→外部SDRAM
ハードウェアのセットアップ
ソフトウェアのセットアップ
問題
100 MSPS の場合、16384 サンプルの処理には163.84 µsかかるはずです。連続する 2 つの DMA 割り込み間の時間を測定 (GPIO トグル + オシロスコープ) すると、常に338 µsという結果が得られ、これは約 2.06 倍です。
これは約48 MSPSの実効持続レートに相当し、ボトルネックはADCやSDRAMではなくFlexIO側にあることを示唆している。
質問
この部分でのFlexIO + eDMAの最大現実的な持続スループットについてのガイダンスがあれば、非常に助かります。なぜなら、別のペリフェラルに移行するか外部FIFOに切り替えるかを判断するからです。
よろしくお願いいたします。
こんにちは、ご返信ありがとうございます。確かに望ましい性能は達成できましたが、Flexioペリフェラルの推奨クロック周波数を最大を超えたことでしかできませんでした。具体的には、120MHzでクロックを設定するのではなく、100MSpsの取得には200MHz以上のクロック速度が必要ですが、120MHz構成ではクロックエッジがミスされます。問題は、200 MHzで動作しているにもかかわらず(リファレンスマニュアルには最大120 MHzと記載されていますが)、温度条件や生産バッチごとに安定して動作する保証がないことです。
こんにちは、@azed38 さん。
外部ピンをクロックソースとして使用した場合、わずかな同期レイテンシが発生することに注意してください。RMのセクション67.3.3.2によると、このレイテンシは0.5から1.5 FlexIOクロックサイクルの範囲です。
Habib_MS_1-1788818202534.pngHabib_MS_1-1788818202534.pngHabib_MS_1-1788818202534.png
FlexIOとDMAで達成可能な最大スループットに関しては、FlexIOとDMAの性能テストは存在しません。しかし AN12686 、FlexIOとDMAを用いた並列通信実装を示しているため、あなたのユースケースに関連する指針となるかもしれません。
BR
ハビブ
こんにちは、@azed38 さん。
このトピックに関してはすでに別のチャネルでサポートを受けているのに気づきましたので、すべてのコミュニケーションを集中管理するために引き続きサポートを続けます。FlexIOを最大周波数仕様を超えて運用すると、最終アプリケーションに影響を与える予期せぬ挙動を引き起こす可能性があることを付け加えたいと思います。RMの表15-4「クロックルート」に記載されている情報に基づき、最大周波数を120MHzにすることを推奨します。
BR
ハビブ
こんにちは、
この問題は、セクション「67.3.3.2」で説明されているピン同期の遅延が原因である可能性が高い。「ピン同期」というリファレンスマニュアルの内容です。
前述の構成を考慮すると、問題の根本原因は、このモジュールのピン同期遅延に起因する、入力データ周波数とFlexIOの動作クロック周波数の比率にある。
例えば、ピン同期遅延が存在するため、SPI MasterのようなFlexIOエミュレート**ペリフェラル**は、FlexIO動作クロック周波数の最大ボーレートでしか動作できません。RMの67.4.3節に記載されているように:「同期遅延のため、シリアル入力データのセットアップ時間は1.5 FlexIOクロックサイクルとなり、最大ボーレートはFlexIOクロック周波数の4で割られます。」
この場合、スループットは減少することが予想されており、ピン同期遅延はFlexIOモジュール固有の動作であるため、回避策はありません。
このため、FlexIOモジュールの適切な動作を保証するための最大動作周波数が120MHzであることと相まって、RT1170では期待される100MSPSは実現できません。
BR
ハビブ
> ほぼ正確な ×2 比率を踏まえると、これはFlexIOタイマーがクロックの両端で減少していること(TIMCMPの慣例)によるもので、タイマー比較値が実質的にスループットを半分に減らしているのではないでしょうか?
念のため申し上げておきますが、FlexIOタイマーは、ピンまたはトリガーからクロック供給されている場合、デュアルエッジ検出に対応しています。つまり、外部信号が上昇エッジと下降エッジを1つだけ作った場合、タイマーは比較値に2回カウントされます。
また、これまでのFlexIOの一般的な経験から言うと、外部信号はFlexIOのクロックレートの半分までしか扱えないと思います。他にどうやって二重エッジを感知できるのでしょうか?エッジを検出するためには、クロック周期ごとに外部ピンを2回サンプリングする必要がある。