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.

[参考译文] RTOS:F28M36x:CANMessageSet 之后的 CAN 状态-即使数据已发送、仍显示 TX#39;ing

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/565150/rtos-f28m36x-can-status-after-canmessageset---shows-still-tx-ing-even-though-data-was-sent

工具/软件:TI-RTOS

我有一个项目在单独的 PCB 上使用两个 F28M36x 部件、通过 CAN 总线连接。  我的 CAN::Send()方法归结为:

CANMessageSet (CAN0_BASE、32、&msgObject、MSG_OBJ_TYPE_TX);
STATUS = CANStatusGet (CAN0_BASE、CAN_STS_TXREQUEST);
long ulTimer = 2500 * CAN_SEND_TIMEOUT_MS;
超时= false;
while (status!= 0){
如果(-ulTimer < 0){
超时= true;
中断;
}
状态= CANStatusGet (CAN0_BASE、CAN_STS_TXREQUEST);
} 

如果"timeout"为 true、则将重新执行此代码。

问题是 CANStatusGet ()有时返回0x80000000、我认为这表示传输尚未完成。  由于我需要保证传输、代码会重新发送消息。 奇数部分是实际发送数据,而不管 CANStatusGet ()返回的值如何。  

我是否正确使用了 CANStatusGE() API 调用?  是否有其他方法可以确定数据是否已实际发送?

嗯... 我是否错过了有关 CAN API 或 F28M36x CAN 控制器的一些勘误表?

谢谢!
    Steve G.

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

    是的、正在为报文对象32置位的位表示报文对象的发送是请求的、但是没有完成。 这是确定报文对象是否已发送的正确方法。 错误和状态寄存器中还有一个 TxOK 位可以读取、但该位不提供它所指的报文对象的相关信息。

    此致
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chris、
    奇怪的是状态位仍然被置位、但我的中断处理程序已触发并指示消息对象已发送。 我更改了代码以使用中断(正如我在这些论坛上的其他几篇文章中看到的那样)、它起作用。 状态位仍显示消息未发送、但中断标志表示消息已发送、并且消息在 CAN 接收器处可见。

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

    Steve、

    这是一个器件错误、这是值得怀疑的。 此 CAN 模块已在该领域应用多年。

    是在环路中传输? 您可能会在旧变速器完成后立即启动新变速器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们将在环路中传输数据。 代码发送一条消息、等待状态寄存器中的位清零(表示消息已发送)、然后发送下一条消息。 问题是发送了消息、但状态位不清零(或看起来不清零)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否仅发送了一条消息、或者您是否能够连续传输?

    我们将研究状态位和中断的时序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我每隔250毫秒左右检查一次消息是否已发送。 如果未发送、我会减少计数。 当计数值达到零时、我重新发送。

    每次重试时都会继续发送消息、即使状态位显示消息尚未发送也是如此。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Steve、

    在 TXRQ 位被清零前、中断确实会被触发。 我将提供一个 TT、以更明确的中断和状态位时序来更新文档。

    很抱歉、混淆了、