S32K144 用に CANFD アプリケーションを設定しました。バスオフ状況を処理するために、次のコードが追加されました。一度の短絡後に送信状態を回復できることが判明しました。しかし、連続して複数の短絡が発生すると、最終的にメッセージの送信が停止することが判明しました。その理由は何でしょうか?
それは私のコードです
CANFD_BUSOFF = (CAN0->ESR1 & CAN_ESR1_FLTCONF_MASK) >> CAN_ESR1_FLTCONF_SHIFT;
//バスオフ状態
CANFD_BUSOFF == 0x03の場合
{
// 置位软件复位位
CAN0->MCR |= CAN_MCR_SOFTRST_MASK;
//等待ち复位完了(ハードウェア自動消去この位
while(CAN0->MCR & CAN_MCR_SOFTRST_MASK) {}
//写1清除全部错误标志
CAN0->ESR1 = 0xFFFFFFFF;
//反初化驱動
FLEXCAN_DRV_Deinit(INST_FLEXCAN_CONFIG_1);
// 再初初期化驱動と邮箱(完全重现启動構成)
HAL_setupCAN();
}
そうでない場合//通常状態
{
//データ受信
HAL_readCAN_Message(&canMsg_handle->RX_0x0101); //调用驱動受信收报文
//データ送信
canMsg_handle->TX_0x0201.msgData[0]= canMsg_handle->RX_0x0101.msgData[0];
canMsg_handle->TX_0x0201.msgData[1]= canMsg_handle->RX_0x0101.msgData[1];
canMsg_handle->TX_0x0201.msgData[2]= canMsg_handle->RX_0x0101.msgData[2];
canMsg_handle->TX_0x0201.msgData[3]= canMsg_handle->RX_0x0101.msgData[3];
canMsg_handle->TX_0x0201.msgData[4]= canMsg_handle->RX_0x0101.msgData[4];
canMsg_handle->TX_0x0201.msgData[5]= canMsg_handle->RX_0x0101.msgData[5];
canMsg_handle->TX_0x0201.msgData[6]= canMsg_handle->RX_0x0101.msgData[6];
canMsg_handle->TX_0x0201.msgData[7]= canMsg_handle->RX_0x0101.msgData[7];
canMsg_handle->TX_0x0201.msgData[21] = canMsg_handle->RX_0x0101.msgData[21];
canMsg_handle->TX_0x0201.msgData[22]= canMsg_handle->RX_0x0101.msgData[22];
canMsg_handle->TX_0x0201.msgData[23]= canMsg_handle->RX_0x0101.msgData[23];
canMsg_handle->TX_0x0201.msgData[61] = canMsg_handle->RX_0x0101.msgData[61];
canMsg_handle->TX_0x0201.msgData[62]= canMsg_handle->RX_0x0101.msgData[62];
canMsg_handle->TX_0x0201.msgData[63]= canMsg_handle->RX_0x0101.msgData[63];
HAL_sendCAN_Message(canMsg_handle->TX_0x0201); //调用驱動送信报文
}
問題を特定しました。私の同僚は最初にコールバック関数を登録し、その後 busoff 操作後にいくつかのフラグをクリアしました。このため、SDK ステート マシンは単独で状態を処理できなくなりました。
サンプル コードを確認したところ、障害が発生した場合にのみメールボックス 1 へのメッセージの送信が停止されることがわかりました。説明には、短絡障害が解消された後にメッセージの送信が再開されたと記載されています。リセットを追加した主な理由は、送信ステータスを処理しないとシステムがフリーズし、メッセージが送信されなくなるためです。このリセットプロセッシングを追加しても、特定の CANH と CANL の短絡が発生した後は、メッセージの送信状態が停止し、回復しなくなります。
こんにちは、
障害状態をどのくらいの頻度でチェックしているのか、または HAL 関数が内部で何を実行しているのかは完全には明らかではありません。
一般的に、FLTCONF フィールドではなくバスオフ フラグに依存し、エラー/バスオフ割り込みを有効にして、より適切な処理を実行することをお勧めします。
簡単な実装については次の例を参照してください。
https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K144-FlexCAN-TX-RX-Error-ISR-test-S32DS2...
バスオフが検出された後、必ずしもモジュールの deinit/init に続いて SOFT リセットを実行する必要はありません。アプリケーションの再初期化が必要な場合は、deinit/init を使用してください。
あるいは、例に示すように、単にメッセージを中止することもできます。
BR、ペトル