我正在使用16位单片机PIC24HJ64GP504来编写一个基于CAN的应用程序。基本上,这是我的主板和另一个节点之间的通信,它使用CAN以1 Mbit/s的速度持续向我的主板发送数据。我正在配置PIC24中的ECAN模块,使其以1 Mbit/s的速度工作。我编写代码的方式是,对于前10 ms,ECAN模块将接受来自另一端的所有消息,之后我重新配置了ECAN模块,只接受那些消息ID为0x13的消息。
现在问题来了。另一个节点和我的电路板同时通电。另一个节点在通电后大约40毫秒后开始发送消息。但我无法在我的板上从它那里获得任何信息。现在,如果我首先给我的主板上电,给它一些时间来用新的过滤器重新配置ECAN模块,然后稳定下来,然后给另一个节点上电,然后一切都可以完美地工作。
最奇怪的是..。如果我有一个CAN总线分析器连接在我的电路板和另一个节点之间,即使我同时给两个节点通电,一切都工作得很好…不需要先打开我的电路板。我已经用来自不同制造商的三种不同的总线分析仪进行了试验,得到了相同的结果。
在我看来,在重新配置ECAN模块的过程中,需要一些时间才能稳定下来。随着总线分析器在总线中的引入,这段时间以某种方式缩短了,以便一切都能完美地工作。但我不确定到底是什么问题。
发布于 2012-03-15 20:56:22
问题可能是缺少ACK。CAN-Analyzer可能会确认帧,并且设备不会切换到无源错误模式。
我会推迟发送,直到整个总线初始化。
发布于 2012-03-16 21:01:06
对我来说,这听起来也像是丢失了ACK。
您是否看到任何错误帧(获取范围以触发6个连续的主比特)-如果没有得到足够的确认,Tx节点可能会离开总线,甚至进入某个应用程序错误模式。
您也许能够通过在总线上传输一个虚拟消息来诱使它回到总线上。
我发现Saleae Logic在这些情况下非常有用(还有一个示波器)--把它挂在物理层的Rx引脚上(或者甚至连上一个可以用来监控总线的独立物理层)。Saleae软件将解释CAN并向您显示发生了什么。有时,使用范围触发器out来触发逻辑是很有用的。
发布于 2016-10-25 23:02:34
CAN通信要求总线上至少两个活动设备才能成功通信。这是因为,除非有人确认,否则CAN帧是不完整的。
当你给你的电路板和其他节点加电时,你的电路板似乎在40毫秒内还没有准备好。如果它没有准备好,它离开“其他节点”成为总线上的唯一成员,并使上述规则无效。其他节点将得到Tx错误,且在128次错误之后,另一个节点将进入错误模式并停止发送消息--因此您什么也得不到。
当你首先给你的电路板加电时,给它一些时间--你的电路板已经准备好了,并且会确认其他节点发送的每一条消息--因此通信是很好的!
添加CANalyzer时,即使您的主板没有通电,总线上也有两个活动节点--因此通信很好!
https://stackoverflow.com/questions/9719967
复制相似问题