总线竞争
总线竞争解决的是在同一时间,多个节点同时向总线发送消息的问题。解决的方法是通过帧id号进行仲裁,仲裁出本次发送消息的节点。
能够通过id来进行总线竞争的原因:
1 总线遵循与逻辑;0为显性,1位隐性;
2 每个 节点在发送ID号时,会监听总线电平
竞争法则:
发送方发送信息 | can总线 | 结果 |
---|---|---|
0 | 0 | 继续 |
0 | 1 | 报错 |
1 | 1 | 继续 |
1 | 0 | 竞争失败,转为接受方 |
通过竞争失败的节点:
首先,该节点会主动检测在总线空闲的第一时间再次尝试发送数据包;
同时,竞争失败带来的风险是,当网络负载率很高时,也就是消息很多时,低优先级的消息由于难以取得发送资格延迟很久才能发送。
竞争流程图如下所示:
数据保护
为了防止数据包丢失,通常从物理结构和总线错误检测,错误处理和错误跟踪几方面来保证数据正常发送接收。
物理设计
1 采用NZR编码模式,NZR编码模式如下图一所示。如图中所示,其主要特点是,其高低电平变化频率比起曼彻斯特编码高低电平变化频率低很多,会有效降低数据被干扰。
2 采用每米扭转30次的双绞线的形式,通过差分信号来有效消除共模干扰。
3 高速CAN收发器添加终端电阻来有效消除高频传输时,传输末端的反射。
总线逻辑错误检测机制
接受点检测:
1 检测是否有位填充错误,出现6个同极性位就报错。我们说过,为了帧同步采用如果连续出现5个同极性就添加反极性的机制。
2 检测CRC场,ack场,以及EOF是否出现隐形界定符。
3 比对接受方生成的CRC值与发送方填写的CRC值是否一致。
发送方检测:
1 发送方向总线发送显性位,发送方会对总线位进行检测,如果收到隐形位就报错。
2 接收方在收到消息后会在ack应答位给出一个显性电平,如果发送方检测到该位隐性,则报错。
通过以上5种检测机制,可以覆盖整个数据帧每个位检测。
总线逻辑错误处理机制
错误处理机制原则是,检测到错误的节点会让其他所有节点均知道此刻有一个错误。主要是发送错误帧来进行错误处理。
错误帧是通过六个显性电平,制造一种位错误填充机制。
通常第一个errorflag是由发现错误的节点发送的,它发送完后就继续发送错误界定符,直到总线出现连续的8个隐性位则错误帧发送完毕,这是因为错误界定符是由8bit隐性位构成。
第二个errorflag是由第一个errorflag引起的,由其他的节点发送,该区域可能会和第一个errorflag区域重叠,这是因为第一个errorflag 还没有发送完,总线就已经形成了六个显性位,从而触发其他节点发送errorflag。
错误跟踪机制
为了避免总线被永久错误节点卡死,比如,这个节点由于本身的原因一直在报错,导致总线没法正常发送了,需要一种机制来进行鉴别并限制其功能,即错误跟踪机制。
节点状态 | 特点 |
---|---|
error active | 默认初始状态,节点发现错误后会很积极主动地上报错误 |
error passive | 当TEC or REC 计数超过127就进入此状态,此时,该节点发现错误后只会发送6个隐性位,不会把错误广播出去,并且,发送连续帧时,中间必须间隔8bit的延缓时间 |
bus off | controller挂了,或者TEC大于255,就会进入这个状态,需要重启,或者等待128个11位隐性位电平离开此状态 |
发送错误计数器和接受错误计数器计数规则
计数器 | 计数规则 |
---|---|
发送错误计数器 | 节点成功发送一条消息 -1 同时,若检测到错误,如果是该节点是发送方,+8 |
接收错误计数器 | 成功接受一条消息 -1 同时,检测到错误,如果该节点是接收方+1,如果是引起错误的接收方 +8 |
CAN通讯协议从发送到接受数据,到错误检测、处理跟踪,以及数据保护做了全面深入的工作。
以上为个人整理理解,如有错误和补充,请批评指正。