分布式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个节点。注意,源地址和目的地址必须有一个是管理中心的地址,因为各个井盖节点之间不相互传送数据。