CAN总线的CRC校验

  • 1.CRC原理
    • 1.1生成多项式
    • 1.2通讯校验的过程
    • 1.3CAN总线中使用的生成多项式
  • 2.CRC串行实现
  • 3.CRC并行实现
    • 3.1CRC模2运算及LFSR实现
    • 3.2CRC代码实现
  • 4.CRC生成工具
  • 5.参考文章

1.CRC原理

1.1生成多项式

理解CRC校验,首先需要了解生成多项式的概念,生成多项式也就是发送方和接受方约定的一个除数而已,发送方和接收方都使用这一个相同的除数进行模2运算,计算结果相同则说明传输数据没有问题,而如果计算结果不同可能传输的数据就出现了问题,目的就是为了保证数据传输的可靠性。

上面提到的模二计算本质上就是异或运算,相同的位为0,不同的位为1,也就是不考虑进位、错位的二进制加减法运算,例如:10011011 + 11001010 = 01010001.

常见的生成多项式:

CRC8 = X8 + X5 + X4 +1

CRC16 = X16 + X15 + X5 +1

CRC12 = X12 + X11 + X3 + X2 + 1

CRC32 = X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1

每一个生成多项式都是与一个代码相对应的,比如CRC8对应的代码就是100110001

1.2通讯校验的过程

假设被处理的报文的多项式为P(X),收发双方约定的多项式为G(X),使用P(X)除以G(X)求得余数多项式R(X),并将余数多项式R(X)附加到被处理报文多项式P(X)后,生成M(X),按照此计算,M(X)除以G(X)的余数应该是0,然后将M(X)发送给接收方,假设接收方接收的报文为N(X),除以同样的除数G(X),余数应该也是零,如果结果为零说明发送和接收序列一致,否则传输出现了问题。

举例说明:

假设待发送的信息为1011001,对应的多项式为X6+X4+X3=1,若选取约定多项式为G(X)=X4+X3+1,其对应的代码为11001,然后使用模二算法求出余数多项式,如下所示:

求余数之前需要将发送消息的生成多项式乘以约定多项式的最高次幂以后做被除数,然后求得的余数为1010,将余数1010附加到发送消息的后边,则发送消息变为10110011010。

接收方接收此数据后,再做除数运算,余数应该为0。

1.3CAN总线中使用的生成多项式

前面讲述了CRC校验的基本规律,而在CAN通讯中使用的CRC算法和一般的算法的区别就是生成多项式不同,计算的方式是相同的。

通过下面一个图可以看出不同的CAN使用的生成多项式的差异

传统CAN使用的是CRC15的算法,这个通过CAN的数据结构也可以看出,CRC段的长度就是15位。CAN FD之所以有两种是因为CAN FD的数据长度是可变的,针对不同的数据长度使用的方法不同,低于16字节的使用的是CRC17,高于16字节的使用的是CRC21。

2.CRC串行实现

根据1.2节的模2运算过程,可以推出CRC16串行实现步骤为:
(1)预制一个16位的存储空间CRC,并赋初始值

(2)将要发送的数据打包成一个Byte数组(将数据分成多个Byte存储)

(3)将第一个数据左移8位并与CRC当前值进行异或,结果放入CRC

(4)判断当前CRC的最高位(MSB)是否为1,若为1,则左移一位,将MSB移出,并在LSB(最低位)补0,将新的数据与简记式Poly进行异或,结果存入CRC;若MSB为0则只进行左移操作。

(5)重复步骤3-4直至8个数据移动完毕,此时CRC中的值就是我们要的校验码。

假设数据为0xAA,多项式为8005(最高位1省略),初始值0x00,输出异或值0x00。下图可以证明上述步骤的实现过程的正确性:

3.CRC并行实现

3.1CRC模2运算及LFSR实现

设需要发送的信息为M = 1010001101,产生多项式对应的代码为P = 110101,R=5。在M后加5个0,然后对P做模2除法运算,得余数r(x)对应的代码:01110。故实际需要发送的数据是101000110101110。
对应多项式为110101 即 x5+ x4+ x2+1。
模2除运算过程如下:

LFSR运算过程如下:


3.2CRC代码实现

如果用时序电路串行实现,则8 bit数据要移位8次,就需要8个clk,效率低下,为了能在一个时钟周期输出结果,必须采用组合电路,当然,这是以空间换时间的方法!

