libero PolarFire soc SPI-DirectC .dat CRC16-CCITT 校验

参考文档: SPI-DirectC User Guide 

源码下载:DirectC | Microchip Technology

 

image

 

 

源码中的校验:

void dp_compute_crc(void)
{
    for (global_uchar2 = 0u; global_uchar2 < 8u; global_uchar2++)
    {
        global_uint2 = (global_uchar1 ^ global_uint1) & 0x01u;
        global_uint1 >>= 1u;
        if (global_uint2)
        {
            global_uint1 ^= 0x8408u;
        }
        global_uchar1 >>= 1u;
    }
   
    return;
}

 

// 换成 效率更高的查表校验

#define CRC_POLY_KERMIT 0x8408
#define CRC_START_16    0x0000
static uint16_t crc_tab16[256];

static void init_crc16_tab( void ) 
{

    uint16_t i;
    uint16_t j;
    uint16_t crc;
    uint16_t c;
    uint16_t CRC_POLY_16 = CRC_POLY_KERMIT;

    for (i=0; i<256; i++)
    {

        crc = 0;
        c   = i;

        for (j=0; j<8; j++) 
        {

            if ( (crc ^ c) & 0x0001 ) crc = ( crc >> 1 ) ^ CRC_POLY_16;
            else                      crc =   crc >> 1;

            c = c >> 1;
        }

        crc_tab16[i] = crc;
    }

}

uint16_t crc_16( const unsigned char *input_str, size_t num_bytes ) 
{

    uint16_t crc;
    const unsigned char *ptr;
    size_t a;

    crc = CRC_START_16;
    ptr = input_str;

    if ( ptr != NULL ) for (a=0; a<num_bytes; a++) {

        crc = (crc >> 8) ^ crc_tab16[ (crc ^ (uint16_t) *ptr++) & 0x00FF ];
    }

    return crc;

} 

 

 

上面两种代码 放到 C 中测试: 

 

0xA5 crc16=0xF2A7.
0xA5 crc16=0xF2A7.

 

与 最上面截图 一致!

 

verilog crc16-ccitt 代码生成: libero verilog crc16-CCITT - 所长 - 博客园

posted on 2026-01-27 16:14  所长  阅读(2)  评论(0)    收藏  举报

导航