阿哲
发表于: 2016-12-28 14:43:12 | 显示全部楼层

LPC11E68支持三种常见的循环冗余校验CRC多项式CRC-CCITT、CRC-16和CRC-32。使用LPC11E68提供的硬件CRC可以减少代码量,直接将数据交给硬件计算,减轻MCU负担。硬件CRC具有多种特性:位顺序反转和1的补码可编程设置,用于输入数据和CRC求和;可编程的种子数设置;每次写操作接受数据宽度:8、16或32位。

使用CRC之前,需要在SYSAHBCLKCTRL寄存器中使能CRC引擎的时钟。通过置位SYSAHBCLKCTRL的位28使能CRC时钟。

下图是CRC引擎的功能框图

block.jpg

从上图可以看到,硬件CRC挂载在AHB总线上。CRC的寄存器直接与AHB总线进行通信。CRC的输入数据经过多路复用器MUX,选择数据带宽;然后根据CRC_MODE寄存器的设置进行补码和位翻转操作,循环使用CRC多项式校验,将结果安装CRC_MODE寄存器的设置进行补码和位翻转操作,最后保存到CRC_SUM寄存器中。通过读取CRC_SUM寄存器就可以获得CRC校验的结果。


与CRC引擎相关的寄存器共有四个:MODE、SEED、SUM和WR_DATA。

■    MODE:CRC模式寄存器。该寄存器选择CRC引擎使用的多项式,同时设置输入数据和CRC求和的位顺序反转和1的补码状态。

■    SEED:CRC种子寄存器。写入该值,则会向SUM寄存器载入CRC种子值。

■    SUM:CRC校验和寄存器。该寄存器保存着最近的CRC总和数据。该寄存器数据只读寄存器。

■    WR_DATA:CRC数据寄存器。该寄存器是一个只写寄存器,包含用于计算CRC总和的数据块。


测试

测试采用的CRC-CCITT多项式。输入数据CRC_TestData,校验和保存在CRC_Sum变量中。通过与CRC工具计算的结果与变量值进行比较,验证测试代码是否正确。以下是测试过程中使用的代码:

  1. #include "LPC11E6x.h"
  2. #include "crc_lpc11e6x.h"

  3. const uint8_t CRC_TestData8[6] = {0x01,0x02,0x03,0x04,0x05,0x06};
  4. const uint16_t CRC_TestData16[6] = {0x01,0x02,0x03,0x04,0x05,0x06};
  5. const uint32_t CRC_TestData32[6] = {0x01,0x02,0x03,0x04,0x05,0x06};

  6. uint32_t CRC8_Sum;
  7. uint32_t CRC16_Sum;
  8. uint32_t CRC32_Sum;

  9. int main(void)
  10. {
  11.         SystemCoreClockUpdate();
  12.         
  13.         Chip_CRC_Init();
  14.         
  15.         CRC8_Sum = Chip_CRC_CRC8(CRC_TestData8, sizeof(CRC_TestData8));
  16.         CRC16_Sum = Chip_CRC_CRC16(CRC_TestData16, sizeof(CRC_TestData16));
  17.         CRC32_Sum = Chip_CRC_CRC32(CRC_TestData32, sizeof(CRC_TestData32));
  18.         
  19.         while(1)
  20.                 ;
  21. }
复制代码

下图是测试结果。CRC_Sum变量值与CRC工具计算的值都是0xD71C

5.jpg

crc-test.jpg


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 53 | 回复: 76



手机版|

GMT+8, 2024-12-21 20:52 , Processed in 0.048193 second(s), 7 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表