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.

[参考译文] TM4C123BH6PM:如何取消由 ACK 错误重新传输的 CANMessag 对象?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1003964/tm4c123bh6pm-how-to-cancel-canmessag-object-which-is-re-transmitted-by-ack-error

器件型号:TM4C123BH6PM

大家好、

 

如何取消由 ACK 错误重新传输的 CANMessag 对象?

客户希望取消重新传输 CANMessag 对象,并使用 CANStatusGet (CAN0_BASE、CAN_STS_TXREQUEST)获得的 Ch 由 CANMessageClear ()试用。 但他们无法清除信道的请求

 

谢谢、此致、

Kuerbis

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

    一旦消息实际处于发送过程中,您必须调用 CANDisable()、CANMessageClear (),然后调用 CANEnable()。

            CANDisable(CAN0_BASE);
            CANMessageClear(CAN0_BASE,1);
            CANEnable(CAN0_BASE);
    

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

    尊敬的 Bob:

     

    客户尝试了您提到的流程。 但该通道的请求由 CANStatusGet (CAN0_BASE、CAN_STS_TXREQUEST)获得。

    他们实际上希望清除此请求。 是否不会被消息清除为 您的建议?

     

    谢谢、此致、

    Kuerbis

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

    抱歉、将 CAN INIT 位置位(由 CANDisable 完成)将清除错误计数器、但不接收 ACK 位不视为传输错误。 我已经验证的将停止重新传输的方法是在 CANCTL 中设置 TEST 位、然后在 CANTST 中设置 LBACK (环回)位。

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

    尊敬的 Bob:

     

    我不确定下面的原始问题的解决方案是什么。

    如何取消由 ACK 错误重新传输的 CANMessag 对象?

    谢谢、此致、

    Kuerbis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="96819" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1003964/tm4c123bh6pm-how-to-cancel-canmessag-object-which-is-re-transmitted-by-ack-error/3738464 #3738464"]在 CANCTL 中设置测试位,然后设置 CANTST[/QUERT]中的 LBACK (环回)位。

    在回送模式中、不需要 ACK 位。 CAN 帧将在环回模式下传输一次、然后停止。 当 CAN 模块在没有 ACK 位的情况下重新发送帧时进入回送模式将导致重新发送停止。

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

    尊敬的 Bob:

     

    客户询问以下问题。

     

    Q1在用户应用中"设置测试模式、然后在测试模式下发送单个回送至通信停止"是否是一种好方法? 客户觉得这不是一种正常的停止方式。

     

    Q2这是 TI 在通信失败时调用消息的官方方式吗?"

     

    另一方面、客户通过执行 CANMessageSet 并在执行 CANMessageClear 后覆盖消息来验证所需的行为(通信已停止)是否满足、即使未清除获取 CANStatusGet (CAN0_BASE、CAN_STS_TXREQUEST)的通道请求也是如此。

    Q3如果这种方法可以、客户希望使用它、是否有问题?

     

    谢谢、此致、

    Kuerbis

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

    您好、Kuerbis、

     Bob 已从公司退休。 Bob 是在我们尝试学习该模块时对 CAN 模块最了解的人。  

     在我看来、如果总线上的任何节点没有应答、发送器将重新发送。 请访问此链接 https://www.kvaser.com/can-protocol-tutorial/。 这是协议的一部分。 您应该研究为什么没有节点回复 ACK。  

     Bob 提供了一种使用环回测试的方法来取消重传、即使每个协议正确生成了重传。 没有 TI 官方的方式来处理这样的情况。 在我看来、硬件正在做它应该做的事情-在没有收到 ACK 时重新传输。 您的应用程序需要围绕所述协议工作。  

     如果您找到另一种解决 方案、即"执行 CANMessageSet 并在执行 CANMessageClear 后覆盖消息"、并且它适合您、并且您认为它比 Bob 的解决方案更好、更强大、请继续。 我仍然认为您应该研究为什么没有节点被确认导致发送器无限期重新传输。  

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

    您好、Charles、

     

    感谢您代表 Bob 作出回复。

    我将与客户沟通,了解该方法,并与您联系。

     

    谢谢、此致、

    Kuerbis

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

    您好、Charles、

     

    Bob 解释说、将 CAN 初始位(由 CANDisable 完成)设置为 yes 将清除错误计数器、但不接收 ACK 位不视为传输错误。

    请您详细解释一下吗?

    我不确定为什么 CANDisable 和 CANMessageClear 无法停止重新传输? 它没有收到 ACK 位?

     

    这是客户问题。

    6.2.5.14 CANMessageClear 中的以下说明是否意味着仅当您在开始发送之前取消它时才有效,而不是对您发送过一次的消息有效?

    Tivaware 文档: www.ti.com/.../spmu298e.pdf

     

    ----------------------------------------

    描述:

    此函数可释放指定的报文对象的使用权限。 一次

    消息对象已被“清除”,不再自动发送或接收消息,也不会产生中断。

    ------------------------

     

    谢谢、此致、

    Kuerbis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="85506" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1003964/tm4c123bh6pm-how-to-cancel-canmessag-object-which-is-re-transmitted-by-ack-error/3792788 #3792788"]

    Bob 解释说、将 CAN 初始位(由 CANDisable 完成)设置为 yes 将清除错误计数器、但不接收 ACK 位不视为传输错误。

    请您详细解释一下吗?

    [/报价]

    发送器尝试发送某些数据、但没有接收器应答。 发生这种情况时、发送器会尝试再次重新发送。 这是根据 CAN 协议进行的。 重新传输不是因为发送错误。 正如我之前提到的、您应该研究为什么没有接收者回复。 来思考一下。 如果邮件员试图亲自送达您一封信、而您不是在家里、邮件员将会一次又一次地回来送达。 邮件员的工作没有什么问题。 他只是遵循协议。 与 CAN 协议的行为相同、如果任何接收器没有应答、发送器将重新发送。   

    [引用 userid="85506" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1003964/tm4c123bh6pm-how-to-cancel-canmessag-object-which-is-re-transmitted-by-ack-error/3792788 #3792788"]

    我不确定为什么 CANDisable 和 CANMessageClear 无法停止重新传输? 它没有收到 ACK 位?

    [/报价]

    我认为这是设计上的。 虽然调用 CANMessageClear(),但它只 会使消息对象无效。 但是、在报文对象变为无效之前、报文对象已经被加载到 CAN 内核中进行处理。 一旦它进入内核、它就不会查看存储在 RAM 中的消息对象。 换言之、内核不知道当前内核中用于处理的消息对象在 RAM 中被标记为无效、除非 RAM 中的消息对象再次被重新加载到内核中。 这是我认为发生的情况、但我不确定。 再说一次、它就是它的样子。 您正在试图击败本来是正常的正确行为。 我们只能提出一种变通办法来满足您的定制要求。   

     您的示例中是否只有一个消息对象设置? 也许、您只有一个消息对象、或者正在重新传输的消息对象是最高优先级的消息。 在这种情况下、CAN 内核不会切换到另一个消息对象。

     您为什么不尝试实验? 设置将导致重发送到较低优先级的消息对象。 例如、为消息对象5设置。 当您看到报文对象5发生重发送并且想要禁用它时、您将调用 CANMessageClear 作为报文对象5、并且还会启动另一个优先级更高的报文对象、如报文对象1。 我想知道这是否会强制 CAN 内核先切换到更高优先级的报文对象1。 消息对象1完成后、它将意识到消息对象5无效、因为您为其调用  CANMessageClear 。

     另一个建议是、如果您仍然发现重新传输无法停止、只需重置 CAN 模块并重新启动。