0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CAPL编程的进阶应用 | Checksum算法的实现

北汇信息POLELINK 2022-10-11 09:29 次阅读

作者:北城旧巷
小编:吃不饱

CRC与Checksum区别

相信大家在CAN Msg或者ETH PDU中经常会看到Checksum这种信号。提到Checksum,就必须要说明一下CRC校验,很多工程师会概念混淆,认为两者是同一个东西,实则它们有很大的区别。

01

两者存放位置不同

CRC校验:循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。通过CRC概念可以得知,CRC存放在CRC场,而Checksum存放在数据场之中,一般在数据场的第一个字节或者最后一个字节。
28fc3230-486e-11ed-b116-dac502259ad0.png图1 标准数据帧格式

02

两者应用场景不同

在CAN报文帧中,CRC校验是发送器根据发送的bit进行多项式计算校验,结果放在15bit长度的CRC位。接收器也是用相同的多项式计算总线上的数据,与接收到的校验值进行比较,相同则表示帧正确接收,并在ACK时隙中发送显性状态,覆盖发送器的隐性位;如果不同接收节点在ACK界定符之后发送错误帧。
292be750-486e-11ed-b116-dac502259ad0.png图2 CRC校验原理CRC校验是为了保证数据从一个CAN收发器发送到另外一个收发器的信号完整性,而数据场中Checksum校验算法是为了校验数据被正确的打包与解包,并且Checksum算法是可以自行制定的,计算规则的灵活度高。

Checksum的应用场景

对于Checksum而言,它的应用场景有以下三点:

01

确保数据正确打包

有些ECU内部的变量在传递到CAN收发器之前就有可能发生错误,这种类型的错误CAN收发器是无法检测到的。报文中的信号和Checksum校验是在应用层完成的,将报文中的各个字节进行校验,报文和Checksum一起发送,并且在接收节点进行解析,从而确保数据链路完整和数据正确打包。

01

实现数据加密

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信号的仿真。
294e6bfe-486e-11ed-b116-dac502259ad0.png图3 LiveCounter计算代码下图为示例报文中各个信号位置排布关系,在此报文中,Checksum校验方式为前七个字节异或运算,将运算结果存放到最后一个字节。排布图中共有8个信号,它们的格式为Motorola格式,也就是俗称的大端模式。
296dd994-486e-11ed-b116-dac502259ad0.png图4 报文中信号排布

CAPL只能访问到报文中的信号,无法访问到报文中的每个字节,要进行Checksum计算,需要根据信号排布把前七个字节的真实值重新组合存放在一个byte类型的数组当中,然后对这个数组异或运算获取的结果为该报文中Checksum信号值。

对于不同长度的信号,需要声明不同类型的数组来存放不同的信号。byte类型长度为1字节,声明两个byte *[8]类型的数组(*为省略的数组名称)分别存放长度小于一字节的信号和重组后每个字节的真实值;int类型长度为2字节,声明int *[8]类型的数组存放长度为1-2字节的信号;long类型长度为4字节,声明long *[8]类型的数组存放长度为2-4字节的信号。下图为Checksum中信号长度小于1字节的字节重组示例代码。
29a81b4a-486e-11ed-b116-dac502259ad0.png图5 Checksum字节重组示例代码另外,参与Checksum计算的是信号的真实值而不是物理值,如果信号中有偏移量和比例因子,在赋值时需要将信号加上偏移量,并除以比例因子以获得真实值。
2a24616e-486e-11ed-b116-dac502259ad0.png图6 信号描述为了保证和真实控制器通信正常,Checksum数据必须准确,Checksum计算步骤一般写成无返回值函数(void),在LiveCounter信号改变或者其他信号改变时调用计算。正确计算的LiveCounter和Checksum信号曲线如下图所示。
2a3c4aea-486e-11ed-b116-dac502259ad0.png图7 LiveCounter和Checksum信号曲线

总结

本文重点描述了CRC和Checksum信号的区别以及Checksum信号在CAPL中实现的方法。CAPL编程作为CANoe的灵魂,使CANoe满足仿真、分析、测试和诊断的各种复杂的要求,同时使CANoe的功能得以不断扩展。
北汇信息作为Vector中国的合作伙伴,致力于为中国汽车客户提供优质的工具支持、解决方案以及测试服务。

注:图片来自于Vector。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3595

    浏览量

    93606
