CRC

设备说明

​ CRC即循环冗余校验码(Cyclic Redundancy Check):数据通信领域中最常用的一种差错校验码,其信息字段和校验字段长度可以任意指定,但要求通信双方定义的CRC标准一致 。

​ CRC原理:在K位信息码(目标发送数据)后再拼接R位校验码,使整个编码长度为N位,因此这种编码也叫(N,K)码。通俗的说,就是在需要发送的信息后面附加一个数(即校验码),生成一个新的发送数据发送给接收端。这个数据要求能够使生成的新数据被一个特定的数整除。

接口列表

SHA的CSI接口如下所示:

函数 说明
csi_crc7_be 计算CRC7值
csi_crc8 计算CRC8值
csi_crc8_maxim 计算CRC8 MAXIM值
csi_crc16 计算CRC16值
csi_crc16_ccitt 计算CRC16 CCITT值
csi_crc16_dnp 计算CRC16 DNP值
csi_crc16_itu 计算CRC16 ITU值
csi_crc32_le 计算CRC32值,多项式值为 0xEDB88320
csi_crc32_be 计算CRC32值,多项式值为 0x04C11DB7

SHA的CSI接口在用户对接时是否必须适配的说明如下所示:

函数 是否必须适配 这个IP都没有
csi_crc7_be 非必须
csi_crc8 必须
csi_crc8_maxim 必须
csi_crc16 必须
csi_crc16_ccitt 必须
csi_crc16_dnp 非必须
csi_crc16_itu 非必须
csi_crc32_le 非必须
csi_crc32_be 非必须

接口详细说明

csi_crc7_be

uint8_t csi_crc7_be(uint8_t crc, uint8_t* data, uint32_t size)
  • 功能描述:

    • 计算CRC7值。
  • 参数:

    • crc: 初始值。
    • data: 待计算数据地址。
    • size: 待计算数长度。
  • 返回值:

    • CRC7值。

csi_crc8

uint8_t csi_crc8(uint8_t crc, uint8_t* data, uint32_t size)
  • 功能描述:

    • 计算CRC8值。
  • 参数:

    • crc: 初始值。
    • data: 待计算数据地址。
    • size: 待计算数长度。
  • 返回值:

    • CRC8值。

csi_crc8_maxim

uint8_t csi_crc8_maxim(uint8_t crc, uint8_t* data, uint32_t size)
  • 功能描述:

    • 计算CRC8 MAXIM值。
  • 参数:

    • crc: 初始值。
    • data: 待计算数据地址。
    • size: 待计算数长度。
  • 返回值:

    • CRC8 MAXIM值。

csi_crc16

uint16_t csi_crc16(uint16_t crc, uint8_t* data, uint32_t size)
  • 功能描述:

    • 计算CRC16值。
  • 参数:

    • crc: 初始值。
    • data: 待计算数据地址。
    • size: 待计算数长度。
  • 返回值:

    • CRC16值。

csi_crc16_ccitt

uint16_t csi_crc16_ccitt(uint16_t crc, uint8_t* data, uint32_t size)
  • 功能描述:

    • 计算CRC16 CCITT值。
  • 参数:

    • crc: 初始值。
    • data: 待计算数据地址。
    • size: 待计算数长度。
  • 返回值:

    • CRC16 CCITT值。

csi_crc16_dnp

uint16_t csi_crc16_dnp(uint16_t crc, uint8_t* data, uint32_t size)
  • 功能描述:

    • 计算CRC16 DNP值。
  • 参数:

    • crc: 初始值。
    • data: 待计算数据地址。
    • size: 待计算数长度。
  • 返回值:

    • CRC16 DNP值。

csi_crc16_itu

uint16_t csi_crc16_itu(uint16_t crc, uint8_t* data, uint32_t size)
  • 功能描述:

    • 计算CRC16 ITU值。
  • 参数:

    • crc: 初始值。
    • data: 待计算数据地址。
    • size: 待计算数长度。
  • 返回值:

    • CRC16 ITU值。

csi_crc32_le

uint32_t csi_crc32_le(uint32_t crc, uint8_t* data, uint32_t size)
  • 功能描述:

    • 计算CRC32 值,多项式值为 0xEDB88320。
  • 参数:

    • crc: 初始值。
    • data: 待计算数据地址。
    • size: 待计算数长度。
  • 返回值:

    • CRC32值。

