JAJA859 April   2025 MSPM0G3506 , MSPM0G3507 , MSPM0G3518 , MSPM0G3519

 

  1.   1
  2.   概要
  3.   商標
  4. 1はじめに
    1. 1.1 MCAN の機能
  5. 2MCAN モジュールの SysConfig 構成
    1. 2.1 MCAN クロック周波数
    2. 2.2 MCAN の基本構成
      1. 2.2.1 トランスミッタ遅延補償 (TDC)
      2. 2.2.2 ビット タイミング パラメータ
      3. 2.2.3 メッセージ RAM の構成
        1. 2.2.3.1 標準および拡張 ID フィルタの構成
          1. 2.2.3.1.1 フィルタを追加する方法
        2. 2.2.3.2 TX MSG RAM
        3. 2.2.3.3 RX MSG RAM
    3. 2.3 高度な構成
    4. 2.4 保持構成
    5. 2.5 割り込み
    6. 2.6 ピン構成および PinMux
  6. 3デモ プロジェクトの説明
    1. 3.1 TX バッファ モード
    2. 3.2 TX FIFO モード
    3. 3.3 RX バッファ モード
    4. 3.4 RX FIFO モード
  7. 4CAN 通信の問題を解決 / 回避するためのデバッグと設計のヒント
    1. 4.1 最低限必要なノード数
    2. 4.2 トランシーバが必要な理由
    3. 4.3 バス オフ ステータス
    4. 4.4 低消費電力モードでの MCAN の使用
    5. 4.5 デバッグ チェックリスト
      1. 4.5.1 プログラミングの問題
      2. 4.5.2 物理層の問題
      3. 4.5.3 ハードウェアのデバッグのヒント
  8. 5まとめ
  9. 6参考資料

バス オフ ステータス

バス オフ状態は、重大なバスエラーのために CAN ノードが強制的に絶縁された場合に発生します。この状態では、ノードはデータの送受信を停止し、実質的にバスとの接続を切断します。このメカニズムにより、バスが永続的なエラーから保護され、故障伝搬が防止されます。

1 次トリガは、TEC がスレッショルド (通常 255) を超えたときです。一般的なシナリオは次のとおりです。

  • ハードウェア障害:CAN コントローラまたはトランシーバの破損。
  • 物理層の問題:開放または短絡、不適切な終端抵抗、または信号干渉 (強い EMI など)。
  • 構成エラー:アービトレーション エラーまたはビット エラーの原因となるボーレートの不一致。
  • ソフトウェア エラー:不正なフレームの繰り返し送信。

たとえば、転送エラーのたびに TEC は 1 ずつインクリメントされます。エラーが急速に蓄積され、TEC が 255 を超えると、ノードはバス オフ状態になります。

このデバイスは、次のいずれかのアクションを実行することで、バス オフ状態から回復できます。

  • ハードウェア リセット:CAN コントローラをリセットして (ソフトウェア リセットまたは電源の再投入によって)、エラー カウンタをクリアします。
  • 回復シーケンスの受信:ノードをアクティブなエラー状態に自動的に復元する 11 のリセッシブ ビット (バス アイドル信号) の 129 の連続シーケンスを検出します。これには、十分なバス アイドル時間 (合計期間 = 129 × 11 ビット) が必要です。

以下に、まず 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();
}