收藏 人收藏

    评论

    相关推荐

    【「从算法到电路—数字芯片算法的电路实现」阅读体验】+内容简介

    内容简介这是一本深入解读基础算法及其电路设计,以打通算法研发到数字IC设计的实现屏障,以及指导芯片设计工程师从底层掌握复杂电路设计与优化方法为目标的专业技术书。任何芯片(如WiFi芯片、5G芯片
    发表于 11-21 17:14

    【「从算法到电路—数字芯片算法的电路实现」阅读体验】+一本介绍基础硬件算法模块实现的好书

    作为嵌入式开发者往往比较关注硬件和软件的协调。本书介绍了除法器,信号发生器,滤波器,分频器等基本算法的电路实现,虽然都是基础内容,但是也是最常用到的基本模块,本书的内容比较对本人胃口。 我们先来
    发表于 11-20 13:42

    C加密算法实现

    电子发烧友网站提供《C加密算法实现.pdf》资料免费下载
    发表于 09-20 11:10 1次下载
    C加密<b class='flag-5'>算法</b>的<b class='flag-5'>实现</b>

    TI电量计Checksum功能的介绍

    电子发烧友网站提供《TI电量计Checksum功能的介绍.pdf》资料免费下载
    发表于 09-05 11:19 0次下载
    TI电量计<b class='flag-5'>Checksum</b>功能的介绍

    神经网络的基本原理及Python编程实现

    神经网络作为深度学习算法的基本构建模块,模拟了人脑的行为,通过互相连接的节点(也称为“神经元”)实现对输入数据的处理、模式识别和结果预测等功能。本文将深入探讨神经网络的基本原理,并结合Python编程
    的头像 发表于 07-03 16:11 529次阅读

    FPGA能实现什么样的算法

    FPGA功能如此强大,请问用FPGA能实现或者比较适合实现什么样的算法
    发表于 05-26 20:18

    CAPL脚本使用介绍

    CAPL中也有类似于C语言中的回调函数的机制,如检测报文周期和错误帧的函数中就可以使用,当周期超界或者总线出现错误帧就会自动调用回调函数执行一些操作
    的头像 发表于 04-01 11:23 1528次阅读

    使用ST-LINK Utility进行编程勾选Full Flash Memory Checksum和设置读出保护后LSE不起振的原因?

    使用ST-LINK Utility对F105RB进行编程,在编程中勾选了Full Flash Memory Checksum,最后操作OP字节设置读出保护,发现LSE晶振不起振了,而没有勾选的全部
    发表于 03-12 06:35

    RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验

    RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验
    的头像 发表于 02-20 14:10 640次阅读
    RK3568驱动指南|驱动基础<b class='flag-5'>进阶</b>篇-<b class='flag-5'>进阶</b>5 自定义<b class='flag-5'>实现</b>insmod命令实验

    求助,关于PSOC4模拟EEPROM的checksum问题求解

    咨询个问题,当我们用PSOC4的Em_EEPROM组件时,工程生成的Hex1文件的checksum是不包含了EEPROM的部分吧(通过Custom Linker Script调用cm0gcc.ld
    发表于 02-02 08:48

    RK3568驱动指南|驱动基础进阶篇-进阶8 内核运行ko文件总结

    RK3568驱动指南|驱动基础进阶篇-进阶8 内核运行ko文件总结
    的头像 发表于 01-31 14:58 1101次阅读
    RK3568驱动指南|驱动基础<b class='flag-5'>进阶</b>篇-<b class='flag-5'>进阶</b>8 内核运行ko文件总结

    在IAR Embedded Workbench中计算多个地址区间的Checksum

    。但是在IDE里面的Linker > Checksum选项里面只能配置一个地址区间并且只能生成一个Checksum。如果有多个地址空间,那么IDE里面的Linker > Checksum选项没有办法满足需求,需要使用命令行的方式
    的头像 发表于 01-05 12:33 1457次阅读
    在IAR Embedded Workbench中计算多个地址区间的<b class='flag-5'>Checksum</b>

    虹科技术|保障数据传输稳定性:BabyLIN产品的CRC算法实现

    文章将以CRC8校验为例,介绍在BabyLIN产品中如何使用CRC校验算法。 CRC校验原理 在CAN报文中,增加Checksum校验,能够用来检测和校验数据传输或保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。CRC8校验
    的头像 发表于 01-02 10:45 465次阅读
    虹科技术|保障数据传输稳定性:BabyLIN产品的CRC<b class='flag-5'>算法</b><b class='flag-5'>实现</b>

    浮点LMS算法的FPGA实现

    引言 LMS(最小均方)算法因其收敛速度快及算法实现简单等特点在自适应滤波器、自适应天线阵技术等领域得到了十分广泛的应用。为了发挥算法的最佳性能,必须采用具有大动态范围及运算精度的浮点
    的头像 发表于 12-21 16:40 734次阅读

    你了解步进阶梯指令吗?

    进阶梯指令是一种在编程中常用的控制结构,它允许程序按照一定的顺序执行一系列操作。
    的头像 发表于 12-14 17:17 878次阅读
    你了解步<b class='flag-5'>进阶</b>梯指令吗?