2017-04-15 110 views
1

我正在构建基于Atmega2560芯片的定制Canbus IO模块。该模块将具有10个高电流输出,包括pwm控制和电流反馈,20个数字输入,5个模拟输入和4个0-5v模拟输出。我一直在研究搞清楚我将要使用的J1939消息结构。这些模块将是由主ECU控制的从属设备。由于这些模块中的多个模块可能位于同一个网络中,因此我为每个模块添加了一个CAN地址开关,以便用户可以选择每个单元的CAN ID 1-255。计划是让每个模块在单个CAN消息中广播所有数字输入的状态。如果我选择0xFF00作为PGN ID,然后使用8个字节来表示该特定模块输入状态的位状态,那么主机如何知道该消息来自哪个模块? CANbus消息中的模块地址是?j1939自定义模块通信

我一直在寻找的Arduino的CANBUS的例子,它看起来像您可以根据PGN过滤,但我没有看到任何过滤器的基础上源地址或目的地址。

有人可以提供我如何可能会做一些这方面的澄清?

+0

J1939编码的源地址作为扩展CAN标识的8个最低-显著位。您应该可以编程您的CAN接口来过滤掉那部分,但除非您遇到性能问题,否则我会坚持使用软件过滤。我怀疑你选择带有内置CAN外设的MCU代替ATmega2560可能会更好。 – doynax

+0

所以我可以通过添加优先级,PGN然后来源发送消息? 例如,如果我发送0x0CFF00FE这意味着: 优先3 PGN 65280 源地址254 这是正确的吗? – jonfarrugia

+0

@jonfarrugia你是对的。请注意,所有专有的PGN(65280-65535)都是广播消息,这意味着它们的目标地址始终为255。 – LaneL

回答

0

是的,作为doynax提到的,8个最低显著位总是保留用于节点的源地址。如果您将该网络放置在车辆的CAN总线上,请务必注意,如果您未在车辆总线上声明源地址,则每当您尝试将外部信息放置在车辆上时,您可能会从主ECU获得NAK总线。

为了避免这个问题,你可能必须为你的网络上的每个自定义节点做一个要求地址的过程。这是发送PGN 60928作为广播(目的地址0xFF)的地方,网络上的每个节点都应该在该PGN上用自己的源地址进行响应(假设所有节点都符合本规范,并非全部都符合)。如果在回复中看到共同的源地址,那么您知道它不可用。

见页开始以获取更多信息下面幻灯片39 J1939