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.

[参考译文] AM2632:在 MCAN Busoff 崩溃

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1586747/am2632-crash-at-mcan-busoff

器件型号: AM2632

如果发生 MCAN BUSOFF、则在发送中断中调用以下函数以从 BUSOFF 恢复。

MCAN_setOpMode (baseAddr、MCAN_OPERATION_MODE_NORMAL);

使用了两个罐。 使用 MCAN0 且 baseAddr = 0x52600000 时、从 BusOff 恢复工作、但使用 MCAN3 且 basAddr = 0x52630000、在总线上进行大量数据传输时、固件会崩溃。

这可能是什么原因?
(使用 SDK 10.00.00)

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

    尊敬的 Simon:

    当固件崩溃时、您是否有关于 MCAN3 总线上正在进行哪些数据传输的信息?

    您能否提供有关 CAN 工作参数的详细信息?

    我假设 MCAN0 未连接到与 MCAN3 相同的总线、您能否切换总线并重试测试?

    如果 MCAN3 能够在备用 MCAN0 总线上正确恢复正常运行、那么我们可以假设 MCAN3 总线上发生了导致该问题的某些事件。

    此致、

    Zackary Fleenor

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

    嗨、Zackary

    •发生错误时、许多 SDO 消息大约每 5ms 通过 MCAN3 发送一次、并由另一个总线参与者应答。
    •通信以 500kbaud 运行。 如果连接了另一个波特率错误 (250 kbaud) 的总线参与方、则软件将崩溃(堆栈溢出)。
    •MCAN0 和 MCAN3 已连接。 MCAN0 上进行的通信显著减少。 这里似乎没有问题。 总线不能简单地交换。

    同时、我已经解决了部分问题。 不再在 CAN 中断本身中执行总线恢复。 在中断中只设置一个标志、然后在循环任务中调用总线恢复。 总线恢复也得到延长。 如果在启动之前未重置波特率不正确的外部总线参与器、则允许启动。 但是、如果它已重置、则会发生另一个崩溃。 在本例中、总线如下所示:

    ...

    此致

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

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

    嗨、Simon、

    感谢您提供更多信息和测试结果。

    在理解您上次回复的结尾时、我遇到了一些麻烦。

    您能否重新配置导致此最新崩溃案例的设置和流程?

    此致、

    Zackary Fleenor

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

    您好 Zachary

    在此期间、我取得了进一步的进展。 程序不再崩溃、但在软件以不正确的波特率启动后 CAN (MCAN3) 不会恢复。
    在 CAN 中断中检测到总线错误并通过标志传递。 然后、设置标志后、在循环任务中执行总线恢复。
    此总线恢复序列是否正确? 有没有这方面的例子?
    代码如下:

    IN CAN 中断:

        MCAN_getProtocolStatus(baseAddr, &statusMCan);
        MCAN_getErrCounters(baseAddr, &errCnt); //testscho17
          if (statusMCan.busOffStatus == 1 ||
              statusMCan.errPassive == 1 ||
              errCnt.transErrLogCnt > 127)
        {
            gCanFault[channel] = true;
        }
    


    在循环 任务总线恢复中 (if ([channel]== true):

        HwiP_disable();
    
        /* Disable interrupts */
        MCAN_enableIntr(baseAddr, MCAN_INTR_MASK_ALL, 0U);
        MCAN_enableIntrLine(baseAddr, MCAN_INTR_LINE_NUM_1, 0U);
        MCAN_txBufTransIntrEnable(baseAddr, 1U, 0U);
    
        /* Cancel any pending TX */
        HW_WR_REG32(baseAddr + 0x104U, 0xFFFFFFFFU);
        while (HW_RD_REG32(baseAddr + 0x108U) != 0U) { }
    
        /* Clear pending interrupts */
        uint32_t pending = MCAN_getIntrStatus(baseAddr);
        MCAN_clearIntrStatus(baseAddr, pending);
    
        /* Enter SW_INIT */
        MCAN_setOpMode(baseAddr, MCAN_OPERATION_MODE_SW_INIT);
        while (MCAN_getOpMode(baseAddr) != MCAN_OPERATION_MODE_SW_INIT) { }
    
        /* Wait for bus idle (ACT=0) */
        uint32_t psr;
        uint32_t to = 50000U;
    
        do {
            psr = HW_RD_REG32(baseAddr + MCAN_PSR);
            if (--to == 0) break;
        } while ((psr & MCAN_PSR_ACT_MASK) != 0);
    
        /* Reset */
        MCAN_reset(baseAddr);
    
        /* Full reconfiguration */
        MCAN_init(baseAddr, &initParams);
        MCAN_config(baseAddr, &configParams);
        MCAN_extTSEnableIntr(baseAddr, 0);
        MCAN_extTSCounterConfig(baseAddr, MCAN_TS_PRESCALAR);
        MCAN_setBitTime(baseAddr, &bitTimes);
    
        /* Message RAM must be fully restored */
        MCAN_msgRAMConfig(baseAddr, &msgRAMConfigParams);
    
        /* Correct cache handling */
        CacheP_wbInv((void*)baseAddr, 0x8000, CacheP_TYPE_ALLD);
    
        /* Re-install filters */
        MCAN_addStdMsgIDFilter(baseAddr, 0U, &stdFiltElem0);
    
        /* Start normal operation */
        MCAN_setOpMode(baseAddr, MCAN_OPERATION_MODE_NORMAL);
        while (MCAN_getOpMode(baseAddr) != MCAN_OPERATION_MODE_NORMAL) { }
    
        /* Re-enable interrupts */
        MCAN_enableIntr(baseAddr, MCAN_INTR_MASK_ALL, 1U);
        MCAN_enableIntrLine(baseAddr, MCAN_INTR_LINE_NUM_1, 1U);
        MCAN_txBufTransIntrEnable(baseAddr, 1U, 1U);
    
        HwiP_enable();
    

    谢谢、

    Simon

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

    尊敬的 Simon:

    感谢您提供这些附加详细信息。 本周、我在各种截止日期方面都被淹没了。 我将在周末回顾这一最新信息、并希望下周初做出回应 (11/25/25)。

    此致、

    Zackary Fleenor

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

    嗨、Zackary

    此问题非常紧迫、因为我们需要构建客户版本。
    我也遇到了以下陈述。 使用 SDK 10.00.00 也可以规避此错误吗?

    Warning️ MCU+ SDK 10.00.00 中已知错误
    在 SDK 10.00.00 中、TI 已确认 MCAN 复位/模式更改中存在错误:
    •如果总线关闭中断有效、并且同时发生 OpMode 更改或复位、
    CPU 可能会遇到异常、或者外设可能保持在无效状态。
    •原因:MCAN 需要时间才能完成转换状态。 如果此时它切换回初始化模式、同步将失败。
    TI 认为、此错误已在 SDK 10.01.x 及更高版本中修复。

    TI 内部描述(错误 ID:MCAN-506):
    “在总线关闭→正常模式转换期间、如果中断保持启用状态、MCAN 可能会通过外部中止进行响应。“

    此致  
    Simon

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

    您好 Zachary

    我现在有一个解决方案在 5ms 任务中具有最小恢复功能、仅使用 MCAN_setOpMode (baseAddr、MCAN_OPERATION_MODE_NORMAL)。 现在不再出现该错误。

    此致  

    Simon

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

    您好 Zachary

    问题再次出现。 如果 PCAN 加密狗以不正确的波特率重置、然后设备打开、固件将不再响应并崩溃。

    是否有一个应如何正确完成总线恢复的示例?

    此致

    Simon

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

    您好 Simon、

    让我在内部回顾一下、并返回给您。

    此致、

    Zackary Fleenor

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

    嗨、Simon、

    我随附了关于 CAN 总线恢复的 Bosch MCAN 官方说明:

    BUSOFF 恢复处理

    您也可以参考前面有关相同内容的主题:

    (+)【常见问题解答】TMS320F28P559SJ-Q1:从 CAN 总线关闭中恢复的过程 — C2000 微控制器论坛 — C2000Tm μ︎ 微控制器 — TI E2E 支持论坛

    我建议使用以下链接提供的最新 MCU-PLUS-SDK 进行此测试: SDK-AM263X 软件开发套件 (SDK)| TI.com

    我们很乐意继续帮助您解决这个问题。

    此致、

    Zackary Fleenor