|
LPC11E68支持三种常见的循环冗余校验CRC多项式CRC-CCITT、CRC-16和CRC-32。使用LPC11E68提供的硬件CRC可以减少代码量,直接将数据交给硬件计算,减轻MCU负担。硬件CRC具有多种特性:位顺序反转和1的补码可编程设置,用于输入数据和CRC求和;可编程的种子数设置;每次写操作接受数据宽度:8、16或32位。 使用CRC之前,需要在SYSAHBCLKCTRL寄存器中使能CRC引擎的时钟。通过置位SYSAHBCLKCTRL的位28使能CRC时钟。 下图是CRC引擎的功能框图
从上图可以看到,硬件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工具计算的结果与变量值进行比较,验证测试代码是否正确。以下是测试过程中使用的代码: - #include "LPC11E6x.h"
- #include "crc_lpc11e6x.h"
- const uint8_t CRC_TestData8[6] = {0x01,0x02,0x03,0x04,0x05,0x06};
- const uint16_t CRC_TestData16[6] = {0x01,0x02,0x03,0x04,0x05,0x06};
- const uint32_t CRC_TestData32[6] = {0x01,0x02,0x03,0x04,0x05,0x06};
- uint32_t CRC8_Sum;
- uint32_t CRC16_Sum;
- uint32_t CRC32_Sum;
- int main(void)
- {
- SystemCoreClockUpdate();
-
- Chip_CRC_Init();
-
- CRC8_Sum = Chip_CRC_CRC8(CRC_TestData8, sizeof(CRC_TestData8));
- CRC16_Sum = Chip_CRC_CRC16(CRC_TestData16, sizeof(CRC_TestData16));
- CRC32_Sum = Chip_CRC_CRC32(CRC_TestData32, sizeof(CRC_TestData32));
-
- while(1)
- ;
- }
复制代码下图是测试结果。CRC_Sum变量值与CRC工具计算的值都是0xD71C。
|