|
[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寄存器中读出校验值。
- //******************************************************************************
- // MSP430FR59x Demo - CRC16, 比较 CRC 输出的校验字和使用软件算法得出的校验字
- //
- // 描述: 一组16个16位的随机数字移入CRC模块,以此同时也把这一组数据使用CRC-CCIT-BR algorithm
- // 软件算法处理。由于基于软件的算法只能处理8位的数据,所16位的数据在使用
- // 软件算法时需要拆分成两个8位的数据。比较使用这两种方法等到的校验值,校
- // 验值相等的话点亮P1.0控制的LED2,反之亦然。
- //
- // MCLK = SMCLK = default DCO~1MHz
- //
- // MSP430FR5969
- // -----------------
- // /|\| |
- // | | |
- // --|RST |
- // | |
- // | P1.0|--> LED
- //
- // IC爬虫 QQ:1394024051
- //
- // Sep 2014
- // Built with IAR Embedded Workbench V6.1
- //******************************************************************************
- #include <msp430.h>
- const unsigned int CRC_Init = 0xFFFF;
- const unsigned int CRC_Input[] = {
- 0x0fc0, 0x1096, 0x5042, 0x0010, // 16 random 16-bit numbers
- 0x7ff7, 0xf86a, 0xb58e, 0x7651, // these numbers can be
- 0x8b88, 0x0679, 0x0123, 0x9599, // modified if desired
- 0xc58c, 0xd1e2, 0xe144, 0xb691
- };
- unsigned int CRC_Result; // 用于保存CRC16 module得到的校验值
- unsigned int SW_Results; // 用于保存软件收发得到的校验值
- unsigned int CCITT_Update(unsigned int, unsigned int);// 软件算法得到的校验值函数声明
- int main(void)
- {
- unsigned int i;
- WDTCTL = WDTPW | WDTHOLD; // 停止看门狗
- // Configure GPIO
- P1OUT &= ~BIT0; // 设置P1.0的上点起始状态:输出低电平
- P1DIR |= BIT0; // 设置P1.0的上点起始状态:输出低电平
- PM5CTL0 &= ~LOCKLPM5; // 关闭上电端口默认输出高阻抗的功能,使能上电保持起始设置
- // 使用芯片内部的CRC模块计算校验值,First, use the CRC16 hardware module to calculate the CRC...
- CRCINIRES = CRC_Init; // 初始化CRC16 HW module,首先通过向CRCINIRES中写入16位的初始值(种子),作为CRC发生器的初始值。
-
- for(i=0;i<16;i++)
- {
- // Input random values into CRC Hardware
- CRCDIRB = CRC_Input[i]; // 向 CRC中写入数据,要参与CRC运算的
- //数据必须按照与源生成CRC校验的相同顺序写入CRC数据输入寄存器CRCDIRB中
- __no_operation();
- }
- CRC_Result = CRCINIRES; // 从CRCINIRES寄存器中读出校验值
- /****************************************************************************/
-
- // 使用软件算法计算校验值,Now use a software routine to calculate the CRC...
- SW_Results = CRC_Init; // Init SW CRC
- for(i=0;i<16;i++)
- {
- // First input lower byte
- SW_Results = CCITT_Update(SW_Results, CRC_Input[i] & 0xFF);
- // Then input upper byte
- SW_Results = CCITT_Update(SW_Results, (CRC_Input[i] >> 8) & 0xFF);
- }
- /****************************************************************************/
- // 比较两种计算方法得到的校验值
- if(CRC_Result==SW_Results) // 如果相等
- P1OUT |= BIT0; // 点亮LED
- else
- P1OUT &= ~BIT0; // 不相等熄灭LED
- while(1); // infinite loop
- }
- /*******************************************************************************
- *函数名 :CCITT_Update
- *描述 :软件方式计算循环冗余校验
- *输入 :init-初始值,input-需要校验的数据
- *输出 :CCITT-计算得到的校验值
- *调用 :内部调用
- *******************************************************************************/
- unsigned int CCITT_Update(unsigned int init, unsigned int input)
- {
- unsigned int CCITT = (unsigned char) (init >> 8) | (init << 8);
- CCITT ^= input;
- CCITT ^= (unsigned char) (CCITT & 0xFF) >> 4;
- CCITT ^= (CCITT << 8) << 4;
- CCITT ^= ((CCITT & 0xFF) << 4) << 1;
- return CCITT;
- }
复制代码
4-CRC-循环冗余校验.rar
(27.96 KB, 下载次数: 2, 售价: 2 分芯积分)
|
|