JAJA859 April 2025 MSPM0G3506 , MSPM0G3507 , MSPM0G3518 , MSPM0G3519
バス オフ状態は、重大なバスエラーのために CAN ノードが強制的に絶縁された場合に発生します。この状態では、ノードはデータの送受信を停止し、実質的にバスとの接続を切断します。このメカニズムにより、バスが永続的なエラーから保護され、故障伝搬が防止されます。
1 次トリガは、TEC がスレッショルド (通常 255) を超えたときです。一般的なシナリオは次のとおりです。
たとえば、転送エラーのたびに TEC は 1 ずつインクリメントされます。エラーが急速に蓄積され、TEC が 255 を超えると、ノードはバス オフ状態になります。
このデバイスは、次のいずれかのアクションを実行することで、バス オフ状態から回復できます。
以下に、まず SysConfig で Bus_Off ステータス割り込みを有効化してバス オフ ステータスを検出する方法の一例を示します。バス オフ ステータスが変化すると、MCAN は Bus_Off ステータス割り込みをトリガして、この状況をユーザーに通知します。ユーザーは、バス オフ状態が割り込みルーチンであるかどうかを確認する必要があります。
/**
* CAN protocol status
* Bus off
*/
DL_MCAN_ProtocolStatus gProtStatus;
volatile uint8_t CANBusOff = 0;
void MCAN0_INST_IRQHandler(void)
{
switch (DL_MCAN_getPendingInterrupt(MCAN0_INST)) {
case DL_MCAN_IIDX_LINE0:
break;
case DL_MCAN_IIDX_LINE1:
/* MCAN bus off status changed */
if(gInterruptLine1Status&DL_MCAN_INTERRUPT_BO) {
DL_MCAN_getProtocolStatus(MCAN0_INST, &gProtStatus);
if(gProtStatus.busOffStatus == 1) {
CANBusOff = true;
}
else {
CANBusOff = false;
}
}
/* Clear all MCAN interrupt status */
DL_MCAN_clearIntrStatus(MCAN0_INST, gInterruptLine1Status, DL_MCAN_INTR_SRC_MCAN_LINE_1);
break;
default:
break;
}
}
次に、メイン ループの CANBusOff フラグを確認します。バス オフ状態が検出されたら、MCAN モジュールを再起動します。
main loop:
{
if(CANBusOff == 1) {
/* Re-start MCAN */
MCAN0_Restart();
CANBusOff = 0;
}
}
/*MCAN restart function*/
void MCAN0_Restart(void)
{
DL_MCAN_reset(CANFD0);
delay_cycles(16);
DL_MCAN_disablePower(CANFD0);
delay_cycles(32);
DL_MCAN_enablePower(CANFD0);
// MCAN RAM need at least 50us to finish init
// 1600 CPU cycles@CPU32MHz
// 4000 CPU cycles@CPU80MHz
delay_cycles(4000);
SYSCFG_DL_MCAN0_init();
}