OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5036|回复: 11

CRC校验

[复制链接]

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-12
在线时间
17 小时
发表于 2016-8-26 11:18:21 | 显示全部楼层 |阅读模式
3金钱
uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
函数功能:用于计算多个 32 位数的 CRC

函数参数: pBuffer[] 缓冲区地址
BufferLength 缓冲区长度

函数返回:返回一个 32 位的 CRC 计算结果。

请问一下,这个函数的函数返回值只有一个32 位的 CRC 计算结果,它是把数组里面的所有数组合在一起进行的CRC校验码,要数组里面的每个数都做一次CRC校验的话,应该返回多个32 位的 CRC 计算结果呀?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2016-8-24
在线时间
27 小时
发表于 2016-8-26 11:25:06 | 显示全部楼层
比较常的crc校验是  数组中所有的有效数据进行异或校验,因此只有一个结果
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2016-8-24
在线时间
27 小时
发表于 2016-8-26 11:26:54 | 显示全部楼层
用的比较多的格式是: 头+数据长度+命令字+数据+校验
而检验=数据长度^命令字^数据
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
发表于 2016-8-26 11:42:17 | 显示全部楼层
不会,能用就行。
回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-12
在线时间
17 小时
 楼主| 发表于 2016-8-26 15:10:57 | 显示全部楼层
shjzqbx 发表于 2016-8-26 11:25
比较常的crc校验是  数组中所有的有效数据进行异或校验,因此只有一个结果

所有数据组成一个数和生成码进行异或校验吗?
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-8-26 15:15:44 | 显示全部楼层
你查一下CRC的原理吧,它是面向比特流的,为了便于字节传输,常用的有CRC-8,CRC-16,CRC-32等
回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-12
在线时间
17 小时
 楼主| 发表于 2016-8-26 15:56:26 | 显示全部楼层
xkwy 发表于 2016-8-26 15:15
你查一下CRC的原理吧,它是面向比特流的,为了便于字节传输,常用的有CRC-8,CRC-16,CRC-32等

能说详细点吗,百度上的CRC校验原理我看懂了,但是网上说按照那样写的话太复杂,所以没按照上面写吗
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2016-1-26
在线时间
149 小时
发表于 2016-8-26 16:02:34 | 显示全部楼层
crc校验是面向字节的,常用的有CRC-8,CRC-16,CRC-32,就是将一串数据流传至函数进行校验,选择crc-8,返回的值就是一个字节,选择crc-16,获得的就是一个16位数,同理,32位就是返回的一个32位值,而返回的结果跟数据流的多少是无关的,都是根据你选择校验的位数来返回对应的结果!
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2016-8-24
在线时间
27 小时
发表于 2016-8-26 16:03:47 | 显示全部楼层
feng_dou 发表于 2016-8-26 15:10
所有数据组成一个数和生成码进行异或校验吗?

单片机常用的校验  就是 加校验  和  异或检验   这两种速度比较快
如果是crc8 crc16。。。需要查表的,简单通信不需要这样麻烦
回复

使用道具 举报

2

主题

130

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1870
金钱
1870
注册时间
2011-9-16
在线时间
419 小时
发表于 2016-8-26 17:24:20 | 显示全部楼层
4.3.3 10BCRC 校验 (校验和)
CRC 校验从“从站地址”开始,至“最后一个数据内容”结束。CRC 校验计算方法如下:
步骤 1:载入一个内容值为FFFF(十六进制)的16 位寄存器(称为CRC 寄存器)。
步骤 2:指令讯息中的第一个字节的8 位数据与CRC 寄存器低字节的8 位数据进行异或运算,运算
结果存储于CRC 寄存器内。
步骤 3: CRC 寄存器的内容值右移1 位并将其最高位填入0。
步骤 4: 检查 CRC 寄存器最低位的值,如果为0 则重复步骤3;如果为1,CRC 寄存器的内容与
A001(十六进制)进行异或运算,运算结果存储于CRC 寄存器内。
步骤 5:重复步骤3 及步骤4,直到CRC 寄存器的内容被右移了8 位。此时,指令讯息的第一个字节
已完成处理。
步骤 6:对指令讯息的下一个字节重复步骤2 至步骤5 的操作,直到指令讯息的所有字节都被处理完
成。CRC 寄存器最后的内容就是CRC 校验值。在指令讯息中传送CRC 校验值时,计算出的CRC 校
验值高低字节须互换,即CRC 校验值低字节先被传送。
下面为用C 语言求CRC 校验值的计算范例
unsigned char* data 􀃅 // 指令讯息内容指针
unsigned char length 􀃅 // 指令讯息的长度
unsigned int crc_chk(unsigned char* data, unsigned char length)
{
int j;
unsigned int reg_crc=0Xffff;
while(length--)
{
reg_crc ^= *data++;
for (j=0;j<8;j++)
{
If (reg_crc & 0x01) reg_crc=(reg_crc>>1) ^ 0Xa001; /* LSB(b0)=1 */
else reg_crc=reg_crc >>1;
}
}
return reg_crc; // the value that sent back to the CRC register finally
}

回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-8-27 06:57:50 | 显示全部楼层
无休 发表于 2016-8-26 16:02
crc校验是面向字节的,常用的有CRC-8,CRC-16,CRC-32,就是将一串数据流传至函数进行校验,选择crc-8,返 ...

你再查一下资料吧,
工作原理
循环冗余校验同其他差错检测方式一样,通过在要传输的k比特数据D后添加(n-k)比特冗余位(又称帧检验序列,Frame Check Sequence,FCS)F形成n比特的传输帧T,再将其发送出去。
(引自百度百科)
全文有提到过字节的概念了吗?


我们常见到的的确都是8整数倍的CRC,不过工程上CRC-5,CRC-12等也并不是从未用过,勿以偏概全。

CRC在硬件计算上的确是面向串行比特流的,只不过便于单片机处理及查表,所以少见CRC-5这样的,

附某数字芯片内部CRC生成器实现原理(使用的是异或门及移位器):
1.png
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

5

主题

121

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2016-1-26
在线时间
149 小时
发表于 2016-8-30 10:45:56 | 显示全部楼层
xkwy 发表于 2016-8-27 06:57
你再查一下资料吧,
(引自百度百科)
全文有提到过字节的概念了吗?

。。我只是简单的说明一下,并没有全面的给出crc原理,都是按自己的理解来解释这个东西的,并没有强调我的解释是绝对性和唯一性,不明白你想表达什么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 06:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表