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.

[参考译文] TMS570LS0914:CAN't 清除 DCAN 错误计数器

Guru**** 2694425 points

Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1596419/tms570ls0914-can-t-clear-dcan-error-counters

器件型号: TMS570LS0914
主题中讨论的其他器件: HALCOGEN

我试图清除芯片中的错误计数器、但我没有成功。  我浏览过论坛、但没有得到太多帮助。

在错误中断中、我有以下内容:

  if (notification &(1 << 6)){/*错误太多 (EWarn)*/
    /*
     *通过置位 Init 来清除计数器,等待 ACK
     *然后将 Init 置为无效。
     */
    节点->CTL |= 1;
    while ((node->CTL & 1)!= 1)
      ;
    节点->CTL &=~1;
  }

但是、后续中断仍然设置了 EWarn 位、最终进入被动模式(计数器仍然不会复位)。  我在做什么?

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

    您好 Corey、

    根据 TMS570 技术参考手册、 错误计数器只能在总线关闭恢复序列结束时自动复位 。 该文档具体说明:

    “一旦应用清除 Init 位(或由于自动总线开启功能)、器件将等待 129 次出现总线空闲(等于 129 * 11 个连续隐性位)、然后再恢复正常运行。 不能通过设置或复位 Init 位来缩短总线关闭恢复序列。 在总线关闭恢复序列结束时、错误计数器会复位。

    了解错误状态

    • 错误警告 (EWarn) :TEC 或 REC 达到 96 时触发
    • 错误被动 :当 TEC 或 REC 超过 127 时触发
    • 总线关闭 :TEC 超过 255 时触发

    您应该怎么做

    通过正常 CAN 操作、错误计数器自然会减少:

    1. 成功传输消息 :TEC 减小
    2. 成功接收到消息 :REC 减小
    3. 修复根本原因 :计数器递增是因为发生了实际的 CAN 总线错误(位错误,填充错误,ACK 错误等)

    建议的操作

    1. 调查根本原因 的 CAN 错误:

      • 检查您的 CAN 总线终端(每端应为 120Ω)
      • 验证位时序配置是否与其他节点匹配
      • 检查 CAN 总线上是否有噪音
      • 确保正确的接地连接
      • 验证 CAN 收发器是否正常工作
    2. 监控错误和状态寄存器 从而确定发生了什么类型的错误

    3. 总线关闭状态所需的时间 、您可以通过以下方式恢复:

      • 手动清除 Init 位以启动恢复序列
      • 或在 CAN 控制寄存器中启用自动总线开启 (ABO) 功能
    4. 错误修复后 、计数器会随着传输/接收的成功而自然减少

    --
    此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据 TMS570 技术参考手册、 错误计数器只能在总线关闭恢复序列结束时自动复位 [/报价]

    我要指出的是、这不是 TRM 所说的、它只提供这一选项。  我明白了。

    通过正常的 CAN 操作、错误计数器自然会减少

    AFAICT、TRM 从未说过这一点。  这将是有用的信息。

    我从 CAN 架构中了解到、这确实是应该的方法。

    我是故意造成错误的、我正在测试出现错误时会发生什么。

    HALCoGen 生成的中断代码在成功完成 CAN 总线操作时调用 CAN 错误通知、因为 EWarn 是由于错误过多而被设置的、并且它没有调用 canMessageNotification ()。  我当时正试图关闭它,但不可能。  因此,我必须处理 canErrorNotification() 基本上与 canMessageNotification() 相同。  不同的是,HALCoGen 生成的代码是,它屏蔽了我在调用 canErrorNotification () 时需要的位,以知道它是否实际完成。  我必须在这里添加自己的用户代码才能解决这个问题。

    TRM 没有提供有关如何处理错误情况的有用指导。

    「我知道你在想什么。」

    [/quote]