2

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

现在问题来了……另一个节点和我的电路板同时通电。另一个节点在上电 40 毫秒左右后开始发送消息。但我无法在我的板上收到任何消息。现在,如果我先给我的电路板加电,给它一些时间用新的过滤器重新配置 ECAN 模块并稳定下来,然后给另一个节点加电,然后一切正常。

现在最奇怪的部分...如果我在我的板子和另一个节点之间连接了一个 CAN 总线分析器,即使我同时给两个节点加电,一切正常...不需要先给我的板加电. 我已经用来自不同制造商的三种不同的总线分析仪进行了尝试,并得到了相同的结果。

在我看来,在重新配置 ECAN 模块期间,需要一些时间来安定下来。并且随着总线分析器在总线中的引入,这段时间不知何故被缩短了,这样一切都可以完美运行。但我不确定问题到底是什么。

4

3 回答 3

3

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

在整个总线初始化之前,我会推迟发送。

于 2012-03-15T12:56:21.737 回答
2

对我来说,这听起来也像是缺少 ACK。

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

您可以通过在总线上传输虚拟消息将其哄回总线上。

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

于 2012-03-16T13:01:06.150 回答
0

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

当你给你的板子和其他节点加电时,你的板子似乎没有在 40 毫秒内准备好。如果它没有准备好,它会让“其他节点”成为总线上的唯一成员,并违反上述规则。其他节点将收到 Tx 错误,并且在 128 错误之后,其他节点将进入错误模式并停止发送消息 - 因此您什么也得不到。

当你先给你的电路板加电时,给它时间——你的电路板已经准备好了,并且会确认其他节点发送的每条消息——因此通信很好!

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

于 2016-10-25T15:02:33.577 回答