YTM32的循环冗余校验CRC外设模块详解

news2024/11/18 13:26:34

YTM32的循环冗余校验CRC外设模块详解

文章目录

  • YTM32的循环冗余校验CRC外设模块详解
    • 引言
    • 原理与机制
      • CRC算法简介
      • 从CRC算法到CRC硬件外设
    • 应用要点(软件)
      • CRC16 用例
      • CRC32 用例
    • 总结
    • 参考文献

引言

在串行通信帧中,为了保证数据在传输过程中的完整性,通常采用一种指定的算法对原始数据进行计算,得出的一个校验值。接收方接收到数据时,采用同样的校验算法对原始数据进行计算,若计算结果和接收到的校验值一致,说明数据校验正确,该帧数据可用,若不一致,说明传输过程中出现了差错,丢弃该帧数据,请求重发。常用的校验算法有奇偶校验、校验和、CRC,还有LRC、BCC等不常用的校验算法。

在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。

YTM32B1ME微控制器中提供了硬件的CRC计算引擎,用以加速和简化用户程序中的CRC运算。值得注意的是,YTM32B1ME微控制器中还集成了SENT通信外设,SENT通信协议中也用到了CRC校验。可以想见,在具体应用中,CRC外设可以配合SENT外设,或者其他在协议中使用CRC校验算法的通信过程提供硬件计算引擎的支持。

YTM32的硬件CRC外设模块,用户通过AHB总线向CRC外设送数参与计算,然后通过AHB总线送出实时的计算结果。CRC外设内部实现了CRC4(CRC-ITU)、CRC16(CRC-CCITT)、CRC32(CRC-ethernet)等多项算式的计算引擎,并可配置输出和输出数据的位交换,通过8b、16b、32b等带宽方式,向CRC计算引擎送数。如图x所示。

在这里插入图片描述

图x CRC外设系统框图

原理与机制

CRC算法简介

CRC的全称是循环冗余校验(Cyclic Redundancy Check),其目的是保证数据的完整性,具体应用方法,是在发送数据的后面再补充若干位的数据,使得接收方使用同样的CRC计算方法,检查接收到的数据的CRC计算结果是否为0,从而判定接收数据的完整性。

CRC的核心算法,就是通过一串“发送数据”,来计算“需要补充的若干数据”。CRC的计算过程是用除法求余数。不同于十进制的除法运算,CRC用的是2进制的除法运算,2进制的除法运算,属于模2运算,模2运算的特点是:没有进位

  • 模2加法:0+0=0,0+1=1,1+0=1,1+1=0。
  • 模2减法:0-0=0,0-1=1,1-0=1,1-1=0。模2加减法实际上就是异或操作,这也是CRC很容易在实际中应用的数学基础。
  • 模2乘法:0x0=0,0x1=0,1x0=0,1x1=1。
  • 模2除法:是模2乘法的逆运算,参见下图示例。

在这里插入图片描述

图x 模2除法

通过除法算式可以形象地想见,当将一串输入数据,再在右侧补入N个空位,作为被除数,除以CRC多项式所表示的N位除数时,若不能除尽,则在除法竖式的最后一个环节,在最右边产生一个同补入空位同位宽的余数,那这个余数就是CRC的计算结果。此处用一个例子说明CRC的计算过程。如图x所示。
在这里插入图片描述

图x CRC8计算用例

在这个算例中:

  • CRC8的多项式是x8+x2+x+1,对应的除数就是二进制数100000111
  • 被除数是0x1C,转化成二进制就是00011100
  • CRC8为8位,被除数后面补8个0,也同时对应CRC计算的结果也是8位
  • 最后的计算结果是0x54

在CRC解算时,若将CRC计算的结果换入补充的空位,在进行CRC计算,相当于是将之前CRC计算的余数同自己相加,根据CRC计算的加法中0+0=11+1=0的规则,刚好可以得到0的计算结果,从而验证数据在传输过程的完整性。

