Autosar --- CRC8 SAE J1850 CRC计算

2024-01-18 00:04
文章标签 计算 crc autosar sae crc8 j1850

本文主要是介绍Autosar --- CRC8 SAE J1850 CRC计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

        CRC计算一般用于通信中,用来保证一组数据的完整性。 发送方发送一组数据dataA+CRC检验码CRCa(CRC校验码由数据算出); 接收方接收到数据dataA+CRC校验码CRCa,接收方通过与发送方约定好的计算公式,计算出一个CRC校验码CRCb, 如果CRCa = CRCb,则表示这一帧数据没有被篡改。有时候为了保证数据的连续性,也会加上一个rolling count。

一、原理

CRC原理可以参考文章: CRC8算法的解读,以及在E2E通信保护的应用_crc8查表法-CSDN博客

二、Autosar 规范

下面的这些参数非常重要,完全决定了你的CRC值对不对

A:  CRC result width: 8bit

B:  Polynomial : 0x1D

C:  Initial value : 0xFF

D:  Input data reflected : NO

E:  Result data reflected : NO

F:  XOR value : 0xFF

三、Autosar示例验证

Autosar规范中给了一些例子,我将它分为7组

接下来我们打开下面的网页,针对上面规范中给出的参数,以及例子中的数据,我们进行一个校验。      CRC在线计算

图片里的ABCDEF与规范中的参数一一对应。 输入Autosar例子中的第一组数据,得出计算出来的结果与例子的一致。

四、CRC配置

4.1 Crc General

4.2 Crc Channels Configuration

五、Mcu

CRC时钟使能,如果选择Table计算的话,这里应该就不用配置了。如果选择硬件计算,那就要打开CRC的硬件时钟。

六、代码实现

6.1 代码实现

volatile uint32_t CrcResult1;

uint8 testdata1[3] = { 0xF2, 0x01, 0x83 };

CrcResult1 = Crc_CalculateCRC8(&testdata1[0], 3, 0U, TRUE);

6.2 Crc_CalculateCRC8函数讲解

uint8 Crc_CalculateCRC8(const uint8 *Crc_DataPtr, uint32 Crc_Length, uint8 Crc_StartValue8, boolean Crc_IsFirstCall)

参数1:要计算的数据源

参数2:计算几个字节的数据

参数3:start Value,  如果参数4为1,则忽略这个值。 如果参数4为0,那么计算的起始值则为这个数(这里看不懂没关系,下面会有例子详细的讲解)

参数4:True:第一次调用   FALSE: 后续调用

返回值: 计算的结果

这里使用autosar规范中例子2中数据参与计算,得出结果0x37,与规范一致。

函数Crc_CalculateCRC8()最终还是将要计算的数据,在下表中通过查表的方式计算出来。

Crc_lp_Lookup_Tables.c中:

6.3 Crc_CalculateCRC8参数3详解

6.3.1 参数4为TRUE

uint8 testdata1[3] = { 0xF2, 0x01, 0x83 };

CrcResult1 = Crc_CalculateCRC8(&testdata1[0], 3, 0U, TRUE);
CrcResult2 = Crc_CalculateCRC8(&testdata1[0], 3, 2U, TRUE);

当参数4为TRUE的时候,参数3的值是不起作用的,这时候上面计算出来的结果是一致的,如下:

6.3.2 参数4为FLASE

上面的例子跟计算结果好好地研究理解下,就能知道参数3跟4的用处了。

1:计算出table1的结果

2:计算出table2的结果

3:将table1和table2合在一起,生成table3,计算出table3的结果

4:计算出table3的前三个数据的结果,理论上跟1的结果一致

5:将参数4改为false, 参数3改为4的结果,那么就是将4的结果作为起始值,然后结算table3后四个数据的结果,理论上跟3出来的结果一致

6:6和5的区别就是参数4为false还是true, 证明了为true的时候,参数3不起作用。结果与2一致。

这篇关于Autosar --- CRC8 SAE J1850 CRC计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617581

相关文章

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

校验码:奇偶校验,CRC循环冗余校验,海明校验码

文章目录 奇偶校验码CRC循环冗余校验码海明校验码 奇偶校验码 码距:任何一种编码都由许多码字构成,任意两个码字之间最少变化的二进制位数就称为数据检验码的码距。 奇偶校验码的编码方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码。 奇校验:整个校验码中1的个数为奇数 偶校验:整个校验码中1的个数为偶数 奇偶校验,可检测1位(奇数位)的错误,不可纠错。

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

Java - BigDecimal 计算分位(百分位)

日常开发中,如果使用数据库来直接查询一组数据的分位数,就比较简单,直接使用对应的函数就可以了,例如:         PERCENT_RANK() OVER(PARTITION BY 分组列名 ORDER BY 目标列名) AS 目标列名_分位数         如果是需要在代码逻辑部分进行分位数的计算,就需要我们自己写一个工具类来支持计算了 import static ja

OpenStack离线Train版安装系列—2计算节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版