实现几种功能,全网唤醒自组网,物理加入,物理掉线,全网休眠,自我认知到无法建网(跛足)
令牌环拓扑结构,利用了can总线的仲裁,使id从小到大顺序发送。
虽然是令牌环,但物理上是单总线,其实每个节点都知道其他所有节点状态。
用环可以减少ecu的负载,不需要维护总表,因为设备可能很多。只需要维护几个状态,自己下家是谁,全网申请休眠。
can报文id为ecu自己的id,为4XX,can报文payload有两个字节,data[1]状态字节,有5个bit管用
0x01 Alive(上线,本ecu是新加入的,或者本ecu被人跳过了)
0x02 Ring(传递令牌)
0x04 LimpHome(跛足,网络无人响应无法建环)
0x10 SleepIndication(休眠申请,本ecu想休眠了)
0x20 SleepAcknowledege(应答申请,检测到一次回环中所有报文都SleepIndication,可以休眠了)
各个bit不能任意组合实际只有5种报文
01:代表Alive报文,在总线上声明自己的存在,请求其他节点与自己建环。
02:代表Ring报文;
12:代表当前节点已无通讯请求(睡眠标志位SleepIndication置位),即告知其他节点我已满足睡眠条件;
32:即将其睡眠应答位置1,当检测到其他节点都在发送12ring报文后,最后一个节点发送此应答报文,告知其他节点当前整个网络无通信请求,可以睡眠。此时进入睡眠等待状态即Twbs状态。
04:代表跛行报文,如果网络管理报文接收计数器和发送计数器超限后,发送跛行报文即无其他节点与此节点建环,只有一个节点存在。
data[0]两种情况,alive报文填本ecu的id,ring报文填写令牌要发给目的ecu的id。
令牌环的逻辑,每个节点有独一无二的id。总线由id小的先发送,将data[0]设置为自认为比自己id大的下一个节点,发送报文相当于发送令牌环。id最大的下一节点为最小id节点。
网络唤醒后,大家都发alive,各自记住自己下一个节点是谁。
节点加入或错乱,每个节点监听自己是否被跨过去,即 can id < 自己的id < can data[0],发现后发alive,自己上一级节点更新它自认为比自己id大的下一个节点。
节点掉线,超时后,开始刚唤醒时候流程。
网络休眠,一次回环大家都发送休眠申请,计时进入全网休眠。
相互独立的节点自组网,由于网络的不确定性,当然离不开时间的约定,报文响应时间,超时处理,状态机闭环,各个厂家要求不一样。