使用在线的计算器(http://www.ip33.com/crc.html),也能算得同样的结果。如图x所示。

在这里插入图片描述

图x 使用在线CRC计算器

细心的读者可能看到了,这里面还有初始值结果异或值输入数据反转输出数据反转,这些名词都是指什么呢?

  • 初始值,是给CRC计算前提供一个初始值(Offset,预计算值),大部分情况下设定为0,也可以根据选定的特定算法指定其他值,有时也被称为CRC计算的种子(Seed)。结果异或值,是把计算结果再异或某一个值。使用初始值和结果异或值,的目的是防止在某个计算环节中,算得全0的中间结果,导致后续的CRC余数一直为0。
  • 输入数据反转,是指输入数据以字节为单位按位逆序处理;输出数据反转,是指CRC计算结果整体按位逆序处理;这么做的目的(一个合理的解释)是右移比左移更容易计算,效率高,它跟大小端无关。

特别注意,最基本的计算过程大多不需要额外设定这些参数(配置成false或者0即可),但有些面向典型应用的场景,会对应一些特别配置组合(典型配置),产生了不同的算法。如图x所示。

在这里插入图片描述

图x 多种不同的CRC计算配置

从CRC算法到CRC硬件外设

示例CRC计算的过程中,使用的是1个8位的数作为被除数,但实际计算数据帧的数据大多是一个数组,这个扩展过程,可以理解为将整个数据帧的一串数据并排放在一起,当成一个大数进行计算。实际上,CRC的除法计算,也是一个串行移位的计算过程,可以从左边算到右边。在使用CRC硬件外设进行计算时,对应可以逐个向CRC_DATA寄存器中送数,CRC会使用上次计算结果和新送入的数据位,得到本次计算的结果,并继续参与后续的计算。CRC硬件外设的CRC_DATA寄存器,支持用户已8位、16位、32位的位宽向CRC计算引擎送数。

YTM32的硬件CRC支持三种算式:

在这里插入图片描述

CRC硬件外设可以配置初始值(种子,寄存器CRC_INIT),支持输入和数据的位序反转,不支结果持异或计算,但支持结果位翻转。通过结果寄存器CRC_RESULT可以读取实时计算的结果。

需要注意的是,YTM32手册上列写的支持CRC多项式的名字,主要还是描述算子,硬件还是使用基本算法执行计算。若需要使用某些具体算法配套特定的位序反转、初始值等,还是需要用户自行配置CRC硬件外设。

应用要点(软件)

arm-mcu-sdk软件仓库中,为ytm_crc_0驱动设计的样例工程crc_basic中,设计了计算CRC-16和CRC-32的演示用例。

CRC16 用例

crc16_test用例中,实现计算数列{0x1234, 0x5678, 0x5A5A, 0xA5A5}的CRC16值,有源码如下 :

CRC_Init_Type crc16_ccitt = 
{
    .EnableOutputBitInv = false,
    .EnableOutputBitSwap = false,
    .EnableInputBitSwap = false,
    .CalcMode = CRC_CalcMode_Crc16,
    .InitData = 0x0000
};

#define CRC_DATA_LEN  4u
const uint16_t crc16_data_arr[CRC_DATA_LEN] = {0x1234, 0x5678, 0x5A5A, 0xA5A5};
#define CRC16_RESULT 0x4BDCu  /* The result CRC calculator with CCITT 32 bits standard. */

void crc16_test(void)
{
    /* setup the crc calculator. */
	CRC_Init(BOARD_CRC_PORT, &crc16_ccitt);
	
	for (uint32_t i = 0u; i < CRC_DATA_LEN; i++)
	{
	    CRC_SetData16b(BOARD_CRC_PORT, crc16_data_arr[i]);
	}
	
	printf("crc16_test ... ");
	if (CRC16_RESULT == CRC_GetResult(BOARD_CRC_PORT))
	{
		printf("succ.");
	}
	else
	{
		printf("fail.");
	}
	printf("\r\n");
}

使用在线的CRC计算器计算,可以得到相同的计算结果。如图x所示。

在这里插入图片描述

图x CRC在线计算器计算CRC16

这里要注意,CRC在线计算器中定义的CRC-16/CCITT是输入数据反转和输出数据反转的,而样例代码中指定的crc16_ccitt配置参数,实际对应CRC在线计算器的CRC-16/XMODEM计算配置。如果在样例代码中,设定配置参数.EnableOutputBitSwap = true.EnableInputBitSwap = true,也可以得到同CRC在线计算器定义的CRC-16/CCITT算式相同的计算结果。

这里显然对算式的名字存在了误解。开发者如果不确定各名字预设的配置,也可以使用“自定义”的参数模型,此时可人为指定各参数。如图x所示。

在这里插入图片描述

图x 配置CRC在线计算式使用自定义的参数模型

CRC32 用例

crc32_test用例中,实现计算数列{0x12345678, 0x56781234, 0x55AA55AA, 0xA5A5A5A5}的CRC32值,有源码如下 :

CRC_Init_Type crc32_enet  =
{
    .EnableOutputBitInv = false,
    .EnableOutputBitSwap = false,
    .EnableInputBitSwap = false,
    .CalcMode = CRC_CalcMode_Crc32,
    .InitData = 0xffffffff
};

#define CRC_DATA_LEN  4u
const uint32_t crc32_data_arr[CRC_DATA_LEN] = {0x12345678, 0x56781234, 0x55AA55AA, 0xA5A5A5A5};
#define CRC32_RESULT   (0x57738169U) /* The result CRC calculator with CRC-32 standard. */

void crc32_test(void)
{
    /* setup the crc calculator. */
	CRC_Init(BOARD_CRC_PORT, &crc32_enet);
	
	for (uint32_t i = 0u; i < CRC_DATA_LEN; i++)
	{
	    CRC_SetData(BOARD_CRC_PORT, crc32_data_arr[i]);
	}
	
	printf("crc32_test ... ");
	if (CRC32_RESULT == CRC_GetResult(BOARD_CRC_PORT))
	{
		printf("succ.");
	}
	else
	{
		printf("fail.");
	}
	printf("\r\n");
}

使用在线的CRC计算器计算,可以得到相同的计算结果。如图x所示。

在这里插入图片描述

图x CRC在线计算器计算CRC16

总结

YTM32的CRC硬件外设模块能够执行CRC计算,同在线CRC计算器的结果能够对应上。

YTM32的手册中描述的CRC16-CCITTCRC32-ENET等对CRC计算典型配置的别称,实际可不必参考。CRC硬件外设的中CRC计算引擎还是执行基本CRC计算,典型配置实际可通过配置相关计算寄存器位的实现,最终可以支持各种各样的CRC典型算式。

参考文献

  • YTM32B1MEx.pdf
  • 史上解释CRC最清楚的文章
    https://zhuanlan.zhihu.com/p/396165368
  • CRC校验原理及实现
    https://zhuanlan.zhihu.com/p/256487370
  • 关于校验和:此CRC实现对具有种子值意味着什么?
    https://www.codenong.com/30654238/
  • arm-mcu-sdk,一个基于众多arm核MCU的驱动软件仓库,勇哥的SDK设计与开发的试验场
    https://gitee.com/suyong_yq/arm-mcu-sdk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1204877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尝试使用php给pdf添加水印

在开发中增加pdf水印的功能是很常见的&#xff0c;经过实验发现这中间还是会有很多问题的。第一种模式&#xff0c;采用生成图片的方式把需要添加的内容保存成图片&#xff0c;再将图片加到pdf中间&#xff0c;这种方法略麻烦一些&#xff0c;不过可以解决中文乱码的问题&#…

【MySQL】库的相关操作 + 库的备份和还原

库的操作 前言正式开始创建数据库删除数据库编码集查看系统默认字符集以及校验规则字符集校验规则 所有支持的字符集和校验规则所有字符集所有校验规则 指明字符集和校验规则创建数据库相同的字符集用不同的校验规则读取会出现什么情况 alter修改数据库show create databasealt…

全国各区县平均降水月数据!多时间版本可查询

本周给大家推荐一些环境监测数据~ 今天分享的是全国平均降水数据~ 全国平均降水是指全国各个地区降水的平均值。这个值是通过收集和统计全国各地的降雨和降雪数据得出的。由于各地的气候条件和地形不同&#xff0c;因此全国平均降水并不是简单的平均数&#xff0c;而是根据各…

lora微调模版

lora微调模版 1、版一&#xff1a;使用peft包的lora微调&#xff08;1&#xff09;设置超参方式一&#xff1a;代码中设置&#xff08;便于debug&#xff09;方式二&#xff1a; .sh文件指定 &#xff08;2&#xff09;加载数据集I、对应的.jsonl或json文件, 原始格式为&#x…

【Linux】第十三站:进程状态

文章目录 一、进程状态1.运行状态2.阻塞状态3.挂起状态 二、具体Linux中的进程状态1.Linux中的状态2.R状态3.S状态4.D状态5.T、t状态6.X状态(dead)7.Z状态&#xff08;zombie&#xff09;8.僵尸进程总结9.孤儿进程总结 一、进程状态 在我们一般的操作系统学科中&#xff0c;它…

基于springboot实现家具商城管理系统项目【项目源码】

基于springboot实现家具商城系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的优势…

Linux学习第41天:Linux SPI 驱动实验(二):乾坤大挪移

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图如下&#xff1a; 二、I.MX6U SPI主机驱动分析 主机驱动一般都是由SOC厂商写好的。不作为重点需要掌握的内容。 三、SPI设备驱动编写流程 1、SP…

Unity中Shader的雾效

文章目录 前言一、Unity中的雾效在哪开启二、Unity中不同种类雾的区别1、线性雾2、指数雾1&#xff08;推荐用这个&#xff0c;兼具效果和性能&#xff09;3、指数雾2&#xff08;效果更真实&#xff0c;性能消耗多&#xff09; 三、在我们自己的Shader中实现判断&#xff0c;是…

Java常用类和基础API

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

Spark SQL 每年的1月1日算当年的第一个自然周, 给出日期,计算是本年的第几周

一、问题 按每年的1月1日算当年的第一个自然周 (遇到跨年也不管&#xff0c;如果1月1日是周三&#xff0c;那么到1月5号&#xff08;周日&#xff09;算是本年的第一个自然周, 如果按周一是一周的第一天) 计算是本年的第几周&#xff0c;那么 spark sql 如何写 ? 二、分析 …

蓝桥杯 插入排序

插入排序的思想 插入排序是一种简单直观的排序算法&#xff0c;其基本思想是将待排序的元素逐个插入到已排序序列 的合适位置中&#xff0c;使得已排序序列逐渐扩大&#xff0c;从而逐步构建有序序列&#xff0c;最终得到完全有序的序 列。 它类似于我们打扑克牌时的排序方式&…

缅因州政府通知130万人MOVEit数据泄露事件

大家好&#xff0c;今天我要向大家通报一个令人震惊的消息&#xff1a;缅因州政府的系统遭到了入侵&#xff0c;黑客利用MOVEit文件传输工具的漏洞&#xff0c;获取了约130万人的个人信息&#xff0c;这几乎相当于该州的整个人口数量。 MOVEit攻击是Clop勒索软件团伙进行的一次…

数据结构(超详细讲解!!)第二十三节 树型结构

1.定义 树型结构是一类重要的非线性数据结构&#xff0c;是以分支关系定义的层次结构。是一种一对多的逻辑关系。 树型结构是结点之间有分支&#xff0c;并且具有层次关系的结构&#xff0c;它非常类似于自然界中的树。树结构在客观世界中是大量存在的&#xff0c;例如家谱、…

nginx代理docker容器服务

场景描述 避免暴力服务端口&#xff0c;使用nginx代理 一个前端&#xff0c;一个后端&#xff0c;docker方式部署到服务器&#xff0c;使用docker创建的nginx代理端口请求到前端端口 过程 1 docker 安装nginx 1.1 安装一个指定版本的nginx docker pull nginx#启动一个ngi…

【MySQL】对表结构进行增删查改的操作

表的操作 前言正式开始建表查看表show tables;desc xxx;show create table xxx; 修改表修改表名 rename to对表结构进行修改新增一个列 add 对指定列的属性做修改 modify修改列名 change 删除某列 drop 删除表 drop 前言 前一篇讲了库相关的操作&#xff0c;如果你不太懂&…

麒麟信安:助力医疗行业操作系统自主创新,提升可靠性与安全性

应用场景 湖南省康复医院是省卫生健康委直属公立三级康复医院&#xff0c;也是全省唯一一所集预防、医疗、康复、科研、教学、健康管理为一体的省级三级公立康复医院。 湖南省康复医院使用的医慧管平台由湖南蓝途方鼎科技有限公司开发&#xff0c;利用互联网技术&#xff0c;…

好题分享(2023.11.5——2023.11.11)

目录 前情回顾&#xff1a; 前言&#xff1a; 题目一&#xff1a;补充《移除链表元素》 题目二&#xff1a;《反转链表》 解法一&#xff1a;三指针法 解法二&#xff1a;头插法 题目三&#xff1a; 《相交链表》 题目四&#xff1a;《合并两个有序数列》 题目五&…

vmware 修改主机名称 hadoop 服务器环境配置(一)

如何在虚拟机配置主机名称&#xff1a; 1. 如图所示在/etc 文件夹下有个hosts文件。追加映射关系&#xff1a; #关系 ip地址 名称 192.168.164.20 hadoop20 2. 保存后&#xff0c;重启reboot即可

炸裂!Sklearn 的 10 个宝藏级使用方法!

大家好&#xff0c;本次给大家介绍10个Sklearn方法&#xff0c;比较小众但非常好用。 1️.FunctionTransformer 虽然Sklearn中有很多内置的预处理操作可以放进pipeline管道&#xff0c;但很多时候并不能满足我们的需求。 如果是比较简单并且通过一个函数可以实现需求的情况&…

考前须知-2024年上半年系统集成项目管理工程师

可以看看23年下半年软考集成考试的难度 一、考试时间安排&#xff1a; 集成考试一年会考2次&#xff0c;上半年一次、下半年一次。考试时间4h&#xff0c;分批进行 系统集成项目管理工程师教材共655页&#xff0c;分为23章。其中,前3章为信息化与系统集成基础知识的内容,第4章…