i.MXRT1176では、EDMAとFLEXCANを使用しています。(SDK 26.03)
DMA転送完了時にコールバック関数が定義されています。
これが私たちの流れです。
1.転送を開始するには、`FLEXCAN_TransferReceiveFifoEDMA()` を呼び出してください。
2. DMA転送完了時にユーザー定義コールバックが呼び出されます。
3. データはDMAバッファからコピーされ、メッセージの受信を継続するために`FLEXCAN_TransferReceiveFifoEDMA()`が呼び出されます。
4. 手順2~4を繰り返す
別のノードから最小限のフレーム間隔でバースト的にメッセージを送信すると、ACKエラーの数が増加することがわかりました。つまり、iMXがメッセージをACKできないということです。
処理の流れを追っていくと、DMA転送完了コールバックが発生するたびに、FLEXCAN上でDMAが無効化されているようです。「FLEXCAN_TransferReceiveFifoEDMA()」が呼び出されると再び有効化されます。 これは「FLEXCAN_EnableRxFifoDMA()」を呼び出すことで行います。有効化/無効化DMAはFLEXCANのMCRレジスタ内のDMAビットを更新し、フリーズモードでのみ可能です。メッセージを一気に受信しているため、FLEXCANがフリーズモードに設定されている間に送信が進行中である可能性があります。そして、着信メッセージをACKで確認できません。