一、引言
MCS-51系列单片机以其功能完善且方便易学而得到了越来越多的应用。随着科研、生产中测量与控制工程量的增大,单个单片机往往已不能满足要求。一项工作可能会有主从系统组成的单片机网来完成,这就会有各机之间大量的数据传送。同一般的通信系统一样,由于信道传输特性不理想和加性干扰的影响,数字信号在传输过程中码元波形会变坏,接收数据端中可能有差错,必须对接收到的数据进行校验。
差错控制编码是提高数字传输可靠性的一种有效方法。它是通过对发送端待传送的信息序列附加一些监督码元或进行某种变换,使多余码元与信息码元之间以某种确定的规则相互关联,即使原来彼此独立、没有相关性的信息码元序列变换为具有相关性的序列。接收端按照这种相关性对信息码元和监督码元进行检验,一旦传输过程中发生差错,即可检查出来并予以纠正。
循环冗余校验(CRC)是一种具有循环特性的线性分组码,检错能力强,且实现编、译码电路简单,因而在实现差错控制中被广泛应用,是单片机控制系统中最常用的校验方法之一。本文将说明它的工作原理,并用一个实例说明其具体实现的方法。
二、循环冗余校验的校验原理
循环码的特征是各个码字只是彼此之间的简单移位。比如一个长度为n的循环码字为
c=(c1,c2,…,cn-1,cn)(1)
的循环移位结果
c′=(c2,…,cn,c1)
和 c″=(c3,c4,…,cn,c1,c2)
也都是码字。
每个码字可以用多项式的形式来描述,例如(1)式中的循环码也可表示成
c(x)=c1xn-1+c2xn-2+…+cn(2)
假设现在有k个bit的数据码要传输。我们把包含n个信息码、k个数据码的代码字,称为一个(n,k)循环码。可以证明,在系统码中,对应于数据多项式d(x)的码字多项式c(x)由下式给出
c(x)=xn-kd(x)+p(x)(3)
其中生成多项式g(x)是(xn+1)的(n-k)次系数;p(x)是用g(x)除xn-kd(x)后的余数;即
p(x)=Rem[xn-kd(x)/g(x)]
可见,要传送的信息码就是将数据码左移后在除以生成多项式,除法所得的余数就放入k个数据码之后的n-k个位置中。
接收端用所收到信息码字用最初进行除法的生成多项式去除,可以除尽而没有余数表明传输中无差错,否则表明出了差错。编码的检错能力,取决于信息码组k和校验码组n-k的相对大小,同时也取决于对多项式g(x)的选择。
我们在一个工程项目中成功地用8031单片机实现了带有循环冗余校验的通信。
三、在MCS-51单片机上的实现方案
如图1所示,假设现有16字节的数据放在51机内部RAM的30H~3FH中待传送。我们选生成多项式为
g(x)=x16+x15+x2+1
则生成多项式的码为g=11 000 000 000 000 101共17位。
将数据左移16位后再除以生成多项式所得的余数就是CRC码。为此我们选内部RAM的(22H)的第0位、(21H)和(20H)共17位作运算区,用来进行除法运算和存放余数。
待传输的数据有16字节共128位,不可能一起装入运算区,故我们设一个指针指向下一个将要参加运算的数据位。程序中用寄存器R3、R2作为数据区指针,R3内放指针所在的字节。R2内放此字节内指针指向的位数。
计算结果的CRC码共16位,放在21 H、20 H字节内。
产生CRC码的程序框图如图2。程序不断判断运算区的数据是否够除,若是,则把运算区的内容同生成多项式码进行异或,即进行模2除法运算;若不够除则从数据区取出一位数据补进运算区末尾,同时数据区指针加1,直到算完。
整个通讯过程如下:
在发射端,有待传输的数据共16字节放在30 H~3 FH,平时,紧跟着的2字节40 H和41 H总是0,这相当于数据左移16位。然后调用CHECK子程序,即用18字节的数除以生成多项式码,最后的余式放在21 H、20 H中,这就是对应这一组16字节数据的CRC码。将CRC码随16字节数据共18字节一起发射出去。
在接收端将接收到的18字节数据和校验码顺序放在30 H~41 H,调用同样的子程序CHECK,如果21 H、20 H中的余数为0,说明接收到的16字节数据是正确的,可以发回应答信号,否则回发一个“接收错误”信号,请求发端重发。
四、一个实例
表1和表2给出了一个实际的例子。调用CHECK子程序后求得在21 H和20 H中
的CRC校验码为75 H、43 H,将这18字节一起发送,接收机收到数据和CRC码,再次调用CHECK后21 H和20 H内余数为0,说明传输正确。
五、结论
本文介绍的CRC编码校验方法不需要增加硬件,具有实现简单、成本低的特点。这种方案还有普遍性,它不仅适用于51系列单片机之间的通信,在其它的数字通信过程中都能得到广泛应用。
参考文献
[1][美]BPLATHI著、雷震洲译.现代数字与模拟通信系统.人民邮电出版社 .1984年
[2]朱荣华.一种CRC并行计算原理及实现方法.电子学报.1999年第4期
[3]陈永甫等.现代通信系统和信息网.电子工业出版社.1996年6月