0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Atmega128单片机和CRC校验码实现无线传输数据时的差错校验

电子设计 来源:单片机与嵌入式系统应用 作者:王泉,齐春,罗新 2021-05-05 17:36 次阅读

作者:王泉,齐春,罗新民,黄伟,马旭东

引 言

随着威廉希尔官方网站 的不断进步,各种数据通信的应用越来越广泛。由于传输距离、现场状况、干扰等诸多因素的影响,设备之间的通信数据常会发生一些无法预测的错误。为了降低错误所带来的影响,一般在通信时采用数据校验的办法,而循环冗余码校验是常用的重要校验方法之一。

AVR高速嵌入式单片机是8位RISC MCU,执行大多数指令只需一个时钟周期,速度快(8MHz AVR的运行速度约等于200MHz 80C51的运行速度),32个通用寄存器直接与ALU相连,消除了运算瓶颈;内嵌可串行下载或自我编程的Flash和EPPROM,功能繁多,具有多种运行模式。

本文采用Atmel公司的Atmega128高速嵌入式单片机,依照IEEE 1999年公布的802.11无线局域网协议标准,采用32位循环冗余校验码(Cyclic Redundancy Check)实现无线传输数据时的差错校验。

1 CRC循环冗余校验码原理

1.1 数据传输的帧格式

根据IEEE制定的802.11无线局域网络协议,在数据传输时都应按照帧传输。这里,我们采用了信息处理系统-数据通信-高级数据链路控制规程-帧结构,它的每个帧由下列字段组成(传输顺序自左至右):

地址——数据站地址字段;

控制——控制字段。

信息——信息字段;

CRC校验位——根据前面三个字段生成的CRC校验位。

由地址、控制、信息三个字段组成的总的字段统称为数据段。

1.2 CRC校验码的理论生成方法

CRC校验采用多项式编码方法,被处理的数据块可以看作是一个n阶的二进制多项式。这里,假定待发送的二进制数据段为g(x),生成多项式为 m(x),得到的CRC校验码为c(x)。

CRC校验码的编码方法是用待发送的二进制数据g(x)除以生成多项式m(x),将最后的余数作为CRC校验码,实现步骤如下。

① 设待发送的数据块是m位的二进制多项式 g(x),生成多项式为r阶的m(x)。在数据块的末尾添加r个0,数据块的长度增加到m+r位,对应的二进制多项式为G(x) 。

② 用生成多项式m(x)去除G(x) ,求得余数为阶数是r-1的二进制多项式c(x)。此二进制多项式 c(x)就是g(x)经过生成多项式m(x)编码的CRC校验码。

③ 用模2的方式减去c(x),得到的二进制多项式就是包含了CRC校验码的待发送字符串。

