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.

[参考译文] AWRL6432:无任何合理理由停止 CAN 中断

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1587099/awrl6432-can-interrupt-is-stopped-without-any-rational-reason

器件型号: AWRL6432

尊敬的 TI 专家:

我们已确定 CAN 中断停止问题。 当 CAN 控制器模式切换过于频繁时、可能会发生这种 情况、例如、从开始→停止→在 20ms 内开始转换。 整个序列大约每 3 秒重复一次。

我们在 50ms 任务时添加了一些打印信息以获得 MCAN_IR/MCAN_ECR...

有关详细的打印信息、请参阅下图。

temp计数 器为 CANISR 计数器。nu32temp 是 CAN 运行模式设置计数器、setmode 是 CAN 运行设置模式。temp计数 器为 CANISR 计数器。nu32temp 是 CAN 运行模式设置计数器、setmode 是 CAN 运行设置模式。

image.png

出现问题时、打印信息如下所示:

我们还检查 NVIC_ISER 状态、已启用 CAN 重新分配中断。 并且 CAN 收发器和控制器模式是正常的、可以在问题解决后启动。

如果我们在问题发生时清除 CAN 中断、CAN 中断可以恢复(请参阅图片的注释代码)。

我们想知道造成 CAN 干扰的原因。

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

    尊敬的 TI 专家:

    我想补充一些信息。

    1 我们的 mcal 版本是 mcal-03_00_03_02_cal Engineering_Release 、我们使用自己的硬件板。

    2 我添加一些打印信息以在 CAN ISR 的开始和结束时记录 MCAN_IR 值、并发现在清除后 PEA INT 未清除或再次设置。

    50msIntStatus 是、我们 在 50ms 周期任务时获得 MCAN_IR 值。 CanIntprestatus 是我们  在 CAN ISR 开始时获得 MCAN_IR。  CanIntstatus 是指我们  在 CAN ISR 末尾获得 MCAN_IR。

     此致

    永恒  

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

    尊敬的 TI 专家:

    ·

    我发现 can_mcanProcessISR 未处理 PEA INT。 为什么在 can_mcanEnableInterrupts 处启用 PEA INT?

    由于 ISR 不处理 PEA INT、我们是否可以禁用 PEA INT?

     此致

    永恒  

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

    嗨、永恒:

    很抱歉这里的响应出现了延迟。 首先、我建议先更新到最新的 MCAL 版本 3.0.5.0、然后再继续测试、因为这是 MCAL 的最稳定版本。  

    虽然 can_mcanProcessISR 没有专门做任何事情来处理 PEA 中断、但如果在进入 ISR 时触发了该中断、它仍应清除该中断。 但是、如果在 ISR 执行时(特别是在 MCAN_clearIntrStatus 调用之前)发生 PEA 中断、则在 ISR 处理期间不会清除 PEA 中断、这可能会导致一些意外行为。

    如果您不需要 PEA 中断、则可以通过从 Can_Mcan .h 下的 MCAN_INTR_SRC_PROTOCOL_ERR_ARB 中删除该中断 (MCAN_INTR_SRC_PROTOCOL_ERR_ARB) 来将其禁用、因为它旨在作为用户可配置的掩码。

    如果这对您有帮助、或者您有任何其他问题、请告诉我。

    此致、

    Kristien

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

    尊敬的 Kristien:

    感谢您的答复。 我们将考虑升级最新 MCAL 版本。

    此问题有两个问题:

    1 关于说明:“特别是在 MCAN_clearIntrStatus 调用之前、那么在 ISR 处理期间它不会被清除。“我发现这个逻辑令人困惑。

    理论上、如果 PEA 事件在MCAN_clearIntrStatus调用之前发生、则该函数应成功清除中断标志。

    但是,我们的测试结果显示以下行为:我们MCAN_IR在中的两个特定点记录了值Can_mcanProcessISR:

    1. 之后立即执行MCAN_getIntrStatus

    2. 之后立即执行MCAN_clearIntrStatus

    结果:两个实例中都设置了 PEA 中断位。 这表示MCAN_clearIntrStatus即使该标志在函数调用之前存在、也无法清除 PEA 标志。

    2Regarding 的建议:“如果你不需要 PEA 中断,那么你可以通过删除它来禁用它... Can_Mcan……“下的 MCAN_INTR_MASK 删除数据。

    我们无法在 EB 配置工具中找到此特定设置。 目前,EB 工具链生成Can_Cfg.hCan_Pbcfg.c,但它似乎不提供MCAN_INTR_MASK直接配置的选项。

    请您澄清一下:

    1. Can_Mcan.h打算手动修改、还是应该通过工具来处理?

    2. 是否有手册或文档指定了哪些文件/宏可由用户配置、哪些是静态驱动程序文件?

    此致、

    永恒

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

    只需提醒一下

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

    嗨、永恒:

    感谢您的提醒! 根据您的观察、此处提供了一些评论:

    [报价 userid=“565609" url="“ url="~“~/support/sensors-group/sensors/f/sensors-forum/1587099/awrl6432-can-interrupt-is-stopped-without-any-rational-reason/6126321

    1 关于说明:“特别是在 MCAN_clearIntrStatus 调用之前、那么在 ISR 处理期间它不会被清除。“我发现这个逻辑令人困惑。

    理论上、如果 PEA 事件在MCAN_clearIntrStatus调用之前发生、则该函数应成功清除中断标志。

    [/报价]

    CAN ISR 当前在 ISR 启动时捕获或快照 IR 寄存器、然后根据该快照、我们在使用同一快照清除 IR 寄存器之前处理任何挂起的中断。 但是、由于在 ISR 处理期间未完全禁用中断、因此如果发生更多的中断事件(这些事件在开始时未被一次性快照捕获)、实际的 IR 寄存器仍可能发生变化。 因此、我们可能会错过发生的中断。 通常、这应该会导致 ISR 重新触发、但也许 NVIC 未正确通知重新触发 ISR。

    [报价 userid=“565609" url="“ url="~“~/support/sensors-group/sensors/f/sensors-forum/1587099/awrl6432-can-interrupt-is-stopped-without-any-rational-reason/6126321

    但是,我们的测试结果显示以下行为:我们MCAN_IR在中的两个特定点记录了值Can_mcanProcessISR:

    1. 之后立即执行MCAN_getIntrStatus

    2. 之后立即执行MCAN_clearIntrStatus

    结果:两个实例中都设置了 PEA 中断位。 这表示MCAN_clearIntrStatus即使该标志在函数调用之前存在、也无法清除 PEA 标志。

    [/报价]

    有趣的是、即使在执行 MCAN_clearIntrStatus 后、您是否也通过 CCS 的寄存器视图确认 PEA 位仍然被设置了? 您是否也在 MCAN_clearIntrStatus 中进行 HW_WR_REG32 调用后立即进行检查? 在清除之前、IntrStatus 变量是否与 IR 寄存器本身的状态匹配? 我觉得奇怪的是,如果在 IR 变量中也设置了 intra.pea 位,它将不会被清除。

    Can_Mcan.h旨在手动修改、还是应该通过工具来处理?

      应手动修改 MCAN_LINE_0_INTR_MASK 和 MCAN_LINE_1_INTR_MASK、可在 mcal/can/include/include.h 下找到 Can_Mcan

    是否有手册或文档指定了哪些文件/宏是用户可配置的、哪些是静态驱动程序文件?

    我认为没有任何文档指定了用户可配置的文件/宏、但我已经邀请了另一位 MCAL 专家进一步发表评论。

    说到这一点、由于节假日、我将在下周下班前、所以我已经邀请了另一位 MCAL 专家来提供帮助。

    此致、

    Kristien

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

    尊敬的 Kristien:

    对于您的问题、

    “即使在执行 MCAN_clearIntrStatus 后、您是否仍然通过 CCS 的寄存器视图确认 PEA 位已设置? 您是否也在 MCAN_clearIntrStatus 中进行 HW_WR_REG32 调用后立即进行检查? 在清除之前、IntrStatus 变量是否与 IR 寄存器本身的状态匹配? 我觉得奇怪的是,如果在变量中也设置了它, IR . pea 位就不会被清除。“

    我不在 CCS 上检查 PEA 位、因为该问题对实时和 偶尔的事件很敏感。 南 很难在 CCS 上检查寄存器值。

    在 MCAN_clearIntrStatus 之后、我在多个 if-else 逻辑(没有其他代码执行)之后检查 IR 值。

     在 MCAN_clearIntrStatus 之前和之后、 IntrStatus 为 0x8000000(仅设置 PEA 位)。 因此、if-else 内的这些代码将不会执行。 这就是我认为在 MCAN_clearIntrStatus 之后立即进行检查的原因。 但是、在  MCAN_clearIntrStatus 中进行 HW_WR_REG32 调用后我不会立即检查 IR。 昨晚我挂起测试以获取 MCAN_clearIntrStatus 中的 IR 值。 我获得相同的结果、即在  HW_WR_REG32 调用之后、IR 值始终为 0x800000。

    我更倾向于怀疑硬件在清除后的几个 CPU 周期内重新将 PEA 位置为有效、而不是清除操作失败。

    这种立即重新置为有效可能会导致 NVIC 感知到中断从未成功清除、从而使中断机制停止。

    您认为这是可能的吗?

    此致、

    永恒

     

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

    请~提醒  

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

    请~提醒  

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

    需要检查过程是否有任何更新

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

    尊敬的 TI 专家:

    现在已经将近一个月了、再也有任何进程了。

    此外、我们想知道禁用 PEA INT 后是否有任何影响?

    此致、

    永恒