关于CAN总线

时间:2012-03-15 12:45:09

标签: microcontroller pic can-bus

我正在使用16位MCU PIC24HJ64GP504来编写基于CAN的应用程序。基本上它是我的电路板和另一个节点之间的通信,它继续使用CAN以1 Mbit / s的速率向我的电路板发送数据。我在PIC24中配置ECAN模块,工作速率为1 Mbit / s。我编写代码的方式是,在前10 ms内,ECAN模块将接受来自另一端的所有消息,然后我重新配置ECAN模块以仅接受消息ID为0x13的消息。 / p>

现在问题出现了...另一个节点和我的电路板在同一时刻启动。上电后40 ms左右,另一个节点开始发送消息。但我无法在我的电路板上收到任何消息。现在,如果我先给我的电路板加电,给它一些时间用新的滤波器重新配置ECAN模块然后安定下来然后打开另一个节点的电源,那么一切都很完美。

现在最奇怪的部分......如果我的主板和另一个节点之间连接了一个CAN总线分析仪,即使我同时启动两个节点,一切正常......无需启动我的董事会第一我用不同制造商的三种不同总线分析仪尝试了这一点,并得到了相同的结果。

对我来说,似乎在重新配置ECAN模块时,需要一些时间才能安定下来。随着公共汽车分析仪在公共汽车上的引入,这个时间在某种程度上缩短了,所以一切都很完美。但我不确定问题到底是什么。

3 个答案:

答案 0 :(得分:3)

问题可能是缺少ACK。 CAN-Analyzer可能会确认帧,设备不会切换到被动错误。

我会暂停发送,直到整个总线被初始化。

答案 1 :(得分:2)

听起来好像错过了我的确认。

您是否看到任何错误帧(让范围触发6个连续的显性位) - 如果Tx节点没有得到足够的确认,Tx节点可能会离开总线,甚至进入某种应用程序错误模式。

您可以通过在总线上发送虚拟消息将其重新引回总线上。

我发现Saleae Logic在这些情况下非常有用(以及范围) - 将其挂在物理层的Rx引脚上(甚至连接一个可用于监控的独立PHY)公交车)。 Saleae软件将解释CAN并向您展示正在发生的事情。有时使用示波器触发器触发逻辑是有用的。

答案 2 :(得分:0)

CAN通信要求总线上的至少两个活动设备才能成功通信。这是因为,除非有人承认,否则CAN帧不会完成。

当您打开电路板和其他节点时,看起来您的电路板在40毫秒内没有准备就绪。如果它没有准备好,它会离开"其他节点"成为公共汽车上唯一的成员,并且规定了上述规则。其他节点将获得Tx错误,并且在128个错误之后,另一个节点将进入错误模式并停止发送消息 - 因此您没有得到任何东西。

当您首先打开电路板时,请给它时间 - 您的电路板已准备好并将确认其他节点发送的每条消息 - 因此通信良好!

当您添加CANalyzer时,即使您的主板没有通电,总线上也有两个活动节点 - 因此通信很好!