CRC校验可以100%地检测出所有奇数个随机错误和长度小于等于r(r为m(x)的阶数)的突发错误。所以,CRC的生成多项式的阶数越高,误判的概率就越小。CCITT建议:2048 Kb/s的PCM基群设备采用CRC-4方案,使用的CRC校验码生成多项式m(x)=x4+x+1 。采用16位CRC校验,可以保证在 1014bit码元中只含有1位未被检测出的错误。在IBM的同步数据链路控制规程SDLC的帧校验序列FCS中,使用CRC-16,其生成多项式m(x)=x16+x15+x2+1;而在CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中,使用CCITT-16,其生成多项式m(x)= x16+x15+x5+1。CRC-32的生成多项式 m(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1。CRC-32出错的概率为CRC- 16的10-5。由于CRC-32的可靠性,把CRC-32用于重要数据传输十分合适,所以在通信、计算机等领域运用十分广泛。在一些UART通信控制芯片(如MC6582、Intel8273和Z80-SIO)内,都采用了CRC校验码进行差错控制;以太网卡芯片、MPEG解码芯片中,也采用CRC- 32进行差错控制。

m(x) 生成多项式的系数为0或1,但是m(x) 的首项系数为1,末项系数也必须为1。m(x) 的次数越高,其检错能力越强。

2 使用Atmega128生成32位CRC校验码

2.1 直接计算法生成32位CRC校验码

直接计算法就是依据CRC校验码的产生原理来设计程序。其优点是模块代码少,修改灵活,可移植性好。这种算法简单,容易实现,对任意长度生成多项式m(x) 都适用。在发送的数据不长的情况下可以使用,但是如果发送的数据块很长,这种方法就不太适合了。因为它1次只能处理1位数据,效率太低,运算量大。

计算法生成32位CRC校验码的流程如图1所示。

用AVR单片机汇编语言实现CRC-32源程序见本刊网络补充版(http://www.dpj.com.cn)。

2.2 查表法生成32位CRC校验码

和直接计算法相反,查表法生成32位CRC校验码的优点是运算量小,速度快;缺点是可移植性较差。这种算法首先要求得到32位CRC生成表,由于1个字节有8位,所以这个表总共有256项。但是,由于AVR高速嵌入式单片机中的寄存器是以1个字节为单位的,所以在编程实现中,这个CRC生成表总共有1024项,分别从0~1023;每4位对应1个32位CRC生成表的项,每一项都从高到低降幂排列。关于32位CRC生成表的程序详见本刊网络补充版(http://www.dpj.com.cn)。

查表法生成32位CRC校验码的流程如图2所示。

图2所示的流程图中,在通过异或运算得到CRC生成表的索引时,由于AVR高速嵌入式单片机中的寄存器是以1个字节为单元的,所以在编程实现中应根据所要求生成的CRC校验码的位数乘以相应的系数。例如:在数据传输时要求32位CRC校验码,应该把所得到的索引数乘以系数4,然后再从高到低依次取得32位CRC生成表单元中的内容。

使用查表法得到32位CRC校验码的源程序详见本刊网络补充版。

3 实验结果

为了比较所述两种32位CRC校验码生成方法的特点,分别选取不同字节数的数据段,对两种方法在不同情况下的效果进行比较,如表1所列。

表1 两种算法实验结果对比

以上所有实验结果均是在AVR Studio4仿真软件上选用Atmel公司的Atmega128高速嵌入式单片机为实验设备平台,在12MHz运行速度下interwetten与威廉的赔率体系 所得。

在调用32位CRC生成表程序以得到32位CRC生成表时,耗时3968.33μs,执行了47620个时钟周期。从上述实验结果可得出以下几点结论。

① 如果不考虑生成32位CRC生成表的时间,例如直接把32位CRC生成表烧入到Atmega128的可编程闪速存储器Flash中,由表1可清楚地看出,查表法的运行速度比直接计算法要快得多。因此,在类似情况下,在进行数据传输要求生成32位CRC校验码时,应该选择查表法。

② 在某些应用中,如果对硬件存储器空间要求很高,并且在一定程度上对时间没有特别高的要求时,可以采用直接计算法,以避免查表法中CRC生成表对存储器空间的占用。

③ 虽然实验结果对32位CRC校验码的两种算法进行了对比,但是所得到的结论也适用于8位、16位、24位CRC校验码。

结 语

CRC循环冗余校验码是一种方便、有效、快速的校验方法,被广泛应用在许多实际工程中。文中所列的两种算法——查表法和直接计算法,都可以得到CRC校验码;但是它们各有特点,在工程应用中应该根据实际需要选择最适合的方法,以得到最优的效果。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6035

    文章

    44553

    浏览量

    634710
  • 嵌入式
    +关注

    关注

    5082

    文章

    19110

    浏览量

    304841
  • 无线
    +关注

    关注

    31

    文章

    5451

    浏览量

    173247
收藏 人收藏

    评论

    相关推荐

    如何在IAR Embedded Workbench中配置生成对应代码区域的CRC校验码

    在“使用IAR Embedded Workbench和MCU的CRC模块来检查代码的完整性”一文中,介绍了如何在IAR Embedded Workbench中配置生成对应代码区域的CRC校验码,然后
    的头像 发表于 10-27 11:49 1637次阅读
    如何在IAR Embedded Workbench中配置生成对应代码区域的<b class='flag-5'>CRC</b><b class='flag-5'>校验码</b>

    CRC校验码算法的研究与实现

    CRC校验码算法的研究与实现
    发表于 08-06 11:09

    怎么看这款单片机校验码是多少呢

    很久以前写的程序,由于程序有很多版本,所以想看一下最终版的程序校验码来确定最终的程序。请问如何用烧录器来看校验码呢我开始是直接用CSWrite来read chip看看单片机校验码但是
    发表于 07-01 16:16

    循环冗余校验码单片机及CPLD 实现

    循环冗余校验(CRC)是一种可靠性很高的串行数据校验方法。介绍循环冗余
    发表于 04-16 14:19 16次下载

    电话网远程通信中CRC校验码的设计及实现

    本文介绍了基于电话网远距离分布式测控系统的通信方法,重点介绍了传输协议中CRC 循环校验码校验原理,CRC
    发表于 08-12 10:24 18次下载

    循环冗余校验码---CRC

    循环冗余校验码---CRC   二进制信息位串沿一条信号线逐位在部件之间或计算机之间传送称为串行传送。CRC(Cyclic Redundancy c
    发表于 10-13 16:52 7176次阅读
    循环冗余<b class='flag-5'>校验码</b>---<b class='flag-5'>CRC</b><b class='flag-5'>码</b>

    奇偶校验码,奇偶校验码原理是什么?

    奇偶校验码,奇偶校验码原理是什么? 奇偶校验码是奇校验码和偶校验码的统称,是一种最基本的检错码。它是由n-1位信息元和1位
    发表于 03-17 17:39 6.3w次阅读

    crc校验基本原理

    本内容介绍了crc校验基本原理,CRC几个基本概念,CRC的生成步骤.CRC即循环冗余
    发表于 12-21 16:55 4711次阅读

    CRC校验码算法的研究与实现

    为了提高实际通信中检查信号传输错误的能力,提高和推广CRC校验威廉希尔官方网站 ,本论文用逻辑代数知识、按模运算、代数知识和C语言编程工具设计了几种具体实用的CRC
    发表于 05-28 15:41 0次下载

    CRC-16校验码生成

    C#编写的CRC校验码生成小程序,简洁明了,如果有需要的话,大家可以下载了。
    发表于 05-06 15:06 8次下载

    crc循环冗余校验码算法

     循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散
    发表于 12-04 10:11 2.3w次阅读
    <b class='flag-5'>crc</b>循环冗余<b class='flag-5'>校验码</b>算法

    荐读:基于FPGA 的CRC校验码生成器

    大家好,又到了每日学习的时间了,今天我们来聊一聊基于FPGA 的CRC校验码生成器。下面咱们就来具体看看,欢迎大家一起交流学习。 1.概述 CRC即Cyclic Redundancy Check
    的头像 发表于 06-13 11:18 6496次阅读
    荐读:基于FPGA 的<b class='flag-5'>CRC</b><b class='flag-5'>校验码</b>生成器

    CRC校验码的C语言程序免费下载

    本文档的主要内容详细介绍的是CRC校验码的C语言程序免费下载。
    发表于 04-22 08:00 27次下载
    <b class='flag-5'>CRC</b><b class='flag-5'>校验码</b>的C语言程序免费下载

    CRC校验码并行计算的FPGA实现

    用软件实现 CRC 校验码计算很难满足高速数据通信的要求 ,基于硬件的实现方法中 ,有串行经典算法 LFSR 电路 以及由软件算法推导出来的
    发表于 03-28 09:34 30次下载
    <b class='flag-5'>CRC</b><b class='flag-5'>校验码</b>并行计算的FPGA<b class='flag-5'>实现</b>

    CRC校验码的多种Verilog实现方式

    CRC循环冗余校验码(Cyclic Redundancy Check),检错码。
    的头像 发表于 06-21 15:03 3389次阅读
    <b class='flag-5'>CRC</b><b class='flag-5'>校验码</b>的多种Verilog<b class='flag-5'>实现</b>方式