皆さん、こんにちは
s32k118 MCUを使用しており、CANバスとインターフェースする必要があります。CAN_Receive()関数を使用して100ミリ秒ごとにCANバスをポーリングして、バスからメッセージを取得してきましたが、残念ながら、100ミリ秒ごとにバスに複数のメッセージがあるため、多くのメッセージを見逃しています。
最終的な目標は、受信したすべてのメッセージを CAN メッセージのキューに非同期的に追加し、定期的に解析できるようにすることです。私は、MCUがバス上のメッセージを検出するたびにトリガーされるCAN Rx割り込みを使用してこれを達成したいと考えていました。残念ながら、そのようなISRを設定することはできません。
CAN0_ORed_0_31_MB_IRQn IRQで、interrupt_managerコンポーネントを使用してISRを設定しようとしました。しかし、私のISRは、main()関数でCAN_Receive()を呼び出し た後に のみトリガーされているようです。これは、ISR内のすべてのCAN_Receive()関数を排他的に望んでいたため、私の要件を満たしていません。さらに、一度トリガーされた後、コードはISRを何度も繰り返し呼び出すことで行き詰まっているように見えます。
CAN_InstallEventCallback()でコールバック関数をインストールしようとしましたが、ここでも、コールバック関数はCAN_Receive()またはCAN_Send()を呼び出した後に のみ呼び出されます。したがって、繰り返しになりますが、バスからのすべてのメッセージをキャッチするためにコールバックに頼ることはできないようです。
最後に、Rx FIFO 機能を使用し、すべてのメッセージをバッファ タイプの形式でメールボックス 0 に正常に追加します。これが私が必要とするものです...ただし、最大6メッセージに制限されています。
一度に ~16 個のメッセージをバッファリングする必要があると予想しています。
ポーリング、ISR、コールバックで直面した問題を説明するために、「CAN_Example」プロジェクトを添付しました。問題がさらに明確になることを願っています。
このタスク、つまり、将来の解析のために受信 CAN メッセージをバッファリングするというタスクは、どのように実現すればよいですか?
おかげで、これで問題は解決します!
私が見逃していた重要なポイントは、コールバックが正しく機能するために、各メールボックスで少なくとも1回はFLEXCAN_DRV_Receive() 、 FLEXCAN_DRV_RxFifo() 、またはCAN_Receive()を呼び出すことだったようです。
以下のリンクのデモでは、MBまたはFIFO割り込みを使用してCANフレームを送受信する方法を示しています。
https://community.nxp.com/t5/S32K-Knowledge-Base/S32K1xx-FlexCAN-Mask-Setting-Demo/ta-p/1519753