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.

[参考译文] TMS320F28335 -总线关闭后手动 CAN 总线恢复

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/586898/tms320f28335---manual-can-bus-recovery-after-bus-off

大家好、

请多多包涵、因为我不是母语英语的人、以下帖子可能不是最容易阅读的帖子。

我目前正在根据我们的一个项目中的自动总线恢复(CANMC.ABO)对 CAN 总线关闭恢复实施进行全面检查。

由于某些技术规格发生了变化、因此需要特定的总线恢复时序、因此也需要重新启动 CAN 传输的时序。 这使得无法使用自动配置。 基本上、恢复时的自动总线速度太快。

我想坚持使用 CANMC.ABO 实现、但到目前为止、我找不到方法向应用软件指示发生了自动总线打开。 因此、我开始检查手动总线恢复。

根据此控制器的"SPRUEU1"、我对总线关闭检测的理解是、在关闭总线关闭通过各种错误级别(EW 和 EP)时、CANTEC 将增大 在最后达到 CANTEC 计数器值256之前、触发总线关闭、并使用 CANES.BO 和 CANMC.CCR 为相应的 CAN 总线标记此状态。

一旦达到总线关闭状态、CANREC 计数器将在 CAN 总线再次正常时提供相关信息。 遗憾  的是、我发现"SPRUEU1"中的描述对什么情况会导致 CANREC 计数器的含义发生变化非常模糊。 什么被视为“总线关闭状态”? CANES.BO 是否需要设置为1?CANMC.CCR 位是否需要设置为1?是否需要将 CANREC 的功能更改为对隐性位进行计数?

根据我的理解、一旦 CANREC 计数器达到128 、总线处于关闭状态、总线就可以被视为正常、而通过将 CANMC.CCR 设置为0、手动总线开启就可以被视为安全。

到目前为止、在我的实施和测试过程中、虽然连续施加总线关闭条件(CAN 高电平和 CAN 低电平短接)、但 CANES.BO 首先设置为1、 CANMC.CCR 设置为1、 但不知怎么说 、CANES.BO 在不对任何手动总线执行任何操作的情况下被复位为状态0 (并且 CANMC.ABO = 0)。 到目前为止、我还没有找到写入 CANES 寄存器的任何代码行。

当总线关闭条件消失 (CAN 高电平和 CAN 低电平不再短接)时、我从未发现 CANREC 计数器被设置为不同的0值。 因此、我不知道何时执行手动总线开启和重新启动发送。

我对识别总线关闭状态以及识别总线打开状态的机制的理解是否正确? 有什么想法可以解释为什么 canes.BO 会更改其值或如何获取信息以启动手动总线恢复?