以一种CRC16 为例,说明其实现方式,参数如图所示。


CRC16 的多项式为:

LFSR电路图如下,需要注意的是,数据移入顺序是先高后低。以8bit数据为例,其数据处理顺序是Data[7]->Data[0],这也是为什么,第一个例程中使用了for(i=7; i>=0; i=i-1)的原因。


两种Verilog实现方式,结果完全一致。

module CRC_GEN(input            rst,     /*async reset,active low*/input            clk,     /*clock input*/input     [7:0]  data_in, /*parallel data input pins */input            d_valid, /* data valid,start to generate CRC, active high*/output reg[15:0] crc
);integer i;
reg feedback;
reg [15:0] crc_tmp;
/*
*  sequential process
*/
always @(posedge clk or negedge rst)
beginif(!rst) crc <= 16'b0;          /*触发器中的初始值十分重要 */else if(d_valid==1'b0)crc <= 16'b0;elsecrc <= crc_tmp;
end/*
*   combination process
*/
always@( data_in or crc)
begincrc_tmp = crc;for(i=7; i>=0; i=i-1)beginfeedback    = crc_tmp[15] ^ data_in[i];crc_tmp[15]  = crc_tmp[14];crc_tmp[14]  = crc_tmp[13];crc_tmp[13]  = crc_tmp[12];crc_tmp[12]  = crc_tmp[11] ^ feedback;crc_tmp[11]  = crc_tmp[10] ;crc_tmp[10]  = crc_tmp[9];crc_tmp[9]   = crc_tmp[8];crc_tmp[8]   = crc_tmp[7];crc_tmp[7]   = crc_tmp[6];crc_tmp[6]   = crc_tmp[5];crc_tmp[5]   = crc_tmp[4] ^ feedback;crc_tmp[4]   = crc_tmp[3];crc_tmp[3]   = crc_tmp[2];crc_tmp[2]   = crc_tmp[1];crc_tmp[1]   = crc_tmp[0];crc_tmp[0]   = feedback;end
endendmodule
module CRC16_D8;// polynomial: x^16 + x^15 + x^2 + 1// data width: 8// convention: the first serial bit is D[7]function [15:0] nextCRC16_D8;input [7:0] Data;input [15:0] crc;reg [7:0] d;reg [15:0] c;reg [15:0] newcrc;begind = Data;c = crc;newcrc[0] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];newcrc[1] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];newcrc[2] = d[1] ^ d[0] ^ c[8] ^ c[9];newcrc[3] = d[2] ^ d[1] ^ c[9] ^ c[10];newcrc[4] = d[3] ^ d[2] ^ c[10] ^ c[11];newcrc[5] = d[4] ^ d[3] ^ c[11] ^ c[12];newcrc[6] = d[5] ^ d[4] ^ c[12] ^ c[13];newcrc[7] = d[6] ^ d[5] ^ c[13] ^ c[14];newcrc[8] = d[7] ^ d[6] ^ c[0] ^ c[14] ^ c[15];newcrc[9] = d[7] ^ c[1] ^ c[15];newcrc[10] = c[2];newcrc[11] = c[3];newcrc[12] = c[4];newcrc[13] = c[5];newcrc[14] = c[6];newcrc[15] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];nextCRC16_D8 = newcrc;endendfunction
endmodule

4.CRC生成工具

CRC Genaration Tool)

5.参考文章

1.详解LIN通讯和CAN通讯的校验算法
2.CRC校验原理及实现
3.关于CRC校验实现程序解释(CRC16为例)
4.基于FPGA的CRC校验码生成器)

