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.

[参考译文] TMS570LS0714:DCAN 报告仲裁丢失~95%时间时出现问题

Guru**** 2455360 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/637863/tms570ls0714-issue-with-dcan-reporting-arbitration-loss-95-of-the-time

器件型号:TMS570LS0714

我们使用的是自动重传、但它将以无尾的方式发送未确认的消息。  我们在链接中附加了 Peak 品牌 CAN 工具时注意到了这一点。  由于它会干扰我们的电源管理方法(更不用说无限重发送)、因此现在选择了 DAR (禁用自动传输)。

 

现在、我们需要在发送下一条消息时处理 TX 消息重试(获取仲裁丢失状态并重新请求调度程序再次尝试)。   我发现“newdat”标志只能以非常低的速率(时间<95%)清除。   根据 TRM、成功传输也将清除 newdat 标志(除了 TxREQ 标志)。   如果知道、返回这些仲裁丢失指示的相同系统似乎能够完美地进行通信、这一点可能会有所帮助。

 

不管怎样, 这里是我们返回“不良状态”的功能,也许您可以帮助我们解决问题。   谢谢!!   弗兰克

 

volatile bool MsgBox_TX_FAILED = false;

bool mcal_ca_transmit 就绪(mcal_ca_message_t * CAN_message)

   mcal_ca_base_t       * ca_reg_n =空;

   uint32_t              TX_STATUS_INDEX;

   uint32_t              TX_BUSY_BIT;

   uint32_t              MsgBox_newdat_bit;

   mcal_ca_link_enum_t  ca_link;

   bool                  CAN_TX_READY = false;

 

   MsgBox_TX_FAILED = false;

 

   //验证 CAN 设备是否存在

   CAN_LINK = CAN_MESSAGE -> message_route.can_link;

   IF (CAN_LINK >= MCAL_NUM_CAN_CHANNELS)

   {

       mcal_can_status.invalid_channel_req = true;

   }

   其他

   {

       CAN_REG_n = mcal_CAN_register_list[ CAN_link ];

       TX_STATUS_INDEX =(CAN_MESSAGE->message_route.can_stream - 1U)>> 5U;

       TX_BUSY_BIT = 1U <<(CAN_MESSAGE->message_route.can_stream - 1U)& 0x1f);

       MsgBox_newdat_bit = 1U <<(CAN_message->message_route.can_stream - 1U)和0x1f);

 

       //验证有效的邮箱

       if ((CAN_message->message_route.can_stream >= MAX_VALID 邮箱)||

           (CAN_message->message_route.can_stream =0)

       {

           mcal_can_status.invalid_mailbox_id = true;

       }

       如果((CAN_REG_n->txrq[TX_STATUS_index]和 TX_BUSY_BIT)== 0U 则为其他值

       {

           CAN_TX_READY = true;

           if ((CAN_REG_n->msgval[TX_STATUS_index]和 MsgBox_newdat_bit)!= 0U)

           {

               MsgBox_TX_FAILED = true;

           }

       }

   }

   返回 CAN_TX_READY;

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

    您好、Kime、

    如果通过将 CAN 控制寄存器的 DAR 位置位来禁用自动重发送模式、则接口寄存器的报文控制寄存器中的 TxRqst 位和 NewDat 位的行为如下:

    • 当一个传输开始时、相应接口寄存器组的 TxRqst 位被复位、而 NewDat 位保持置位。
    • 当发送成功完成时、NewDat 位被复位。

    当发送失败(丢失仲裁或错误)位 NewDat 保持置位时、您可以使用 CAN 监视器来检查总线上的消息、或使用回送。