功能介绍
E2E,全称End to End,中文即端到端的通信保护,是一种针对安全相关数据,为防止通信链路中可能存在的故障(HW/SW), 在 通信节点 之间 执行的 一种数据保护协议/机制。其适用于多种网络结构:CAN、 CANFD、FlexRay、Ethernet等。本文根据最近的项目写个关于CAN网络的设计。
功能设计
硬件设计如上图,由SOC通过SPI通讯控制E2E的开关,MCU也可以返回E2E的开关状态给SOC。同时,MCU根据E2E开关状态打开或者关闭处理收发的CAN报文。
在特定报文的特定位置里面规定counter和checksum的位置,counter是每条报文都有自增的,每次加一个步长,如果步长为1就每次+1,步长为2就每次+2。checksum一般在最后面,根据checksum以外的其他内容计算得到,所以会有个指定的算法,由于count每次都变化,所以checksum也会跟着变化。
接收报文实现
实现的只有检查和记录错误,有几个的步骤:
1、检查接收到的报文是否有counter检查配置,如果是NULL则不需检查。配置里面有counter的范围(0-15),在报文当中的起始位、每次自增的步长、检查错误时调用的接口。
2、在接收到的报文当中按照位置提取count的值
3、跟上一次的值进行对比,计算出前后两次的差值,这个差值有两个地方要检查。一个是差值不能过大,过大证明丢帧很多次,这里一般会设置一个容错范围,一般是步长的3-5倍。另一个是差值不能为0,不然也认为是有错误。
4、存储本次的count,作为下一次的参考。
5、如果检查的结果没问题,就执行下一步。如果有错误,就调用检查错误时的接口,这个接口一般是用来记录count错误用的。
6、检查接收到的报文是否有checksum检查配置,如果是NULL则不需检查。配置里面有checksum在报文当中的起始位、检查错误时调用的接口。
7、在接收到的报文当中按照位置提取checksum的值
8、根据报文内容计算出checksum,跟从报文里面提取到的checksum进行对比,如果不一致则认为错误。
9、存储本次的checksum,作为下一次的参考。
10、如果检查的结果没问题,就执行下去。如果有错误,就调用检查错误时的接口,这个接口一般是用来记录checksum错误用的。
发送报文实现
实现的只有装载数据,有几个的步骤:
1、检查发送的报文是否有counter变化的配置,如果是NULL则不需处理。配置里面有counter的范围(0-15),在报文当中的起始位、每次自增的步长。
2、在发送到的报文当中按照位置装载 “上一次count + 步长” 的值
3、检查发送的报文是否有checksum计算配置,如果是NULL则不需处理。配置里面有checksum在报文当中的起始位。
4、根据checksum以外的报文内容计算出checksum的值装载到对应位置。
5、记录下本次发送的count和checksum。