CAN总线的CRC校验相关推荐

  1. can协议crc计算_基于CAN总线的CRC校验码的原理与实现

    基于CAN总线的CRC校验码的原理与实现 王鹏 [摘 要]CAN总线又称为控制器局域网技术,属于工业现场总线,应用范围很广.CAN系统中通常 采用反馈重发机制对通信过程进行差错控制.当接收端反馈给发送 ...

  2. can协议crc计算_CAN总线通信的CRC校验方法

    数据校验是为保证数据的完整性进行的一种验证操作.CAN通信采用CRC校验作为一种重要的错误检测手段,是节点判断CAN帧信息的完整性并产生确认应答的依据. 在现场总线通信和控制的实际应用中,工业应用环境 ...

  3. 编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法

    Modbus通信协议中CRC校验的快速C语言算法 2004年第11期 福 建 电 脑 63 Modbus通信协议中CRC校验的快速C语言算法 孟开元 (西安石油大学计算机学院陕西西安710065) [ ...

  4. DS18B20 单总线多器件的ROM 搜索, ALARM 检测, CRC 校验 源码实现, 基于 STM32F103

    DS18B20使用5V供电, 数据线总线 DQ 经4.7k 上拉电阻到 5V, 连接到  B12 端口,  多个器件共用一条数据总线, (以前以为 ROM 搜索是穷举搜索, 但是 搜索1位需要 读两次 ...

  5. 一.对于crc校验的流程演示说明。

    一.CRC 是循环冗余校验的缩写,全称是 Cyclical Redundancy Check. CRC 的基本原理是发送端根据 CRC 算法,对总线上要传输的原始数据进行计算,得到一个 CRC 校验码 ...

  6. 现场总线技术笔记——1、数字信号是怎么完成通信的?(匹配阻抗、CRC校验)

    文章目录 数字通信系统模型 信道 信道容量--解决传输速率的方法 如何提高传输的稳定性和准确性? ①通过编码规则提高准确性 ②同步和异步传输中的同步技术 ③阻抗匹配技术 信号的传输模式--基带.载带. ...

  7. c语言用CRC校验FCS序列,FCS校验 C语言简单实现(示例代码)

    static uint8 calcFCS(uint8 *pBuf, uint8 len) { uint8 rtrn = 0; while (len--) { rtrn ^= *pBuf++; } re ...

  8. LabVIEW实现CRC校验

    目录 1.内部控件计算CRC校验 2.公式节点计算CRC校验 CRC(循环冗余校验),是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存 ...

  9. 32位crc校验码程序_CRC码计算及校验原理的最通俗诠释

    CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的.其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注 ...

  10. 计算机网络crc校验实验报告,CRC校验实现-实验报告(附主要实现代码)

    计算机网络 实验报告 班级:03计算机B班 实验名称:CRC校验实现 姓名:kikikind 学号:086 指导老师:何怀文 日期:2006-4-22 1.学习CRC循环冗余检验原理 2.掌握实现方法 ...

最新文章

  1. usaco Beef McNuggets
  2. 15 上下篇博客和按月分类
  3. R语言unique函数计算数据对象(vector、dataframe)的unique独特值:unique函数从vector向量、dataframe中删除重复项、删除dataframe重复行
  4. 《乌合之众》读书笔记(part1)--对群体而言,最不公正的也许却是最好的
  5. MongoDB 分组统计
  6. 如何通过网页方式将jar包上传到nexus?
  7. 查询mysql数据库表占用空间大小_MySQL数据库查看数据表占用空间大小和记录数...
  8. 《文后参考文献著录规则》
  9. windows 本地搭建git仓库_windows局域网搭建本地git代码版本管理仓库
  10. 多线程并发中什么是竞争条件?
  11. 【07月02日】A股滚动市盈率PE最低排名
  12. 阿里云机器学习平台PAI+AI开源项目测评来啦
  13. Cg插画需要学习什么,难不难?
  14. linux查看IP端口占用情况
  15. 有关保险及公积金的文章,阅读绝对获益!!
  16. 泰课在线 秘密行动课程
  17. python中entry的使用方法_python中entry用法讲解
  18. Windows中文账户名修改为英文
  19. canvas绘制时钟表盘
  20. web上传整个文件夹

热门文章

  1. 数据结构银行排队系统c语言,数据结构银行排队系统实验报告
  2. word学习-软回车替换为硬回车
  3. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(2) 自己封装的Calendar接口
  4. 关于TikTok环境伪装度检测,whoer和上网大师app的对比
  5. 电子电路仿真软件中文版_汽车电子EMC仿真简介
  6. dna计算机 论文,科学网—阿德勒曼DNA计算机(科普) - 沈海军的博文
  7. 递归与自我指涉标识牌Top 5
  8. 2021年机器学习及R应用 陈强老师 应用于领域 经济管理 人文社科 医学卫生领域等
  9. win 7 虚拟机VMware Tools安装
  10. qq邮箱对方服务器退回,为什么我用QQ邮箱发邮件被退回来了?他说地 – 手机爱问...