这是最新(主)开发分支的文档。如果您正在查找以前版本的文档,使用左侧的下拉菜单选择所需的版本。

CRC

简介

CRC 即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

W80x支持 CRC8、 CRC16_MODBUS、 CRC16_CCITT 和 CRC32 四种模式。支持支持输入/输出反向。SHA1/MD5/CRC 支持连续多包加密,且支持交替运算。

功能列表

  1. 初始化——初始化驱动。

  2. 配置ctx——根据 CRC 计算模式和输入输出是否反向配置上下文 ctx。

  3. 追加数据——追加数据到 ctx 并计算 CRC。

  4. 读取CRC——读取 ctx 中的 CRC 值。

初始化驱动

调用 wm_drv_crc_init() ,得到指向 CRC 模块的设备指针,只有得到了这个指针才能调用其他的 CRC 模块相关的 API。示例:

wm_device_t *dev;
dev = wm_drv_crc_init("crc");

函数参数指定设备名称,名称在设备表中定义。

配置 ctx

调用 wm_drv_crc_cfg() ,根据 CRC 计算模式和输入输出是否反向配置上下文 ctx。示例:

uint32_t init_value = 0xFFFFFFFF;
wm_drv_crc_cfg_t ctx;
wm_device_t *dev;

/*initialize crc*/
dev = wm_drv_crc_init("crc");
wm_drv_crc_cfg(dev, &ctx, init_value, WM_GPSEC_CRC8, WM_GPSEC_CRC_REVERSE_NONE);

第一个参数是:指向设备的指针

第二个参数是:指向一个上下文的指针

第三个参数是:初始值

第四个参数是:CRC 计算模式,0 到 3 分别表示CRC8、 CRC16_MODBUS、 CRC16_CCITT 和 CRC32

第五个参数是:输入和输出是否反向,0 表示不反向,1 表示输出反向,2 表示输入反向,3 表示输入输出均反向

追加数据

调用 wm_drv_crc_update() ,根据上下文 ctx 计算 CRC,将结果保存到 ctx 中,该接口可连续调用多次追加数据。支持不同的上下文 ctx 交替执行。示例:

uint32_t init_value = 0;
uint8_t *in     = NULL;
int i;
wm_drv_crc_cfg_t ctx;
wm_device_t *dev;

/*initialize crc*/
dev = wm_drv_crc_init("crc");

in = malloc(1024);

for (i = 0; i < 1024; i++) {
    in[i] = i;
}
wm_drv_crc_cfg(dev, &ctx, init_value, WM_GPSEC_CRC8, WM_GPSEC_CRC_REVERSE_NONE);
wm_drv_crc_update(dev, &ctx, in, 512);
wm_drv_crc_update(dev, &ctx, in + 512, 512);

第一个参数是:指向设备的指针

第二个参数是:指向一个上下文的指针

第三个参数是:数据指针

第四个参数是:数据长度,字节数,范围是 1-65532

读取 CRC

调用 wm_drv_crc_final() 函数读取上下文 ctx 中的 CRC 值,示例:

uint32_t init_value = 0;
uint8_t *in     = NULL;
int i;
wm_drv_crc_cfg_t ctx;
wm_device_t *dev;
uint32_t crcvalue = 0;

/*initialize crc*/
dev = wm_drv_crc_init("crc");

in = malloc(1024);

for (i = 0; i < 1024; i++) {
    in[i] = i;
}
wm_drv_crc_cfg(dev, &ctx, init_value, WM_GPSEC_CRC8, WM_GPSEC_CRC_REVERSE_NONE);
wm_drv_crc_update(dev, &ctx, in, 512);
wm_drv_crc_update(dev, &ctx, in + 512, 512);
wm_drv_crc_final(dev, &ctx, &crcvalue);

第一个参数是:指向设备的指针

第二个参数是:指向一个上下文的指针

第三个参数是:指向结果的指针

应用实例

使用 CRC 基本示例请参考 examples/peripheral/crc

API 参考

查找 CRC 相关 API 请参考:

CRC API 参考