分布式CAN通信网ID分配方法
在介绍本方法前,先构建CAN通信网系统模型:只有一个管理中心节点,其他均为从节点。主节点可与所有从节点之间相互通信,从节点之间不相互通信。CAN通信网采用网桥扩展方式增大网络中的节点。
报文帧格式
帧信息 | IDE=1 | RTR=0 | X | X | DLC | |||||||||||||
扩展帧 | 远程帧 | 保留位 | 帧数据部分长度(不大于8) | |||||||||||||||
帧标 识符 | ID28 | ID27 | ID26 | ID25 | ID24 | ID24 | ID22 | ID21 | ||||||||||
DestMACID(目标节点编码) | ||||||||||||||||||
ID20 | ID19 | ID18 | ID17 | ID16 | ID15 | ID14 | ID13 | |||||||||||
xxxxxxx xxxxxxx |
| |||||||||||||||||
ID12 | ID11 | ID10 | ID9 | ID8 | ID7 | ID6 | ID5 | |||||||||||
SrcMACID(源节点编码) | ||||||||||||||||||
ID4 | ID3 | ID2 | ID1 | ID0 | X | X | X | |||||||||||
| 0 | 保留位 |
当使用扩展帧进行数据传输时,扩展帧ID由STID+EXID组成。例如,在STM32中设置ExtID=0X1234时,则
CAN_FilterIdHigh=0x0000,CAN_FilterIdLow=(0x1234)X8+4= 0x91A4;
如果设置ExtID=0X5678,则
CAN_FilterMaskIdHigh=(u32(0x5678)X8/(0x10000)=0x0002; CAN_FilterMaskIdLow=(0x5678)X8+4=0xB3C4;(溢出,截高位,剩下的就是这个数)。
为方便计算,我们把ID最后一位直接置为0。ID28~ID01这28位平分,前14位为DestMACID(目标节点),后14位为SrcMACID(源节点)。对于前14位,ID28~ID22作为网桥标号,ID21~ID15作为子网内编号。后14位采用相同编号方式。
其中,地址0000000/0000000设置主地址
网桥编号为, 0000001/xxxxxxx~1101110/xxxxxxx,也就是1~110
网桥内子节点编号为xxxxxxx/0000001~xxxxxxx/1101110,也就是1~110
规定xxxxxxx/0000000,为网桥内广播地址。广播地址,其中,xxxxxxx!=0000000。这主要是为了管理中心向各个从节点采集数据(心跳连接)时使用的。通过网桥内广播,则管理中心最少只需要发送110次查询信息,就可以获取所有井盖终端的井盖当前状态。
例如,某节点地址为0000010/0000100,则表示为网桥2内的第4个节点
如果整个29位的ID设置为0000000/0000000 0000010/0000100 0,则表示数据从网桥2内的第4个节点,发送至管理中心;如果整个29位的ID设置为0000010/0000100 0000000/0000000 0,则表示数据从管理中心,发送至网桥2内的第4个节点。注意,源地址和目的地址必须有一个是管理中心的地址,因为各个井盖节点之间不相互传送数据。