感谢您阅读这篇相当长的文章。 我会尽量准确地描述我的问题。

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

    卡洛、

    CCR 位是节点进入总线关闭状态的可靠指示器。 如果该位被置位、则节点处于脱离总线状态。 一旦达到该状态、CANREC 实际上会改变其功能(将11位隐性时间计数到128)。 正确的做法是、一旦对其进行监控、清除 CCR 并脱离总线是安全的。 是否确实在总线关闭时将 BO 位设置为1、但会在不向 CANES 寄存器写入代码的情况下自动清除 BO 位?

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

    您好、Haresh、

    感谢你的答复。  

    据我所知、我已禁用应用软件中对 CANES 寄存器的每次写入访问。 当总线关闭发生时、我确实看到 EP 和 EW 标志置1、这些标志也不会复位。 但是、对于 BO 标志、这是不同的。

    关于 CCR 位:

    我已经检查过、一旦总线关闭发生、匹配总线的 CCR 位就会连续置位。 但是、当总线关闭状态被移除时、CANREC 计数器不会改变其值、尽管 CCR 位仍然被永久置位。 同一总线上的其他节点也会恢复正常运行。 因此、我假设总线实际上是正常的。

    在对我的总线执行 CCR 位手动复位时、尽管我的总线的 CANREC 当前处于状态(仍然为0)、我的节点 也会恢复并正常运行。 遗憾的是、在这种设置下、我无法匹配总线恢复所需的时序、因为我缺少了总线实际更改为工作状态时的参考点。

    对我来说、最好的情况仍然是使用原始 ABO 位进行总线恢复。 由于位 ABO、CAN 控制器何时执行了总线、是否有任何指示? 在这种情况下、我可以根据此类指示调整应用 CAN 发送的恢复、以匹配所需的时序。

    此致。

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

    卡洛、

               您的网络中有多少个节点? 当 F28335脱离总线时、网络上的其他节点会做什么?

     

    您会说"当总线关闭条件被移除时、CANREC 计数器不会改变其值、尽管 CCR 位仍然被永久置位。" 当总线关闭条件被移除时、CCR 应该被自动清除(如果 ABO=1)。 我也不明白您所说的"CANREC 计数器不会改变其值"。 请阅读以下模块规格的摘录:

     

    在„BUS OFF (总线关闭)”状态后,发送错误计数器未定义,而接收错误计数器改变了其功能。 在达到„BUS OFF (总线关闭)”状态后,接收错误计数器将被清除。 然后、它将在总线上每11个连续隐性位后递增。 这11位对应于总线上两个电报之间的间隔。 如果计数器达到计数128、则如果启用此功能(主控制寄存器(MCR)置位的自动总线打开位(ABO))、模块将自动返回到状态„BUS ON (总线打开)。) 所有内部标志被复位并且错误计数器被清零

     

    根据最后一条语句、在退出总线关闭条件时、BO 位清零、CANREC 变为0。

     

    关于您的最后一个问题"由于位 ABO、CAN 控制器是否有任何指示? "、您应该会在退出脱离总线时看到 CCR 位被清除。 您可以轮询 CCR 位以确定节点退出总线关闭的时间。

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

    您好、Haresh、

    我希望您能有一个愉快的周末。

    ABO 位的当前配置为 ABO = 0、因此"手动"总线开启。  

    我所说的"当总线关闭状态被移除时、CANREC 计数器不会改变其值、尽管 CCR 位仍然被永久置位。" 也就是说、即使 CCR 位仍然有效(在总线关闭后)、  ABO 位也会设置为0 、总线关闭条件已删除 CANREC 计数器也不会递增。 它始终保持 在 CANREC =  0 (未完成手动总线接通)。

    正如我理解您的第一个回复"如果设置了该位、则节点处于脱离总线状态。 一旦达到该状态、CANREC 实际上会更改其功能(将11位隐性时间计数到128)。" 我希望看到一个递增的 CANREC 计数器。 以了解上述配置。

    关于我的第二个问题、"由于位 ABO、CAN 控制器何时执行了总线?" 就我测试过的情况而言、当 ABO 位设置为1时、在总线关闭期间 CCR 位不活动。 在 "sprueu1"中、CCR 的说明状态为:"如果 ABO 位未置位、CCR 位也将在总线关闭条件下置位。" 因此、在总线关闭/总线打开恢复期间、当 ABO = 1时、CCR 位不会出现任何变化。

    这就是为什么我问,由于 ABO = 1配置,控制器的状态变化是否有任何指示。

    要回答您的问题:“您的网络中有多少个节点? 当 F28335脱离总线时,网络上的其它节点会做什么?

    对于我的测试(这只是基准测试设置)、CAN 由三个不同的节点组成:我的测试系统、用于监控消息的矢量 CAN 案例以及基于 SJA1000的第三个 CAN 节点。  

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

    我所说的"当总线关闭状态被移除时、CANREC 计数器不会改变其值、尽管 CCR 位仍然被永久置位。" 也就是说、即使 CCR 位仍然有效(在总线关闭后)、 ABO 位也会设置为0 、总线关闭条件已删除 CANREC 计数器也不会递增。 它始终保持 在 CANREC = 0 (未完成手动总线接通)。

     

    answer-->总线关闭条件消失后、CANREC 为什么会递增? 您是否期望在128时看到它? 我怀疑在计数到128之后它被清零、但节点本身不参与任何通信、直到 CCR 被清零。

     

    正如我理解您的第一个回复"如果设置了该位、则节点处于脱离总线状态。 一旦达到该状态、CANREC 实际上会更改其功能(将11位隐性时间计数到128)。" 我希望看到一个递增的 CANREC 计数器。 以了解上述配置。

     

    回答-->请澄清"递增"。 递增和随后的清除以肉眼无法观察到的速度发生。 您是否尝试对寄存器进行快照并填充存储器缓冲器?

     

    也许我们已经达到了一个会议呼叫可能更好的阶段。 我觉得我对您的担忧理解不好。

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

    卡洛、

    我写了一个测试用例来验证这一点、并且能够看到 CANREC 计数器正确递增。 我在缓冲器中填充了 CANREC 值。 在 CANREC 计数128个发生事件后、它被复位为"0"。 CCR 位仍然保持为1。 节点在清零时脱离总线关闭状态。

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