无法复现Maxim DOW CRC算法应用笔记中的示例结果求助
解决Maxim应用笔记27中CRC8计算匹配0xA2的问题
关键参数匹配
Maxim iButton/DS18B20使用的CRC8算法参数和多数在线工具默认值差异较大,必须严格设置以下参数才能得到0xA2的结果:
- 生成多项式:
X^8 + X^5 + X^4 + 1(二进制100110001,字节表示为0x31,需去掉最高位的1) - 初始CRC值:
0x00 - 输入字节处理:不反转位序(按高位到低位依次处理)
- 输出CRC值:不反转位序
- 最终异或值:
0x00
验证示例(ROM数据为8字节0x00)
应用笔记中使用的测试数据是8字节全0的ROM代码,计算步骤如下:
- 初始化CRC寄存器为
0x00 - 对每个字节(共8个0x00)执行CRC计算:
- 将当前CRC值与输入字节异或
- 对结果循环8次:若最高位为1,则CRC值左移1位后异或
0x31;否则仅左移1位
- 8个字节处理完成后,CRC寄存器的值即为
0xA2
可直接复用的C语言实现
uint8_t crc8_maxim(uint8_t *data, uint8_t len) { uint8_t crc = 0x00; uint8_t i; while (len--) { crc ^= *data++; for (i = 0; i < 8; i++) { if (crc & 0x80) { crc = (crc << 1) ^ 0x31; } else { crc <<= 1; } } } return crc; }
调用该函数传入8个0x00的数组,返回值即为0xA2,完全匹配应用笔记的结果。
在线工具无法匹配的原因
多数在线CRC计算器默认使用**反射(RefIn/RefOut=true)**参数(比如常用的CRC8-CCITT),或初始值设为0xFF,这和Maxim的算法完全不兼容。若一定要用在线工具,必须手动修改所有参数为上述值才能得到正确结果。
内容的提问来源于stack exchange,提问作者Archie
相关产品推荐
相关产品推荐

