2765|1

2057

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

[TI首届低功耗设计大赛]+寄存器版本的CRC试验+片内外设CRC和软件算法得到的校验值比较 [复制链接]

这篇是FR5969的CRC校验的寄存器的版本的简单试验。


       一组16个16位的随机数字移入CRC模块,以此同时也把这一组数据使用CRC-CCIT-BR algorithm软件算法处理。由于基于软件的算法只能处理8位的数据,所16位的数据在使用软件算法时需要拆分成两个8位的数据。比较使用这两种方法等到的校验值,校验值相等的话点亮P1.0控制的LED2,反之亦然。
首先通过向CRCINIRES中写入16位的初始值(种子),作为CRC发生器的初始值。向 CRC中写入数据,要参与CRC运算的数据必须按照与源生成CRC校验的相同顺序写入CRC数据输入寄存器CRCDIRB中,从CRCINIRES寄存器中读出校验值。

  1. //******************************************************************************
  2. //   MSP430FR59x Demo - CRC16, 比较 CRC 输出的校验字和使用软件算法得出的校验字
  3. //
  4. //   描述: 一组16个16位的随机数字移入CRC模块,以此同时也把这一组数据使用CRC-CCIT-BR algorithm
  5. //         软件算法处理。由于基于软件的算法只能处理8位的数据,所16位的数据在使用
  6. //         软件算法时需要拆分成两个8位的数据。比较使用这两种方法等到的校验值,校
  7. //         验值相等的话点亮P1.0控制的LED2,反之亦然。
  8. //
  9. //   MCLK = SMCLK = default DCO~1MHz
  10. //
  11. //                MSP430FR5969
  12. //             -----------------
  13. //         /|\|                 |
  14. //          | |                 |
  15. //          --|RST              |
  16. //            |                 |
  17. //            |             P1.0|--> LED
  18. //
  19. //   IC爬虫    QQ:1394024051
  20. //   
  21. //   Sep 2014
  22. //   Built with IAR Embedded Workbench V6.1
  23. //******************************************************************************
  24. #include <msp430.h>

  25. const unsigned int CRC_Init = 0xFFFF;

  26. const unsigned int CRC_Input[] = {
  27.   0x0fc0, 0x1096, 0x5042, 0x0010,           // 16 random 16-bit numbers
  28.   0x7ff7, 0xf86a, 0xb58e, 0x7651,           // these numbers can be
  29.   0x8b88, 0x0679, 0x0123, 0x9599,           // modified if desired
  30.   0xc58c, 0xd1e2, 0xe144, 0xb691
  31. };

  32. unsigned int CRC_Result;                   // 用于保存CRC16 module得到的校验值
  33. unsigned int SW_Results;                   // 用于保存软件收发得到的校验值


  34. unsigned int CCITT_Update(unsigned int, unsigned int);// 软件算法得到的校验值函数声明

  35. int main(void)
  36. {
  37.   unsigned int i;

  38.   WDTCTL = WDTPW | WDTHOLD; // 停止看门狗

  39.   // Configure GPIO
  40.   P1OUT &= ~BIT0;           // 设置P1.0的上点起始状态:输出低电平
  41.   P1DIR |= BIT0;            // 设置P1.0的上点起始状态:输出低电平

  42.   PM5CTL0 &= ~LOCKLPM5;     // 关闭上电端口默认输出高阻抗的功能,使能上电保持起始设置

  43.   // 使用芯片内部的CRC模块计算校验值,First, use the CRC16 hardware module to calculate the CRC...
  44.   CRCINIRES = CRC_Init;     // 初始化CRC16 HW module,首先通过向CRCINIRES中写入16位的初始值(种子),作为CRC发生器的初始值。
  45.                  

  46.   for(i=0;i<16;i++)
  47.   {
  48.     // Input random values into CRC Hardware
  49.     CRCDIRB = CRC_Input[i];                 // 向 CRC中写入数据,要参与CRC运算的
  50.                                             //数据必须按照与源生成CRC校验的相同顺序写入CRC数据输入寄存器CRCDIRB中
  51.     __no_operation();
  52.   }
  53.   CRC_Result = CRCINIRES;                   // 从CRCINIRES寄存器中读出校验值
  54.   /****************************************************************************/
  55.   
  56.   // 使用软件算法计算校验值,Now use a software routine to calculate the CRC...

  57.   SW_Results = CRC_Init;                    // Init SW CRC
  58.   for(i=0;i<16;i++)
  59.   {
  60.     // First input lower byte
  61.     SW_Results = CCITT_Update(SW_Results, CRC_Input[i] & 0xFF);
  62.     // Then input upper byte
  63.     SW_Results = CCITT_Update(SW_Results, (CRC_Input[i] >> 8) & 0xFF);
  64.   }
  65.   /****************************************************************************/
  66.   // 比较两种计算方法得到的校验值
  67.   if(CRC_Result==SW_Results)                // 如果相等
  68.     P1OUT |= BIT0;                          // 点亮LED
  69.   else
  70.     P1OUT &= ~BIT0;                         // 不相等熄灭LED

  71.   while(1);                                 // infinite loop
  72. }

  73. /*******************************************************************************
  74. *函数名 :CCITT_Update
  75. *描述   :软件方式计算循环冗余校验
  76. *输入   :init-初始值,input-需要校验的数据
  77. *输出   :CCITT-计算得到的校验值
  78. *调用   :内部调用
  79. *******************************************************************************/
  80. unsigned int CCITT_Update(unsigned int init, unsigned int input)
  81. {
  82.   unsigned int CCITT = (unsigned char) (init >> 8) | (init << 8);
  83.   CCITT ^= input;
  84.   CCITT ^= (unsigned char) (CCITT & 0xFF) >> 4;
  85.   CCITT ^= (CCITT << 8) << 4;
  86.   CCITT ^= ((CCITT & 0xFF) << 4) << 1;
  87.   return CCITT;
  88. }
复制代码

4-CRC-循环冗余校验.rar (27.96 KB, 下载次数: 2, 售价: 2 分芯积分)

最新回复

顺道看看,不错  详情 回复 发表于 2014-9-29 22:59
 
点赞 关注

回复
举报

705

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
顺道看看,不错
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表