csi_crc32_be

uint32_t csi_crc32_be(uint32_t crc, uint8_t* data, uint32_t size)
  • 功能描述:

    • 计算CRC32 值,多项式值为 0x04C11DB7。
  • 参数:

    • crc: 初始值。
    • data: 待计算数据地址。
    • size: 待计算数长度。
  • 返回值:

    • CRC32值。

使用示例

各接口使用实例

/*
 * Copyright (C) 2017-2020 Alibaba Group Holding Limited
 */


/******************************************************************************
 * @file     example_crc.c
 * @brief    the main function for the CRC driver
 * @version  V1.0
 * @date     04. Mar 2020
 ******************************************************************************/
#include <stdio.h>
#include "soc.h"
#include "drv/crc.h"

void crc_modbus()
{
    uint8_t crc_input[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56};
    uint32_t crc_input1[] = {0x44332211, 0x44332211, 0x44332211, 0x44332211};
    uint32_t expect_out[] = {0x10, 0x76, 0x98, 0x7e44, 0x8efa, 0x2598, 0xa900, 0xe3c8, 0x0, 0x39C45259};
    uint32_t out;
    out = csi_crc7_be(0, (uint8_t *)crc_input, 5);

    if (out == expect_out[0]) {
        printf("test csi_crc7_be successfully\n");
    } else {
        printf("test csi_crc7_be faild %x\n", out);
    }

    out = csi_crc8(0xff, (uint8_t *)crc_input, 4);

    if (out == expect_out[1]) {
        printf("test csi_crc8 successfully\n");
    } else {
        printf("test csi_crc8 faild %x\n", out);
    }


    out = csi_crc8_maxim(0, (uint8_t *)crc_input, 4);

    if (out == expect_out[2]) {
        printf("test csi_crc8_maxim successfully\n");
    } else {
        printf("test csi_crc8_maxim faild %x\n", out);
    }

    out = csi_crc16(0, (uint8_t *)crc_input1, 16);

    if (out == expect_out[3]) {
        printf("test csi_crc16/0 successfully\n");
    } else {
        printf("test csi_crc16/0 faild %x\n", out);
    }

    out = csi_crc16(0xffff, (uint8_t *)crc_input1, 16);

    if (out == expect_out[4]) {
        printf("test csi_crc16/0xffff successfully\n");
    } else {
        printf("test csi_crc16/0xffff  faild %x\n", out);
    }

    out = csi_crc16_ccitt(0, (uint8_t *)crc_input1, 16);

    if (out == expect_out[5]) {
        printf("test csi_crc16_ccitt successfully\n");
    } else {
        printf("test csi_crc16_ccitt faild %x\n", out);
    }

    out = csi_crc16_dnp(0, (uint8_t *)crc_input1, 16);

    if (out == expect_out[6]) {
        printf("test csi_crc16_dnp successfully\n");
    } else {
        printf("test csi_crc16_dnp faild %x\n", out);
    }

    out = csi_crc16_itu(0, (uint8_t *)crc_input1, 16);

    if (out == expect_out[7]) {
        printf("test csi_crc16_itu successfully\n");
    } else {
        printf("test csi_crc16_itu faild %x\n", out);
    }

    out = csi_crc32_le(0, (uint8_t *)crc_input1, 16);

    if (out == expect_out[8]) {
        printf("test csi_crc32_le successfully\n");
    } else {
        printf("test csi_crc32_le faild %x\n", out);
    }

    out = csi_crc32_be(0, (uint8_t *)crc_input1, 16);

    if (out == expect_out[9]) {
        printf("test csi_crc32_be successfully\n");
    } else {
        printf("test csi_crc32_be faild %x\n", out);
    }

    printf("test crc finish\n");
}

/*****************************************************************************
test_main: main function of the &crc test

INPUT: NULL

RETURN: NULL

*****************************************************************************/
int example_crc(void)
{
    crc_modbus();
    return 0;
}
extern int board_init(void);
int main(void)
{
    board_init();
    printf("hello\n");
    return example_crc();
}

results matching ""

    No results matching ""