基于单片机的CRC编解码器.docx
- 文档编号:8531922
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:26
- 大小:876.04KB
基于单片机的CRC编解码器.docx
《基于单片机的CRC编解码器.docx》由会员分享,可在线阅读,更多相关《基于单片机的CRC编解码器.docx(26页珍藏版)》请在冰豆网上搜索。
基于单片机的CRC编解码器
第一章绪论
1.1研究背景及意义
在当今信息社会,单片机在计算机的网络通讯与数据传输、工业自动化过程的实时控制和数据处理等都有广泛的应用,它已经渗透到人们生产生活的各个领域。
而利用单片机进行数据通讯的控制应用得越来越广泛。
于此同时,人们对信息传递的要求逐渐提高,使得通信传输过程中,可靠性和有效性这对矛盾日益凸显。
随着对有效性不断提高,每个码元所占的时间越来越短,由于传输距离、现场状况等诸多因素的影响,设备(通常为嵌入单片机)之间的通讯数据常会发生无法预测的错误。
为了防止错误所带来的影响,在数据的接收端必须保证其可靠性。
但由于数据在一个有干扰的环境中进行传输,任何数据中的任何信息包括确认信息都是不可靠的。
这里举一个红军和蓝军通信联合进攻山下的敌军的经典案例:
第一天红军发了条信息要蓝军第二天一起进攻,蓝军收到之后,发一条确认信息,但是蓝军担心的是“确认信息”如果也不可靠而没有成功到达红军那里,那自己不是很危险?
于是红军再发一条“对确认的确认信息”,但同样的问题还是不能解决,红军仍然不敢贸然行动。
对通信的可靠性检查就需要“校验”,校验是从数据本身进行检查,它依靠某种数学上约定的形式进行检查,校验的结果是可靠或不可靠,如果可靠就对数据进行处理,如果不可靠,就丢弃重发或者进行修复。
数据在向单片机或其它设备进行输入时,容易产生输入错误,为了减少输入错误,编码专家发明了各种校验检错方法,并依据这些方法设置了校验码。
凡设有校验码的信息码,是由本体码与校验码两部分组成(如组织机构代码),本体码是表示编码对象的号码,校验码则是附加在本体码后边,用来校验本体码在输入过程中准确性的号码。
每一个本体码只能有一个校验码,校验码通过规定的数学关系得到。
校验码的校验原理是:
系统内部预先设置根据校验方法所导出的校验公式编制成的校验程序,当带有校验码的代码输入系统时,系统利用校验程序对输入的本体码进行运算得出校验结果之后,再将校验结果与输入代码的校验码进行对比来检测输入的正确与否。
如果两者一致,则表明代码输入正确,系统允许进入,如果不一致,则表明代码输入有误,系统拒绝进入,并要求代码重新输入。
CRC循环冗余校验码就是其中一种应用非常广泛的差错控制手段,它是一种高效且可靠的方法。
由于CRC校验编码和解码方法简单,检错能力强,开销小,易于用编码器及检测电路实现。
从性能上和资源开销上考虑,均远远优于奇偶校验及算数和校验等方式。
因而,CRC校验广泛应用在各种数据校验在现代通信、测量控制领域、数据存储领域得到了广泛的应用。
1.2本论文的主要工作
本论文主要研究基于单片机的CRC编解码系统设计。
根据CRC循环冗余校验码的原理结合单片机的实际运用,对如下几个问题展开讨论和研究:
⑴从CRC校验码原理出发,分析不同的CRC编码过程,确定一种适用于单片机语言的编解码方法,然后制定具体的程序设计方案。
⑵结合编解码程序设计,设计实验性的编解码器,验证编解码程序在单片机上的可行性。
其中涉及到输入系统,输出系统,通信系统。
⑶在实验性的编码器中的基础上进一步拓展,结合传感器模块,设计一个结合CRC校验的实时检测通信系统。
1.3本论文的主要内容
本论文第一章为绪论,介绍CRC校验码在单片机通讯中起到的重要作用以及本设计所实现的任务。
第二章具体介绍CRC循环冗余校验码。
从其基本原理出发,发现能够实现编解码的计算方法,并分析每种计算方法。
第三章主要介绍通过第二章所介绍的不同算法,选择一种适用于单片机语言的算法。
分析其具体结构,并用C语言实现该算法。
第四章详细介绍了CRC编解码在单片机上的实现。
本章节以“输入-编码-传输-解码-输出”模型,设计出两种系统:
“简易CRC编解码验证系统”和“温湿度实时检测的编解码系统”,来验证CRC校验码在单片机上的实现和具体应用。
第二章CRC循环冗余校验码
2.1CRC循环冗余校验码原理简介
循环冗余码校验英文名称为CyclicalRedundancyCheck,简称CRC,它是利用除法及余数的原理来作错误侦测的。
CRC校验码的基本原理是:
在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。
对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。
根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。
校验码的具体生成过程为:
假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。
通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。
n位的CRC校验码产生的规则是先将要发送的二进制序列数左移n位(既乘以
)后,再除以一个多项式,最后所得到的余数既是CRC值,如式(2-1)式所示,其中B(X)表示K位的二进制序列数,G(X)为生成多项式,Q(X)为整数,R(X)是余数即CRC码[1]。
公式(2-1)
基于以上原理可以知道:
计算CRC值的过程就是先将K位信息码B(X)左移R位,再用一个特殊的“除法”,来求得余数,这个余数就是R位的校验码R(X)。
它与算术除法的区别在于,将算术除法中的减运算变成了XOR(异或)运算。
而这个特殊除法的目的是逐步消掉最高位的1或0,由于过程是XOR,所以商Q(X)是没有意义的,所以余数R(X)就是CRC校验过程中的关键点。
当把经计算得到的R位校验码并到原信息码最低位之后,即得到CRC值。
在计算CRC值的过程中,作为“除数”的生成多项式G(X)也是非常重要的。
它是接收方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
在发送方,利用生成多项式对信息多项式做模2除生成校验码。
在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。
由于生成多项式的最高位必须为1,而实际上在除法的每次XOR时,都要消掉,这个1可以不做参考,所以一般生成项简写时不写最高位的1。
而CRC计算时最后一次除法XOR,最高位消除了,所以得到的余数的位数正是生成多项式除去最高位的个数,即CRC校验码R(X)的位数=生成多项式G(X)位数-1。
接收方将接收到的二进制序列数(包括信息码和CRC值),将其与编码时所用的同一种生成多项式进行一次CRC计算,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。
2.2CRC循环冗余校验码的计算方法
2.2.1按位计算法
按位计算法就是直接模拟CRC校验码基本原理中除法的过程,来得到余数即CRC值。
我们可以从寄存器运算的角度上描述这个方法。
设生成多项式G(X)有g位,由于最高位是要一直消掉的,所以只需要一个g-1位的寄存器。
以下是计算的过程:
⑴原始数据后扩展g-1个比特0;
⑵先在寄存器中从左移入原信息码B(x),高位先进;
⑶寄存器左移一位,并且右边移入下一位数据。
这样最高位1移出,由于最高位是1,故本次的商是1,要用G(X)来进行XOR,最高位肯定XOR得0,故忽略最高位,只要用低g-1位来进行XOR就可以,其结果便是第一次XOR后的结果。
如果移出的最高位是0,则继续移位,直到移出的最高位为1。
一直重复这个过程,就能得到最后余数了。
由此得到一个最简单的算法:
图2-1CRC按位计算流程图
2.2.2查表法
按位计算法是将被测数据一位一位放到寄存器中来做除法,现在来探究一种能处理多位的数据的方法。
根据同样的原理可以得到如下的算法:
While(还有剩余没有处理的数据)
Begin
检查register头字节,并取得它的值;
求不同偏移处多项式的XOR;
register左移一个字节,最右处存入新读入的一个字节;
把register的值和多项式的XOR结果进行XOR运算;
End
在这个算法中,需要讨论的是求不同偏移处多项式的XOR这一步。
我们可以通过一个例子说明:
假设生成多项式R(X)为100100011,即CRC-8,待测数据B(X)是101101001101,一次处理4个比特的数据。
第一步:
101101001101B(X)
100100011XORR(X)
001001010101第一次XOR后的值
第二步:
001001010101
100100011XOR将R(X)右移2位后,再做XOR
000000010011第二次XOR后的值
这时,首4个比特全0说明不用继续除了,结果满足要求了。
也就是说:
B(X)与R(X)相XOR,得到的结果再与R(X)相XOR,生成多项式要适当移位,重复进行,最终消掉4个比特中所有的1,直到结果满足要求。
基于异或运算的交换律,即(AXORB)XORC=AXOR(BXORC),我们可以将R(X)与适当移位后的R(X)先进行XOR,使其结果值的高位与B(X)相同。
然后与B(X)相异或[2]。
现在换成这种算法:
第一步:
100100011000R(X)
1001000110XOR右移2位后的R(X)
101101011110R(X)与移位后的R(X)XOR后得到的值
第二步:
101101011110R(X)相XOR后得到的值
101101001101XOR待测数据B(X)
000000010011得到的结果值和上面是一样的
以上两种算法计算的结果是一致的,从后一种算法可以发现:
如果事先将R(X)自行XOR后使其结果高n位能够连续地由低到高生成一张表,由于高n位的原始数据和高n位的表内数据在计算时都是被消掉的,所以表内数据只保留低位余数。
然后计算CRC值时只需让原始数据查这张表中对应的值。
接下来再将表内的值XOR下一位原始数据,重复该步骤,直到处理完所有数据,这就是查表法。
从以上的例子可以看出,查表法的高位决定了一次能编码多大的数据,低位决定了表中的值。
这里以生成多项式CRC-8=X^8+X^2+X^1+1(0000000100000111)为例,介绍表的生成:
1.0000000000000000低8位值为0x00高8位为0x00
2.0000000100000111低8位值为0x07高8位为0x01
3.0000001000001110低8位值为0x0E高8位为0x02
4.0000001000001110与000100000111相XOR,低8位值为0x09高8位为0x03
5.0000010000011100低8位值为0x1C高8位为0x04
6.0000010000011100与0000000101011100相XOR,低8位值为0x1B高8位为0x05
7.0000010000011100与0000001000001110相XOR,低8位值为0x12高8位为0x06
8.0000010000011100与0000001000001110,0000000100000111相XOR,
低8位值为0x15高8位为0x07
......
其中,在每一项XOR后所得到的高8位代表每一项在表里的位置,并且决定了该表一次可以给一个字节编码。
所得到低8位代表每一项的值。
通过这样的不同偏移处的统一生成多项式的XOR,遍历高8位的每一项,即可求得256个项,以应对原信息码内单字节内的每个量[3]。
由此便可得CRC值表:
表2-1CRC-8(X^8+X^2+X^1+1)表
0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D,
0x70,0x77,0x7E,0x79,0x6C,0x6B,0x62,0x65,0x48,0x4F,0x46,0x41,0x54,0x53,0x5A,0x5D,
0xE0,0xE7,0xEE,0xE9,0xFC,0xFB,0xF2,0xF5,0xD8,0xDF,0xD6,0xD1,0xC4,0xC3,0xCA,0xCD,
0x90,0x97,0x9E,0x99,0x8C,0x8B,0x82,0x85,0xA8,0xAF,0xA6,0xA1,0xB4,0xB3,0xBA,0xBD,
0xC7,0xC0,0xC9,0xCE,0xDB,0xDC,0xD5,0xD2,0xFF,0xF8,0xF1,0xF6,0xE3,0xE4,0xED,0xEA,
0xB7,0xB0,0xB9,0xBE,0xAB,0xAC,0xA5,0xA2,0x8F,0x88,0x81,0x86,0x93,0x94,0x9D,0x9A,
0x27,0x20,0x29,0x2E,0x3B,0x3C,0x35,0x32,0x1F,0x18,0x11,0x16,0x03,0x04,0x0D,0x0A,
0x57,0x50,0x59,0x5E,0x4B,0x4C,0x45,0x42,0x6F,0x68,0x61,0x66,0x73,0x74,0x7D,0x7A,
0x89,0x8E,0x87,0x80,0x95,0x92,0x9B,0x9C,0xB1,0xB6,0xBF,0xB8,0xAD,0xAA,0xA3,0xA4,
0xF9,0xFE,0xF7,0xF0,0xE5,0xE2,0xEB,0xEC,0xC1,0xC6,0xCF,0xC8,0xDD,0xDA,0xD3,0xD4,
0x69,0x6E,0x67,0x60,0x75,0x72,0x7B,0x7C,0x51,0x56,0x5F,0x58,0x4D,0x4A,0x43,0x44,
0x19,0x1E,0x17,0x10,0x05,0x02,0x0B,0x0C,0x21,0x26,0x2F,0x28,0x3D,0x3A,0x33,0x34,
0x4E,0x49,0x40,0x47,0x52,0x55,0x5C,0x5B,0x76,0x71,0x78,0x7F,0x6A,0x6D,0x64,0x63,
0x3E,0x39,0x30,0x37,0x22,0x25,0x2C,0x2B,0x06,0x01,0x08,0x0F,0x1A,0x1D,0x14,0x13,
0xAE,0xA9,0xA0,0xA7,0xB2,0xB5,0xBC,0xBB,0x96,0x91,0x98,0x9F,0x8A,0x8D,0x84,0x83,
0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,0xFD,0xF4,0xF3
第3章CRC编解码器的软硬件实现
3.1适用于单片机设计的CRC校验码计算方法的选择
“按位计算法”虽然很直观,但每一次只能对一位数据进行运算,每一次运算,都需要很长的时间。
由于CRC校验广泛运用于单片机通信中,如果传输的信息量大,而编码的速度很慢,造成发送时间慢,当与传输校验中的时间不匹配就会造成丢包。
如MODBUS-RTU通讯协议中规定若超过3.5个字符时间单片机仍没有接收到新数据,则认为接收完成。
假设在波特率为9600b/s的情况下进行MODBUS-RTU协议通信,如果某次编码时间超过0.37ms的话,就会造成该次传输就丢包。
而使用按位计算法在处理较大数据时有可能出现这种情况。
由于“查表法”算法和“按位计算法”是完全一样的,不仅结果完全一样,处理方式也是完全一样的,所以“查表法”是可以完全替代“按位计算法”的。
查表法主要优点是能够快速计算。
由于其一次能够计算多位数据,从而提高了速度,较好地克服了异步传输中校验和发送时间可能出现不匹配的问题。
查表法的缺点是由于要存储几百个字节的参数表,需要更多的存储空间,然而在单片机的应用中,只要在程序存储空间容量允许的情况下,这种以空间换取时间的方法是值得提倡的。
综上所述,在本次设计采用CRC查表法的计算方法进行CRC编解码。
3.2编解码系统总体结构
3.2.1单片机的选择
单片机,作为计算机的特殊分支,在各领域中的应用越来越广。
单片机的正式名称为微控制器(MicroControllerUnit,MCU)。
全世界单片机的年产量数以百亿计。
常用的单片机厂商有:
.STC公司
STC公司的单片机主要是基于8051内核,是新一代增强型单片机,指令代码完全兼容传统8051,速度快8至12倍,双串口,有全球唯一ID号,加密性好。
.Microchip公司
Microchip公司PIC系列单片机,其突出特点是体积小,功耗低,精简指令集,抗干扰能力强,可靠性高,有较强的模拟接口,代码保密性好,大部分芯片有其兼容的FLASH程序存储器的芯片。
.ATMEL公司
ATMEl公司的8位单片机AT89系列是8位Flash单片机,与8051系列单片机相兼容,静态时钟模式[4]。
系统由单片机实现控制与计算,其中一个首要的工作就是选择适合的单片机。
目前国内在使用单片机作控制系统的微处理器时多选择PIC,51系列单片机,其中PIC系列的单片机在多个方面较之其它系列单片机具有以下优点:
外接电路简洁。
与MCS-51系列及其它单片机相比,PIC单片机内集成了上电复位电路、I/O引脚上拉电路、看门狗定时器,尤其是集成了AD模块,在对模拟量进行模/数转换时可以更大程度的减少和免用外接器件,以便实现“纯单片”化,这样,不仅便于开发,而且还可以节省电路板空间和制造成本。
具有独特的C语言开发环境。
使用C语言这种高级语言来进行程序设计,可大大的提高工作效率[5]。
综上所述现有的单片机产品中,由于Microchip公司的PIC系列单片机拥有强大的抗干扰能力,而且稳定性和可靠性高,同时拥有较强的模拟接口,与大部分芯片的兼容,鉴于以上优势,故在本装置中选用Microchip公司的PIC系列单片机。
由于本论文中的设计对模拟量进行采集,同时,设计外围硬件也需要较多的I/O资源以及考虑到今后的功能扩展。
因此,需要选用一款运算速度快,模拟采集通道,I/O引脚较多的单片机。
经过比较选择,PIC系列单片机中的PIC16F877A。
3.2.2结构介绍
本论文中的设计采用基于CRC-8=X^8+X^2+X^1+1的查表法。
根据2.2.2节对查表法的分析,我们可以总结出查表法的寄存器运算模型:
图3-1查表法模型图
具体描述:
⑴八位寄存器左移一个字节到查表寄存器,从原始数据中读入一个新的字节。
⑵将查表寄存器内的数据作为定位CRC-8表中的对应值。
⑶把这个值XOR到八位寄存器中。
⑷如果还有未处理的数据则回到第一步继续执行。
当所有原始数据处理完后,八位寄存器中的值就是该数据的CRC值,把这个值加到原始数据的后面,便构成CRC校验码。
当接收端进行CRC解码时,只要将CRC校验码按上述查表法运算模型再进行一次相同的运算。
如果八位寄存器的最后结果是0。
这表明改CRC校验码内的原始数据无误。
3.2.3CRC编解码程序设计
基于PIC单片机所具有的具有独特的C语言开发环境,在使用PIC单片机时可以运用C语言来进行程序设计,可大大的提高工作效率。
所以本次设计中采用的是C语言对单片机进行编译。
根据上一节对CRC查表法结构的分析,可以推出其程序流程图:
图3-2CRC查表程序流程图
这个程序流程图中的CRC寄存器集合了图3-1中的查表寄存器和八位寄存器的功能crc_table表为表2-1CRC-8(X^8+X^2+X^1+1)表
具体程序如下:
unsignedcharcrc=0;
for(counter;counter>0;counter--)//counter为原始数据字节数
{
crc=CRCTable[crc^*p];
p++;
}
return(crc);
第4章CRC编解码器应用实例
通过以上章节的探究,已经找到了适用于将CRC编解码原理在PIC单片机上实现的途径。
接下来将介绍CRC编解码器的实际应用。
4.1简易CRC编解码验证系统
4.1.1系统结构介绍
该系统是为了实现CRC校验原理在单片机上应用,使单片机能够进行简单的CRC编解码功能。
其结构框图如下:
图4-1简易CRC编解码框图
框图具体流程如下:
⑴由键盘输入一串原始数据;
⑵发送单片机将确定好的原始数据进行适当处理,使其转换成可以被编码的序列,然后进行CRC编码;
⑶通过PIC单片机通信端口将编好的CRC校验码发送到接收单片机;
⑷接收单片机对CRC校验码经行解码;
⑸将解码结果输入到显示模块。
4.1.2按键输入设计
键盘类型的选择:
键盘分为编码式键盘和非编码式键盘,编码式键盘能够由硬件逻辑电路完成键盘闭合和键盘释放信息的获取、键值查找及一些保护措施的功能,自动提供与被按键对应的编码,无需占用系统资源。
而非编码键盘则由软件完成上述任务,其硬件电路比较简单,但要占用MCU较多的时间。
由于本次设计的按键功能比较简单,且系统并不复杂,为了降低成本,和简化电路,所以采用非编码键盘。
键盘电路结构的选择:
非编码键盘的电路结构非为独立式和矩阵式结构。
独立式键盘配置灵活,软件简单,但每个按键单独占用一个I/O口。
矩阵键盘由行线和列线组成,按键位于行线与列线的交叉点上。
这样设计的好处是n个按键只需2
个I/O口即可。
在按键较多时矩阵键盘可以比独立键盘节省很多I/O口。
本次设计中,按键输入模块需要实现能够直接输入16进制数。
由此键盘输入模块中需要16个按键遍历0x00至0x0F,根据以上分析,本次设计选用4×4键盘[6]。
键盘工作方式选择:
键盘工作方式可分为查询工作方式和中断工作方式,查询工作方式是在一定的时间周期内,由主程序调用键盘键盘扫描程序,检查是否有按键操作。
若无按键操作退出程序;若有按键操作,则执行相应的按键处理程序。
中断工作方式是为了提高MCU的效率,大大减少MCU无谓的工作时间只有当出现按键操作,才执行中断服务程序内有关按键处理的操作,若无按键操作,则MCU不进行任何与按键有关的操作。
另外中断工作方式需要占用到一个外部中断口。
本次设计中,该系统发送单片机的结构是先输入数据后处理数据,在资源使用上是先后的关系。
此外,PIC16F877A单片机只有一个外部中断口,而且本次设外部中断口另有他用。
所以采用查询扫描的方式。
综上所诉本次设计采用4×4扫描键盘。
4X4扫描键盘及其接口电路设计如下图所示:
图4-2键盘电路设计
由于PIC单片机的I/O口都具有方向性,所以在执行列扫描和行扫描时必须先规定I/O口的方向,这里简述在有按键按下的情况下,行、列扫描法:
⑴将RD的高4位设为输出并设为高电平,将低4位设为输入并设为低电平;
⑵读取I/O口上的值确定对应的列值L;
⑶将RD的高4位设为输入并设为低电平,将低4位设为输出并设为高电平;
⑷读取I/O口上的值确定对应的行值H;
⑸根据公式data=L×4+H-1,计算出按键对应的输入值。
在有键盘操作之前,先执行行、列扫描法⑴步骤,即RD口值为0xFO。
当有按键按下时(需软件消抖),RD口值改变,才开始执行行、列扫描。
此外,在按键没有释放之前需一直循环该次扫描
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 CRC 编解码器