编码器CRC6校验计算异常:C语言实现与传感器结果不符
编码器CRC6计算始终无法匹配传感器返回值的问题
我尝试计算编码器输出数据的CRC6值,但始终无法得到正确结果。该传感器使用的CRC多项式为0x43,我最初的C语言实现代码如下:
//CRC6 calculation static uint8_t crc6(uint8_t *data, uint8_t len) { uint8_t i = 0; uint8_t j = 0; uint8_t crc = 0; for(i = 0; i < len; i++) { crc ^= data[i]; // Initial XOR with input data for(j = 0; j < 8; j++) { // Process each bit of the current byte if (crc & 0x20) // Check the MSB of the crc { crc = (crc << 1) ^ CRC6_POLY; // Shift left and XOR with polynomial if the bit is set } else { crc <<= 1; // Just shift left } crc &= 0x3F; // Ensure crc remains 6-bit } } return crc; }
我提取了部分样本数据,对比了自计算CRC与传感器返回的实际CRC值(上方为十进制,下方为十六进制):
二者始终不一致,我不清楚问题出在哪里。
编辑1:根据 datasheet 说明,CRC数据是反转的,但修改后仍未解决问题。我调用CRC函数的方式如下:
uint8_t crc1 = crc6(enc1_data, 3); uint8_t crc2 = crc6(enc2_data, 3); uint8_t crc1_is = ~(enc1_data[3] >> 2) & 0x3F; //crc is inverted! uint8_t crc2_is = ~(enc2_data[3] >> 2) & 0x3F; //crc is inverted!
编辑2:补充该传感器 datasheet 链接(第49页为CRC6相关内容):
IC-PZ系列传感器文档
编辑3:至今仍未解决问题,但我获取了厂商提供的示例。我的SPI_CRCS寄存器初始值为0x00,设置应该正确。
我修改后的CRC计算代码如下:
//CRC6 calculation static uint8_t crc6(uint8_t *data, uint8_t len) { uint8_t i = 0; uint8_t j = 0; uint8_t crc = (0x00 << 2); //Start value in SPI_CRCS register for(i = 0; i < len; i++) { crc ^= data[i]; // Initial XOR with input data for(j = 0; j < 8; j++) // Process each bit of the current byte { crc = crc & 0x80 ? (crc << 1) ^ (0x43 << 2) : crc << 1; } } return crc; }
调用方式为:
uint8_t crc1 = crc6(enc1_data, 4); //CRC should be zero to be correct
按预期最终应得到crc=0x00,但实际仍得到随机值。
内容的提问来源于stack exchange,提问作者Hans Lüthi
相关产品推荐
相关产品推荐

