libero PolarFire soc SPI-DirectC .dat CRC16-CCITT 校验
参考文档: SPI-DirectC User Guide
源码下载:DirectC | Microchip Technology

源码中的校验:
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 - 所长 - 博客园
浙公网安备 33010602011771号