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 消息、是否有办法获得"超时中断&quot?

Guru**** 2539500 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/882690/tms570ls0914-is-there-a-way-to-get-a-timeout-interrupt-if-a-can-message-is-never-received

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

您好!

我在完全由中断驱动的环境中使用 TMS570。  轮询通常是不可接受的。  我想检测 CAN 总线故障、其结果是导致 TMS570 DCAN 控制器不断重新发送最后一条消息。  我知道我可以禁用重新发送、但这也不可取、因为通常您希望它在发生碰撞或其他情况时重新发送。  理想情况是、如果消息在输出缓冲器中停留的时间超过一段时间、就会出现错误中断。  这是可行的吗?

感谢您的任何想法...

烧伤

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

    烧伤、

    您可以考虑在状态变化时生成中断、然后查找 LEC 错误代码以反映 ACK 错误。 然后、如果消息已被重新发送并且未被应答"x"时间、ISR 可以保持这些事件的计数并执行所需的操作。

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

    Hi Sunit、

    我已经针对状态变化和错误启用了通知(使用由 HalCoGen 生成的例程)、但是中断从未出现。  是否有任何关于如何产生此类中断的想法?

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

    Burns、您好!

    HALCoGen 提供了一个基于中断的 CAN 通信示例、其中启用了 CAN 错误标志上的中断。 类似地、您可以在状态发生更改时启用中断。 请注意、此中断将在所有状态变化时生成、包括任何消息正确发送或接收编辑时

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

    您好、Sunil、

    我很抱歉、我不太清楚。  我通过 HalCoGen "notify"例程使中断正常工作。  当消息到达时以及完成时、我会得到中断。  都非常好。  我还启用了状态更改和错误通知。

    我的问题是、当我模拟 CAN 总线故障时。  在这种情况下、我尝试发送的消息未被总线上的另一个节点应答、因此 TMS570 DCAN 一直尝试重新发送。  这适用于某个时间、不会产生错误。  但是,问题是它一直在不停地重复。  在某些时候、我希望它放弃并发出错误信号、这将生成中断。

    总之、中断运行正常。  但是、即使在重试传输的几秒钟(或几分钟)后、DCAN 模块也不会识别错误或状态变化。  我想快速了解 CAN 总线是否出现故障。   

    想法? 谢谢。

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

    Burns、您好!

    我也应该更清楚。 只要发送的 CAN 报文未被应答、就会产生状态改变中断。 这不是 CAN 错误中断的一部分、而是被视为状态变化、并由 CAN 错误和状态寄存器(DCAN ES)中的 LEC (最后一个错误代码= 3)位域反映出来。 请参阅参考手册中的以下内容:

    将为 TX OK、RX OK、WakeUpPnd 或 LEC 位字段的所有更改生成状态更改中断。 SPNU607a 的第24.10.3节对此进行了说明。

    您可以在状态更改 ISR 中实现一个计数器、以跟踪 LEC = 3调用该中断的次数。 这与时间单位不直接相关、但您可以在软件中采取其他操作、而不是允许 CAN 节点永久重新传输未确认的消息。

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

    好的、感谢您重点介绍这一点。  我没有收到状态更改中断、但知道该位后、我可以更好地对其进行调试。  我会告诉您我发现了什么。  我不会将其标记为已解决、直到我了解它为什么不会导致中断。

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

    好的、更多的: 事实证明 LEC 始终处于1:鉴于在我的测试中、我从未成功发送数据来清除它。  但我正在获得总线断开状态更改。  但是、即使在发现总线断开之前我启用了状态变化(和错误)中断、它也不会生成中断。

    该位很有用、我想我可以处理它、但我仍然想知道它为什么不生成中断。

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

    中断可在三个点被选通:

    1. CPU:确保 CPU 对中断请求的响应被启用。 这需要通过从应用程序中调用_enable_interrupt_()函数来完成。
    2. VIM (中断管理器):每个中断请求被映射到一个特定的 VIM 通道。 这需要在 VIM 内启用、并按照 CAN 错误状态中断示例中所述通过 HALCoGen 配置。
    3. 中断源:确保在 DCANx 模块内将特定条件启用为中断条件。

    此致、Sunil

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

    嗯、正如我说过的、除了错误之外、所有中断都正常工作。  据我所知、所有中断都出现在同一中断请求线路上、因此我显然正确设置了 VIM。  除非我需要设置另一个中断请求行并且找不到该中断请求行。  

    正如我说过的、我还调用 了 canEnableErrorNotification 和 canEnableStatusChangeNotification、它们似乎设置了您提到的特定条件(即 CTL 寄存器的位2和位3、SIE 和 EIE。

    我的 HalCoGen 在"Help/Examples"下没有 CAN 错误状态中断的示例。  您能在网上提供一个指向它的指针吗?


     

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

    在 HALCoGen 中、单击"帮助"->"帮助主题"

    在打开的窗口中、按"示例"计时以查找启用了错误状态中断的 CAN 通信示例。

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

    谢谢。  我太字面量了、在帮助中查找"CAN 错误状态中断"。  无论如何、我认为我已经完成了本示例中指定的所有操作、但我会更长时间地使用它。

    感谢你的帮助。

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

    好的、我找到了它。  虽然我知道在 CANInit 之后必须设置中断使能位、但由于我正在调用的各种例程、它是向后发生的。  当我在经过 calilng CanInit 之后设置中断使能位时、我会按预期获得中断。

    非常感谢所有的帮助!