单片机/MCU论坛
直播中

刘伟

7年用户 1619经验值
私信 关注

XMC_CAN_STATUS_BUSY是如何引起的,在CAN通信中是否有方法可以逃脱它呢?

我正在使用基于XMC4400 MCU的电路板,并致力于CAN通信。 DAVE 是我用来做这件事的 IDE。
情况是,通信在开始时表现良好,但在发送了几十条CAN消息后,它停止了。 尝试了很多次,但这种行为仍然存在。 经过调试期间的调查,问题发生在 xmc_can_mo_Transmit () 函数中,该函数返回 XMC_CAN_STATUS_BUSY 状态,以下所有传输都停留在相同的原因上。
重置电路板后(我的表达式可能不准确 - 对于我的情况,我的意思是停止/重新启动DAVE中的调试),CAN通信恢复工作,但再次在发送数十条消息后停止XMC_CAN_STATUS_BUSY。
发送的频率为每秒一次,我认为这远非高。 另外,我尝试了不同的CAN设备作为接收器,问题仍然存在,因此我认为这不是连接或接收CAN节点的问题。
我的CAN配置是根据硬件信号连接设置自动生成完成的。 在代码中,CAN通信相关脚本基本上是这样的


CAN_NODE_0.lmobj_ptr[2]->mo_ptr->can_data_word[0] = a;CAN_NODE_0.lmobj_ptr[2]->mo_ptr->can_data_word[1] = b;XMC_CAN_MO_UpdateData(CAN_NODE_0.lmobj_ptr[2]->mo_ptr);XMC_CAN_MO_Transmit(CAN_NODE_0.lmobj_ptr[2]->mo_ptr);

在 1 秒间隔内调用 tick 函数。
能否就繁忙状态的可能原因分享一些建议?
或者,有没有一种方法可以在传输失败时重置消息对象,例如清除忙碌状态和消息数据等,为下一轮的传输做好准备?

回帖(1)

李刚

2024-1-25 17:03:26
XMC_CAN_STATUS_BUSY是由于CAN模块正在忙于处理之前的传输而导致的。这可能是因为CAN模块的发送FIFO已满,或者CAN总线上存在其他活动。

要逃脱这个状态,您可以采取以下几个步骤:

1. 检查CAN总线负载:确保CAN总线上的负载不会超过总线的容量。这可以通过检查其他设备是否在同一总线上进行通信来实现。

2. 增加发送FIFO的大小:如果发送FIFO经常满,您可以尝试增加FIFO的大小,这样可以提供更多的缓冲区来存储待发送的消息。

3. 检查CAN错误:检查CAN总线上是否存在错误,例如仲裁丢失或错误传输等。这些错误可能会导致CAN模块处于忙碌状态。

4. 调整发送频率:如果您的发送频率过高,可以尝试降低发送频率,以减少CAN模块的负载。

5. 检查硬件连接:请确保CAN总线连接正确,插头和电缆都正常。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分