关于CAN总线
我正在使用16位MCU PIC24HJ64GP504编写基于CAN的应用程序。基本上它是我的板和另一个节点之间的通信,它继续使用1 Mbit/s的CAN向我的板发送数据。我正在配置我的PIC24中的ECAN模块以1 Mbit/s工作。我已经编写了这样的代码:ECAN模块将接收来自另一端的所有消息,之后我将ECAN模块重新配置为只接受消息ID为0x13的那些消息。关于CAN总线
现在问题来了......另一个节点和我的主板在同一时刻启动。上电后,另一个节点开始传输消息后大约40 ms。但是我无法从我的主板上得到任何消息。现在,如果我先启动电路板,给它一些时间用新滤波器重新配置ECAN模块,然后安定下来,然后打开另一个节点的电源,然后一切正常。
现在最奇怪的一部分......如果我有我的连接电路板和其他节点,即使我的权力了在同一时间在两个节点之间的CAN总线分析仪,一切工作正常...无需电源首先登上我的董事会。我曾尝试过使用来自不同制造商的三款不同总线分析仪,并获得了相同的结果。
对我来说似乎ECAN模块的重新配置过程中,它需要一些时间来沉淀下来。随着总线分析仪的推出,这段时间在某种程度上被缩短了,这样一切都完美无缺。但我不确定究竟是什么问题。
该问题可能是缺少ACK。 CAN分析仪可能会确认帧,并且设备不会切换到错误被动状态。
我会阻止发送,直到整个公交车初始化。
我的设备不传输任何东西。它只是消耗数据,就是这样。另一个节点的固件不在我的控制之下。我将无法将其传输开始时间从40ms改为100ms。顺便说一句,我今天检查了一个示波器,发现如果其他节点在170ms后开始传输,那么整个事情就可以正常工作。但是如果在此之前传输,我的设备上没有任何消息。 – 2012-03-15 14:47:37
@ Philipp我不能相信CAN分析器会产生ACK,它应该始终处于只听模式 – jeb 2012-03-16 09:48:39
@jeb - CAN分析工具确实会产生ACK,除非您将它们配置为 – 2012-03-16 12:56:54
也听起来像缺少ACK给我。
你看到任何错误帧(获取范围,以触发关闭6个连续显性位) - 传输节点可能是公交车或会关闭甚至进入一些应用程序错误模式,如果它没有得到足够的承认。
您可能可以通过在总线上传输虚拟消息来重新启动它。
我发现一个Saleae Logic在这种情况下非常有用(以及一个范围) - 挂落Rx引脚的物理层(甚至线了一个独立的PHY,你可以用它来监视总线) 。 Saleae软件将解释CAN并告诉你发生了什么。有时候使用范围触发器触发逻辑是有用的。
CAN通信需要在总线至少两个有源设备具有成功的通信。这是因为,除非有人确认CAN帧,否则CAN帧不会完成。
当你的董事会和其他节点上电,看来你的主板是没有得到在40毫秒准备。如果还没有准备好,它会让“其他节点”成为公交车上的唯一成员,并且按照上述规则发布。其他节点将得到Tx错误,在128个错误之后,该另一个节点将进入错误模式并停止发送消息 - 因此,您没有得到任何东西。
当您首先打开你的董事会,给它时间 - 您的主板已准备就绪,将ACK其他节点发送的每一个消息 - 因此沟通是好的!
当您添加CANalyzer时,即使您的主板未通电,总线上也有两个活动节点 - 因此通信很好!
http://electronics.stackexchange.com是个好地方。那里有很多PIC和CAN经验的人。 – kenny 2012-03-15 13:15:34