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:丢失 CAN 按摩物体

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/994417/tm4c123bh6pm-lost-can-massage-object

器件型号:TM4C123BH6PM
主题中讨论的其他器件:TM4C123

你(们)好

 

客户使用 CAN 模块时出现以下问题。

它们通过 Tivaware CANMessageSet 设置三个对象(30、31、32)。 但仅传输按摩对象32。

但是、如果它们通过调试或设置等待周期来保留 CANMessageSet 执行之间的间隔、则所有三个按摩对象都将正确发送。

 

您对此问题有什么建议吗?

 

这是代码。

(第2条

#define TXOBJECT_ST            30

#define TXOBJECT_END          32

 

uint8_t                             g_ui8CAN0TXMsgData[3][8];

tCANMsgObject    g_sCAN0TxMessage[3];

 

int main (空)

  uint32_t MNO;

  uint32_t count、s_count;

  uint32_t status;

 

  //按摩初始化

  G_sCAN0TxMessage[0].ui32MsgIDMask = 0;

  G_sCAN0TxMessage[0]。pui8MsgData =(uint8_t *)(&g_ui8CAN0TXMsgData[0]);

  G_sCAN0TxMessage[1].ui32MsgIDMask = 0;

  G_sCAN0TxMessage[1].pui8MsgData =(uint8_t *)(&g_ui8CAN0TXMsgData[1][0]);

  G_sCAN0TxMessage[2]。ui32MsgIDMask = 0;

  G_sCAN0TxMessage[2]。pui8MsgData =(uint8_t *)(&g_ui8CAN0TXMsgData[2][0]);

 

  //数据 TX 过程

  for (count=0;count<10;count++){

      for (s_count=TXOBJECT_ST;s_count <= TXOBJECT_END;s_count++){

          MNO = s_count - TXOBJECT_ST;

          G_ui8CAN0TXMsgData[MO][0]= count*3 + MNO;

          G_ui8CAN0TXMsgData[MO][1]= count*3 + MNO;

          G_ui8CAN0TXMsgData[MO][2]= count*3 + MNO;

          G_ui8CAN0TXMsgData[MO][3]= count*3 + MNO;

          G_ui8CAN0TXMsgData[MO][4]=计数*3 + MNO;

          G_ui8CAN0TXMsgData[MO][5]= count*3 + MNO;

          G_ui8CAN0TXMsgData[MO][6]= count*3 + MNO;

          G_ui8CAN0TXMsgData[MO][7]= count*3 + MNO;

          G_sCAN0TxMessage[MNO].ui32MsgID = 0x10000000 + count*3 + MNO;

          G_sCAN0TxMessage[MNO].ui32MsgLen = 8;

          CANMessageSet (CAN0_BASE、s_count、&g_sCAN0TxMessage[MNO]、MSG_OBJ_TYPE_TX);

      }

      while (1){

          STATUS =(CANStatusGet (CAN0_BASE、CAN_STS_TXREQUEST)& 0xE0000000);

          if (status =0){

              中断;

         }

      }

  }

 

(第2条

 

谢谢、此致、

Kuerbis

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

    您好、Kuerbis、

     我已将您的帖子转发给我们的 CAN 专家。  

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

    我无法重现您的问题。 您是否拥有完整的 CAN 网络? 您是否从网络上的另一个节点接收到 ACK?

    我获取了您的代码并添加了 CAN 初始化、并创建了一个网络、其中包含一个用作每个消息的接收器的其他节点。 以下是正在发送的 CAN 消息的逻辑分析仪跟踪。

    并继续:

    我的逻辑分析仪能够在第16个帧从样本存储器中退出之前捕获它的起始值:

    我附加了一个包含两个项目的.zip 文件。 "multipleCanMessages"包含您的代码、用于设备发送。 "simple_CAN_Rx"是用于接收器件的。

    e2e.ti.com/.../multipleCANMessages.zip

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

    我是一位客户、要问这个问题。
    感谢您的支持。

    我调查了您的项目和我的项目之间的差异。
    因此,以下设置导致了此问题。

    (第2条

    CANRetrySet (CAN0_BASE、false);

    (第2条

    请评论此问题。

    此致、
    Yuzo

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

    从 TivaWare 外设驱动程序库用户指南第87页:

    如果您的代码运行方式不同、因为您禁用了错误自动重传、则表示您的 CAN 总线上出现错误。 使用逻辑分析仪或示波器查看 CAN 总线上的信号。

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

    我查看了 CAN 总线上的信号。
    如果设置"CANRetrySet"为 true,则此问题已解决。
    但是、如果设置"CANRetrySet"为 false、则此问题尚未解决。

    能否在测试环境中设置"CANRetrySet"值为 false?

    此致、
    Yuzo

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

    如果发送节点在接收节点和 CANRetry 设置为 false 之前启动、则原始消息将丢失。 默认情况下启用重试。 没有理由禁用重试。 CAN 协议具有强大的错误检测和恢复方法。 下面是 CAN 总线的更详细说明、并从第6页开始讨论了错误检查和故障限制。

    https://www.ti.com/lit/an/sloa101b/sloa101b.pdf

    本周剩余的时间里、我正在度假。 如果您需要紧急帮助、请单击"提出相关问题"按钮以启动新主题。

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

    我们的产品规格需要重试、因为我们的产品不使用标准 CAN 协议。 我们的产品会稍微安排 CAN 协议。

    您是说、如果 CANRetry 设置为 false、我无法通过 TivaAware CANMessageSet 设置三个对象(30、31、32)吗?

    此致、
    Yuzo

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

    由于总线上的其他一些器件正在使用修改的协议并且 CANRetry 为 false、因此未接收到 TM4C123器件发送的 CAN 消息、该消息将不会再次发送。 您应该获得 CAN 总线流量的逻辑分析仪图像、以诊断系统中发生的情况。

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

    如果设置"CANRetrySet"为 true、

    如果"CANRetrySet"设置为 false、

    我无法理解、为什么按摩物体会丢失。

    请评论此问题。

    此致、
    Yuzo

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

    这个黄线是 CANH、 这个绿线是 CANL、这些黄线是来自 CAN 协议分析器的 CANID。

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

    我可以通过禁用自动重试来重现您的问题。 我承认这种行为会使我感到困惑。 CAN 状态机好像未能正确仲裁待发送的报文。 是否有原因必须禁用自动重试?

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

    我需要禁用自动重试、因为我们的系统规格。 我们的系统仅接受一次通过禁用自动重试的应答错误。 我们选择了 TM4C123BH6PM、因为它可以禁用自动重试。 如果不能禁用自动重试,这就令人失望了。

    我想确认、如果仅一个对象 CANMessage 用于收发、我可以使用禁用自动重试吗?

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

    当一次只发送一个对象且自动重试被禁用时、TXREQ 位不会被置位。 因此、您无法使用它来确定何时检查错误位或何时重试。 通过添加2ms 软件延迟、我可以发送一个禁用自动重试的单帧、然后检查该帧是否已确认。 以下是发送10帧延迟为2ms 的逻辑分析仪快照。

    这是一个放大图、显示了第一个帧的末尾。 缺少的 ACK 位用红色圆圈标出。

    CAN_STS 寄存器显示最后一个错误为3、缺少 ACK。 CAN_ERR 显示计数为5个接收错误。

    我可以看到在尝试识别未知 CAN 总线的波特率时、这可能是如何使用的、但我不知道它将如何与总线上的其他流量发生回退。

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

    您是说、如果禁用了自动重试功能、则必须对计时器使用固定周期操作吗?

    如果是、我想知道。
    使用 TXREQ 位校验、我一次只能发送一个对象、同时禁用自动重试。
    我使用错误吗?

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

    在禁用自动重试的情况下、我无法使用 TXREQ 位来确定之前的传输是否已发送。  

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

    这是代码。

    (第2条

    #define TXOBJECT_ST            30

    #define TXOBJECT_END          32

     

    uint8_t                             g_ui8CAN0TXMsgData[3][8];

    tCANMsgObject    g_sCAN0TxMessage[3];

     

    int main (空)

      uint32_t MNO;

      uint32_t count、s_count;

      uint32_t status;

     

      //按摩初始化

      G_sCAN0TxMessage[0].ui32MsgIDMask = 0;

      G_sCAN0TxMessage[0]。pui8MsgData =(uint8_t *)(&g_ui8CAN0TXMsgData[0]);

     

      //数据 TX 过程

     for (count=0;count<10;count++){
      G_ui8CAN0TXMsgData[0][0]=计数;
      G_ui8CAN0TXMsgData[0][1]=计数;
       G_ui8CAN0TXMsgData[0][2]=计数;
       G_ui8CAN0TXMsgData[0][3]=计数;
       G_ui8CAN0TXMsgData[0][4]=计数;
       G_ui8CAN0TXMsgData[0][5]=计数;
       G_ui8CAN0TXMsgData[0][6]=计数;
       G_ui8CAN0TXMsgData[0][7]=计数;
       G_sCAN0TxMessage[0]。ui32MsgID = 0x10000000 + count;
       G_sCAN0TxMessage[0].ui32MsgLen = 8;
       CANMessageSet (CAN0_BASE、TXOBJECT_ST、&g_sCAN0TxMessage[0]、MSG_OBJ_TYPE_TX);
       while (1){
        STATUS =(CANStatusGet (CAN0_BASE、CAN_STS_TXREQUEST)& 0x20000000);
        if (status =0){
         中断;
        }
        否则{
         状态= 0;//test
        }
       }
     }

    (第2条

    这是 CAN 信号和 CANID。

    "while (1)"代码是使用 TXREQ 的等待过程。
    如果我切断了"while (1)"代码。 CAN 信号和 CANID 就在这里。

    因此 、我能够使用 TXREQ 位来确定之前的传输是否已经发送。  

    您会再检查一次吗?

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

    我仍然无法读取设置的 TXREQUEST 位。 我尝试了不同的优化级别、但没有改变。 这是我的项目。 也许您在 CAN 配置中执行了一些不同的操作。 我已附加我的项目。

    e2e.ti.com/.../1513.multipleCANMessages.zip