This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0G3507:MCAN 复位导致 MCU 复位

Guru**** 2392905 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1511635/mspm0g3507-mcan-reset-cause-mcu-reset

器件型号:MSPM0G3507

工具/软件:

您好、

当 MCAN 处于 Bus_Off 状态时、我尝试重新启动 MCAN 模块。

我遵循了 SLAAET4中的示例(MSPM0 MCU 上的 MCAN (CAN FD)模块入门)。

下面是我的代码

 

DL_MCAN_getProtocolStatus(MCAN0_INST, &ProS);
if(Pros.busOffStatus)
{
    DL_MCAN_reset(MCAN0_INST);
    delay_cycles(16);
    DL_MCAN_disablePower(MCAN0_INST);
    delay_cycles(32);
    DL_MCAN_enablePower(MCAN0_INST);
    delay_cycles(4000);
    SYSCFG_DL_MCAN0_init();
}

首先、重新启动 MCAN 始终成功、不会导致 MCU 复位。 但是、经过一段时间(可能需要十分钟、甚至一小时)后、MCU 会复位。

我尝试延长延迟周期、但仍然无法解决问题。

我不知道重新启动 MCAN 会导致 MCU 复位的原因。 有人能帮我吗?

此致、

Andy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    需要确认复位原因。

    您可以在应用程序代码开始时读取该寄存器以获取复位原因。

    MSPM0复位后、可以停止 M0内核并读取寄存器。

    此外、MCAN 演示代码中还有 NMI 和硬故障处理程序、您可以尝试在这两个 int 处理程序中添加断点。

    复位原因寄存器位于此处:

    https://www.ti.com/lit/ug/slau846b/slau846b.pdf

    2.6.36 RSTCAUSE (偏移= 1220h)[复位= 00000000h]

    此外、您可以尝试观看这个最新的 CAN 演示: 一些总线被修复。

    e2e.ti.com/.../0385.mcan_5F00_application_5F00_LP_5F00_MSPM0G3507_5F00_nortos_5F00_ticlang.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我检查我的复位原因、它会显示0x0000000E、其中 TRM 中未提及

    此致、

    Andy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我检查我的重置原因、它显示0x0000000E、其中 TRM
    中没有提及

    我需要在内部确认。

    同时、我这边有两个提示:

    1.尝试新的 mcan 演示刚刚发送给你。

    2.尝试从这些寄存器中捕捉系统复位时的 MCAN 模块错误(请勿初始化 mcan、首先读取寄存器)

    7050h MCAN_IR MCAN 中断寄存器

    7830h RIS 原始中断状态 CPU_INT

    此外、根据2、可以尝试打开 MCAN 错误中断并将其添加到 mcan_IRQ 处理程序中、然后尝试查看是否触发了中断。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现在无法确认0x0E、但您能否帮助确认这是否是 WWDT0复位原因?

    是否将 WWDT 添加到项目中?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否将 WWDT 添加到您的项目中

    是的。 我将删除它、稍后提供反馈。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、WWDT 是 MCU 复位的原因。  

    但是、为什么重置 MCAN 会导致 NMI 或硬故障处理程序?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1.请尝试删除 WWDT 并帮助确认是否会触发0x0E 复位原因。

    复位 MCAN 仅在线程模式下运行、这不会影响 MCU 中断、这也与应用程序代码有关、MCAN 复位是否会影响复位 WWDT 计数器。

    此外、您还可以在 SYSCTL 中确认 NMI IIDX 寄存器以确认详细信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    移除 WWDT 后、不会触发0x0E 复位原因。

    此外、您还可以确认 SYSCTL 中的 NMI IIDX 寄存器以确认详细信息。

    当它卡在处理程序处时、NMI IIDX 寄存器仍然没有发生。

    此外、我发现如果 MCU 复位、CCS 中的断点将不会 有效。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请将这两个函数添加到 main.c 中

    // Debug
    void NMI_Handler(void) {
        __asm("NOP");
        __BKPT(0);
    }
    // Debug
    void HardFault_Handler(void) {
        __asm("NOP");
        __BKPT(0);
    }

    当它卡在处理程序处时、NMI IIDX 寄存器仍然没有任何反应。

    可能是硬故障处理程序。

    通常是由无效的 CPU 指令或内存错误引起的。

    另外、请尝试找到 MCAN 复位和 NMI/硬故障之间的关系。

    删除 WWDT 后、不会触发0x0E 复位原因。

    这可能是由 WWDT 导致的、而不是 MCAN 复位。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    可能是硬故障处理程序。

    是的、这是一个严重的故障。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请尝试将优化级别设置为0、以测试是否复位 MCAN 功能导致硬故障。

    此外、请使用 MCAN 复位的反汇编代码来确认哪个指令会导致硬故障。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现消息 RAM 错误可能是导致硬故障的原因。 我可以确认是否有任何寄存器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有 RAM DED 中断、您可以启用该中断

    21.7.89 IMASK (偏移= 7828h)[复位= 00000000h]

    以下示例可帮助您配置 MCAN RAM。

    需要注意的是、自动计算中的 TX 事件 FIFO 长度是错误的、请在 Rx 和 TX 事件 FIFO 之间预留一些空间

    e2e.ti.com/.../2744.mcan_5F00_application_5F00_LP_5F00_MSPM0G3507_5F00_nortos_5F00_ticlang.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我启用 DED 中断、但在进入硬故障中断之前不会触发中断。

    是否存在硬故障的其他原因?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    需要进行检查反汇编、例如指令中使用的无效地址(访问的无效地址)。

    在实时调试或 CAN 通信阶段:

    在调试中使用 GPIO 切换操作来确认 M0 CPU 是否可以到达代码、将检查代码的哪一部分触发硬故障。

    确认导致硬故障的代码区域后、我们可以使用单步调试来检查每行代码。

    或者栈溢出将覆盖 RAM 可用项、这也将导致 CPU 使用无效地址。