crc与checksum区别
相信大家在can msg或者eth pdu中经常会看到checksum这种信号。提到checksum,就必须要说明一下crc校验,很多工程师会概念混淆,认为两者是同一个东西,实则它们有很大的区别。
01两者存放位置不同
crc校验:循环冗余检查(crc)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
通过crc概念可以得知,crc存放在crc场,而checksum存放在数据场之中,一般在数据场的第一个字节或者最后一个字节。
图1 标准数据帧格式
02两者应用场景不同
在can报文帧中,crc校验是发送器根据发送的bit进行多项式计算校验,结果放在15bit长度的crc位。接收器也是用相同的多项式计算总线上的数据,与接收到的校验值进行比较,相同则表示帧正确接收,并在ack时隙中发送显性状态,覆盖发送器的隐性位;如果不同接收节点在ack界定符之后发送错误帧。
图2 crc校验原理
crc校验是为了保证数据从一个can收发器发送到另外一个收发器的信号完整性,而数据场中checksum校验算法是为了校验数据被正确的打包与解包,并且checksum算法是可以自行制定的,计算规则的灵活度高。
checksum的应用场景
对于checksum而言,它的应用场景有以下三点:
01确保数据正确打包
有些ecu内部的变量在传递到can收发器之前就有可能发生错误,这种类型的错误can收发器是无法检测到的。报文中的信号和checksum校验是在应用层完成的,将报文中的各个字节进行校验,报文和checksum一起发送,并且在接收节点进行解析,从而确保数据链路完整和数据正确打包。
02实现数据加密
can网络是开放性的,can节点可以随时加入到总线当中,为了保证通信的安全性,ecu传输的关键控制信号需要进行加密,报文的发送方和接收方使用相同的checksum算法作为数据加密的密钥。接收方对比秘钥,如果不同,此条报文的数据不被使用,从而避免被其他节点的数据影响。checksum算法不在dbc等数据库文件中说明,可以单独保密,从而确保了数据的加密。
03提高数据的可信度
一帧报文在多个字节中可能出现位错误,一般情况下crc8校验的错误率为1/256,crc16校验的错误率为1/65536,crc32校验的错误率为1/(65536*65536)。通过checksum校验可以提高数据的可信度。
由于checksum的作用,其也常应用在车载以太网当中。
在capl中checksum信号实现
通常情况下,checksum和livecounter信号是成对出现的。在canoe中使用仿真节点与真实控制器交互,需要将livecounter和checksum信号仿真,这样才能成功通信。livecounter长度为4bit,它是用于报文发送计数的生命信号,每发送一帧报文后就对该livecounter位加1,会在0~15之间循环增加。在报文其他信号没有改变时,livecounter实时更新使得checksum信号跟着更新,提高校验的准确性。那么livecounter信号该如何仿真呢?下面以can总线dbc为例,介绍在capl中实现livecounter和checksum校验仿真。
capl是canoe和canalyzer中可用的类c的编程语言。capl中程序块的执行由事件控制,在专用的编译器中开发和编译,这样可以访问数据库中的所有对象以及系统变量,被汽车电子工程师们广泛使用。
下图为livecounter计算的代码,为了保证数据的准确性,进行一次checksum计算,这样就可以实现livecounter信号的仿真。
图3 livecounter计算代码
下图为示例报文中各个信号位置排布关系,在此报文中,checksum校验方式为前七个字节异或运算,将运算结果存放到最后一个字节。排布图中共有8个信号,它们的格式为motorola格式,也就是俗称的大端模式。
图4 报文中信号排布
capl只能访问到报文中的信号,无法访问到报文中的每个字节,要进行checksum计算,需要根据信号排布把前七个字节的真实值重新组合存放在一个byte类型的数组当中,然后对这个数组异或运算获取的结果为该报文中checksum信号值。
对于不同长度的信号,需要声明不同类型的数组来存放不同的信号。byte类型长度为1字节,声明两个byte *[8]类型的数组(*为省略的数组名称)分别存放长度小于一字节的信号和重组后每个字节的真实值;int类型长度为2字节,声明int *[8]类型的数组存放长度为1-2字节的信号;long类型长度为4字节,声明long *[8]类型的数组存放长度为2-4字节的信号。下图为checksum中信号长度小于1字节的字节重组示例代码。
图5 checksum字节重组示例代码
另外,参与checksum计算的是信号的真实值而不是物理值,如果信号中有偏移量和比例因子,在赋值时需要将信号加上偏移量,并除以比例因子以获得真实值。
图6 信号描述
为了保证和真实控制器通信正常,checksum数据必须准确,checksum计算步骤一般写成无返回值函数(void),在livecounter信号改变或者其他信号改变时调用计算。
正确计算的livecounter和checksum信号曲线如下图所示。
图7 livecounter和checksum信号曲线
总结
本文重点描述了crc和checksum信号的区别以及checksum信号在capl中实现的方法。capl编程作为canoe的灵魂,使canoe满足仿真、分析、测试和诊断的各种复杂的要求,同时使canoe的功能得以不断扩展。
北汇信息作为vector中国的合作伙伴,致力于为中国汽车客户提供优质的工具支持、解决方案以及测试服务。
注:图片来自于vector。
怎样修复Fusion 360中的自相交T样条错误
基于库函数的SD卡硬件驱动层代码实现方案
四川高温热到限电 宁德时代被迫停产
WinRAR目录穿越漏洞快速解决方案
人工智能时代与教育的融合
CRC和Checksum信号的区别 Checksum信号在CAPL中实现的方法
联想扬天S550开启预售 到手价3499元
开发中如何实现生成订单超时未支付自动取消
小米手机第一次涨价!米粉表示强烈支持!
如何选购传感器,应综合多个方面因素来考虑
你会让LED来关注你的皮肤健康吗?
患者监护中的经胸阻抗测量
MDD辰达半导体携全新产品亮相深圳慕尼黑华南电子展
中国正寻求打破美国在芯片设计工具领域近乎垄断的局面
影像游戏双重升级, OPPO Reno5 Pro+登场
TI家电领域电机驱动分类及应用介绍
AR智能眼镜的商业机会即将到来
传统封测厂的先进封装有哪些
【开源代码】-基于国民N32G45x系列MCU使用JLINK的开发组件工具-RTT Viewer 调试打印
虚拟电厂系统总体架构设计方案