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.

[参考译文] TM4C129EKCPDT:CAN 消息传输控制

Guru**** 2526700 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1110582/tm4c129ekcpdt-can-message-transmission-control

器件型号:TM4C129EKCPDT

您好!

我不熟悉 CAN 总线应用。 我对 CAN 总线通信可靠性有疑问。

节点 A 发送消息时、总线上的任何节点都将确认消息是否正确接收。 这发生在硬件级别。 这意味着、如果发送方(A)向节点 B 发送消息、并且希望确保节点 B 已接收到消息、则不能依赖确认、因为任何其他节点都将这样做。

这是否意味着、如果我们要确保两个节点之间的消息传输成功、则必须建立更高级别的确认?  或者更低级的 CAN 错误检测机制已经足够了?

换句话说、如果节点 A 希望向节点 B 发送消息、即使节点 B 在总线上、节点 C 是否可以接收消息、但没有 B 接收到消息?

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

    您好、Tianlei、

    我不确定我是否同意您对节点 A 发送的消息所发生的情况的描述

    每个 CAN 消息都包含 CAN ID、这就是您向特定设备发送消息的方式。 总线上的每个 CAN 器件都应具有其唯一的 CAN ID。 如果您重新使用的同一 CAN ID 会引起很多问题、而不是 CAN 接口的设计方式。

    因此、您无需任何更高级别的确认、只需确保您的每个 CAN 器件都具有唯一的 ID 即可。

    此致、

    Ralph Jacobi

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

    您好、Ralph、

    我有点困惑。 您能否澄清以下内容?

    1.是否允许将 CAN 消息发送到多个节点?

    2.如果是、多个 CAN 节点将需要为该 CAN ID 设置相同的过滤器

    3.当节点 A 发送 CAN 消息时,如果未检测到错误,这些 CAN 节点将全部确认。

    4.其他 CAN 节点(没有该过滤器)是否也会确认消息,因为消息已成功接收(物理)但不感兴趣(逻辑上)?

    此致、

    天列

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="52689" URL"~μ C/support/microcontrollers/arm-based microcontrollers-group/arm -based microcontrollers/f/arm based microcontrollers-forum/1110582/tm4c129ekcpdt-cCAN-message-transmission control"]当节点 A 发送消息时、总线上的任何节点都会确认消息是否正确接收。 这发生在硬件级别。 这意味着,如果发件人(A)向节点 B 发送消息,并希望确保节点 B 已收到消息,则它不能依赖确认,因为任何其他节点都将这样做。

    这就是 CAN 协议的工作方式。 CAN 中的消息未确认。 CAN 假定所有消息都符合定义的标准、如果它们不符合定义的标准、则网络中的所有节点都将做出相应的响应。 CAN 网络中的所有节点同时接收相同的消息、这意味着每个节点都会侦听网络总线、并将接收每条传输的消息。消息过滤器保证接收节点只对与其相关的数据做出反应。  

    [引用 userid="52689" URL"~/support/microcontrollers/arm-based microcontrollers-group/arm-based microcontrollers/f/arm-based microcontrollers-forum/1110582/tm4c129ekcpdt-cCAN-message-transmission control "]换句话说、如果节点 A 想要向节点 B 发送消息、即使不能在节点 B 上接收消息、也不能在该节点上接收消息[引用?

    节点 C 应使用可接受的筛选器筛选出 仅与节点 C 的预期函数相关的消息。 如果节点 B 应答、则表明节点 B 接收到该消息。 如果节点 B 未应答、则表示总线上存在错误。 您的系统应用程序会将节点 C 编程为不接收特定消息。 CAN 节点不关心消息的发送者。 CAN 节点仅在消息针对它们时才会考虑。 汽车中的 CAN 总线。 有些节点只会响应一条消息,告诉它们关闭窗口。 有些节点只会响应一条消息、指示它们关闭灯。 当广播消息(无论由谁发送)以关闭窗口时、总线上被编程为响应此消息的所有节点都将关闭窗口。 如果在总线上广播一条消息以关闭灯、这些节点将不会对其做出响应。  

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

    您好、Charles、

    您的意思是、如果接收器未被编程为接收消息、它将不会确认此消息(通过放置一个显性位)、即、发送器可以依赖确认来决定是否已成功接收消息 (如果它知道总线上只有一个接收器对这个特定的消息感兴趣)。

    这是我要澄清的问题-消息过滤器是否确定消息是否会被确认?

    谢谢

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

    您好!

     我认为这个网站对 CAN 协议有很好的概述。 https://www.kvaser.com/can-protocol-tutorial/。 我不是 CAN 专家、但我认为您可以对节点 B 进行编程、以将消息发送回节点 A、指示它已从节点 A 接收到消息、作为确认从节点 A 接收到消息的一种方式。您需要进行设计 您的系统级协议。

    确认检查

    总线上正确接收消息的所有节点(无论它们是否对其内容感兴趣)都应在消息中的所谓确认时隙中发送显性级别。 发送器将在此处发送隐性电平。 如果发送器无法检测到 ACK 槽中的显性级别,则会发出确认错误信号。

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

    您好、Charles、

    感谢您的回复。 我在确认部分做了一些实验。 你是对的。 即使消息未通过筛选器、节点也将始终确认消息。

    这提出了一个有趣的问题:是否确实需要更高级别的消息确认? 如果消息被确认而不被错误消息中断、则表示所有其他节点都从线路中看到了正确的消息。 总线上的节点无法收到此消息的唯一机会是其内部问题。 我们真的需要关注这一点吗?

    希望在论坛中有经验的人可以回答这个问题。

    此致、

    天列

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

    尊敬的 Tianle:

     您认为 CAN 中的消息未得到确认是正确的、因为这会不必要地增加总线流量。 我的意思是确认、与确认不同。 所有节点都将确认是否在线路上正确接收到消息、以及节点内是否没有故障。 广播消息的目标收件人不会回复(或确认)它已收到消息。 我想这就是你一开始所要问的。 如果节点 B (目标收件人)不 在总线上应答、而是节点 C (不是目标收件人)、您会问什么。 在这种情况下、发送器不知道是谁真正接收到了消息。 数据链路层协议不处理此问题。 我认为、需要处理这一问题的级别更高、例如基于主从配置的通信模型。 我们不是系统级配置和应用方面的专家。 我们的知识更受 MCU 功能的限制。

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

    谢谢 Charles。 这有助于澄清我的问题。