为什么我的 CAN 收发器不会收到消息,除非有很长的启动延迟或连接了总线分析仪?

电器工程 微控制器 图片 微芯片 能够
2022-01-08 06:32:21

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

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

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

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

在过去的 7 天里,我一直在努力解决这个问题。

PS:今天我用示波器检查,发现如果另一个节点在上电后170毫秒后开始传输,那么整个事情就正常了。在此之前,除非连接了总线分析器,否则我的设备不会收到任何消息。最糟糕的是我不能延迟另一个节点的传输,那个节点的固件是专有的。

另外,我今天在一个论坛上读到,CAN 需要节点上的 120 Ω 电阻器才能使其工作(即使我的节点没有一个并且它工作正常,只要在重新配置后有一些时间来解决)。我怀疑总线分析器的引入以某种方式改变了某些网络的电气参数,从而缩短了我的节点在重新配置后稳定所需的时间。但我不确定.. :(

3个回答

您在某处“在论坛上阅读”CAN 总线需要电阻器? 严重地!!?

这是您设计中不可或缺的一部分。如果你要使用CAN,你需要了解它,这意味着阅读相关文档。

斯皮尔森是对的,但出于错误的原因。您可能拥有的差分 CAN 总线(您没有说您使用的是什么接口芯片,但可能您有一个标准差分 CAN 总线,由每个节点上的 MCP2551 之类的东西驱动)需要线路之间的电阻。这是因为隐性状态由两条线被动拉在一起发出信号,而显性状态由它们主动拉开发出信号。从这个意义上说,线路之间的电阻相当于开路集电极线上的上拉电阻。当没有东西在驱动公共汽车时,如果没有东西将线路拉在一起,公共汽车就无法工作。

正如 spearson 指出的那样,电阻器还可以用作终结器。您通常对两条总线使用双绞线。它的阻抗约为 120 Ω。这种类型的差分 CAN 总线被定义为在线路之间具有 60 Ω 作为拉合,因此可以在每条线路上使用 120 Ω 来终止总线并避免反射。

 

在正常的 CAN 操作中,节点将重复其传输,直到它被确认或超过错误计数。当您将 CAN 分析仪连接到网络时,它会在检测到来自您的第一个节点的帧时发出 ACK 位,从而使传输成功。如果您使用的是 Microchip CAN BUS Analyzer,您可以将其配置为“只听”模式,这意味着它不会发出任何 ACK 位,因此不会影响网络。因此,您应该能够在分析仪显示中看到重复的 CAN 帧,直到第二个节点发出 ACK 或第一个节点由于错误计数而退出传输。

ACK 位将由接收节点设置(如果帧完整且正确),而不管任何地址过滤。

由于帧未被确认,您的第一个节点很可能会达到错误状态。您应该使用 CiINTF 寄存器在软件中检测到这一点。您还可以使用 CiINTE 寄存器将 PIC 配置为针对错误条件发出中断。

如果您的示波器无法解码 CAN 帧,请尝试Saleae Logic分析仪。它将解码 CAN 帧并显示 ACK/错误位。它比 Microchip CAN 分析仪可靠得多。

CAN 帧中有一个 ACK​​ 槽(两位)。如果一个节点 A 正在传输数据并且总线上还有五个其他节点,则在传输后,无论哪个节点接收到该帧,都会将显性位放入 ACK 槽中。这表明消息已成功传输。否则 CAN 控制器将其视为总线上的错误。

添加 CAN 分析仪时,它会向发送器发送 ACK。发送方认为总线良好并继续发送。在没有 CAN 分析仪的情况下,当您重新配置 CAN 控制器时,发送器没有收到 ACK 并认为总线上存在错误,因此停止发送。

我希望你明白了。

确保 ACK 正确获取。在进行重新配置时,也尽量不要完全关闭你的 CAN 接收器。

另一个技巧(我不确定它是否总是有效)是在重新配置后发送零 DLC 和零 ID 帧。这将告诉发送器节点总线处于活动状态,它将开始发送。

注意:必须使用 120 Ω 电阻!!!. 终端电阻是任何总线上最重要的东西。