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.

[参考译文] TMS320F2800137:F2800137 CANBUS 连续发送就绪标志

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1328059/tms320f2800137-f2800137-canbus-consecutive-transmit-ready-flag

器件型号:TMS320F2800137

您好

我正在 F2800137上使用 CANBUS。

我需要使用相同的对象 ID 发送连续的 CANBUS 数据包帧数据包。 我没有使用中断。  

我当前正在使用 CAN_O_TXRQ_21来检测是否可以发送另一个数据包、但看起来不会在忙时等待(下面的函数始终返回0)、并仍在尝试在第一个数据包之后立即传输另一个数据包。 在本例中、我丢失了一些数据包。 (请参阅下面的代码)

我的问题是、检测是否可以尽快传输另一帧的最有效方法是什么?

// 0:好,已准备好传输
// 1:忙,需要等待
int32_t IS_CAN_TX_BUSY (uint32_t Objid)
{
  if ((HWREG_BP (CAN_MODULE + CAN_O_TXRQ_21)&(1U<   {
   CANBUS_NOT_BUSY++;
   返回0;
  }
  否则
  {
   CANBUS_BUSY_BUSY++;
   返回1;
  }

int32_t FLEXCAN_WriteTxMb (uint32_t Objid、const can_FRAME_t * txFrame)
{
 CAN_setupMessageObject (CAN_MODULE、Objid、txFrame->u32Id、CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、 0U, 0U, txFrame->lenight );  
 can_sendMessage (CAN_MODULE,Objid,txFrame -> lenight,txFrame -> data);
 MSG_COUNT++;

主要()

{

while ()

{

 if (IS_CAN_TX_BUSY (CAN_TX_MSG_OBJ_ID)== 0)//检查是否可以发送新的数据包
 {

 FLEXCAN_WriteTxMB (CAN_TX_MSG_OBJ_ID、&txXfer);

 }

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

     尊敬的 Ahugron:

    监控寄存器 CAN_ES 中的 TxOk 位。  在发送另一个帧之前、确保首先正确发送并确认传输的帧。  如果传输无错误、那么 TxOk 将被置位。

    此致、

    约瑟夫

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

    您好、Joseph:

    感谢您的帮助。 似乎通过在发送一个帧后检查 txOK 就可以了。 我确实有时间对某个 帧错误进行倍频。 (范围)。 总之、收发器仍在重试、这很好。

    但在通常情况下、器件会完全停止传输。  我的确调用了 CAN_SendMessage 函数、不会向总线发送任何信息。  CAN_getStatus (CANA_BASE)将返回0xE7。 (寄存器视图显示0xF8)。 不清楚为什么会有不同。 BOFF、EWarn、EPass、RxOK 已置位。

    如何清除这些标志以开始重新通信。

    谢谢。

    阿诺

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

    您好、Joseph:

    感谢您的帮助。 似乎通过在发送一个帧后检查 txOK 就可以了。 我确实有时间对某个 帧错误进行倍频。 (范围)。 总之、收发器仍在重试、这很好。

    但在通常情况下、器件会完全停止传输。  我的确调用了 CAN_SendMessage 函数、不会向总线发送任何信息。  CAN_getStatus (CANA_BASE)将返回0xE7。 (寄存器视图显示0xF8)。 不清楚为什么会有不同。 BOFF、EWarn、EPass、RxOK 已置位。

    为什么设置这些标志、以及如何清除这些标志以重新开始通信。

    谢谢。

    阿诺

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

    Arnaud、您好!

    似乎总线中发生了错误。  您是否有该帧的波形捕获以及该帧是否显示失真?  每当您看到 Boff 置1时、这就表明发生了多个错误、导致 CAN 关闭发送节点上的总线。  您首先需要隔离导致错误的原因。

    只要您启用自动总线关闭恢复(ABO)位、如果您的应用程序清除了 INIT 位、CAN 协议将尝试重新初始化模块。  更多信息、请参阅技术参考手册中的自动总线打开顺序。

    此致、

    约瑟夫