我正在构建一个基于Atmega2560芯片的自定义off总线IO模块。该模块将有10个具有pwm控制和电流反馈的大电流输出,20个数字输入,5个模拟输入和4个0-5v模拟输出。我一直致力于弄清楚我将使用的J1939消息结构。这些模块将是由主ECU控制的从属设备。由于这些模块中可能有多个模块在同一网络上,因此我为每个模块添加了一个CAN地址开关,以便用户可以选择每个单元的can ID 1-255。该计划是让每个模块在单个CAN消息中广播所有数字输入的状态。如果我选择0xFF00作为PGN ID,然后使用8个字节以位形式表示该特定模块的输入状态的状态,那么主机如何知道消息来自哪个模块?模块地址是否在CANbus消息中?
我一直在看arduino CANBUS的例子,看起来你可以根据PGN进行过滤,但我没有看到任何可以基于源地址或目的地址进行过滤的东西。
有没有人能解释一下我该怎么做?
发布于 2017-06-13 00:31:23
是的,正如doynax提到的,8个最低有效位始终保留用于节点的源地址。如果您要将此网络放置在车辆的CAN总线上,请务必注意,如果您没有在车辆总线上声明源地址,则每当您尝试将外来信息放置在总线上时,您都可能会从主ECU获得NAK。
为了防止此问题,您可能需要为网络上的每个自定义节点执行声明地址过程。此时,您将PGN 60928作为广播(目的地址0xFF)发送出去,网络上的每个节点都应使用自己的源地址在PGN上进行响应(假设所有节点都符合此规范,但并非所有节点都符合此规范)。如果在回复中看到公共源地址,则表明该地址不可用。
有关从第39页J1939开始的更多信息,请参阅以下幻灯片
https://stackoverflow.com/questions/43430815
复制相似问题