嵌入式软件基础知识(嵌入式软件专题四)
嵌入式软件基础知识(嵌入式软件专题四)第一个字节,声明增加的ID号的低16位,管理帧一般都是定义为0x4XX,所以只用取低16位就可以区分各个节点了;409:09 01第一轮:声明我在400:00 01407:07 01
CAN网络管理,主要用来管理CAN总线上各个节点的休眠唤醒。CAN和LIN的休眠唤醒不太一样,LIN网络中有主节点,休眠唤醒可以统一由主节点调配,但是CAN网络没有主从关系,每个节点都是对等的。因此,CAN网络休眠唤醒需要一定处理机制,一般采用OSEK令牌环的管理方式。
举个例子:
CAN报文
这里CAN总线上有3个节点,ID分别是400、407、409。
第一轮:声明我在
400:00 01
407:07 01
409:09 01
第一个字节,声明增加的ID号的低16位,管理帧一般都是定义为0x4XX,所以只用取低16位就可以区分各个节点了;
第二个字节,表示自己的状态,根据状态定义表:
#define CNM_OPC_ALIVE (0x01)
#define CNM_OPC_RING (0x02)
#define CNM_OPC_LIMPHOME (0x04)
#define CNM_OPC_ALIVE_NSLEEP (0x01)
#define CNM_OPC_ALIVE_SLEEP (0x11)
#define CNM_OPC_RING_NSLEEP (0x02)
#define CNM_OPC_RING_SLEEP_IND (0x12)
#define CNM_OPC_RING_SLEEP_ACK (0x32)
#define CNM_OPC_LIMPHOME_NSLEEP (0x04)
#define CNM_OPC_LIMPHOME_SLEEP (0x14)
0x01代表ALIVE,相当于第一轮大家都在声明自己在总线上。
第二轮:建环
400:07 02
407:09 02
409:00 02
按照从小到大的顺序,依次建环,最大的接最小的收尾相接形成环路。
第一个字节,报下一个节点ID;
第二个字节,0x02代表RING
第三轮:等待休眠
400:07 12
407:09 12
409:00 02
400:07 12
407:09 12
409:00 12
等待总线上所有节点都进入0x12(SLEEP_IND)状态.
最后,当总线上所有节点都进入SLEEP_IND状态后,由下一个节点下休眠指令
400:07 32,自行休眠,其他节点收到指令后各自休眠。