MicroPython下适配TI ADS1235 ADC的8位CRC计算实现问题
MicroPython适配ADS1235的8位CRC实现问题
问题描述
- 目标:在MicroPython环境中实现8位CRC校验,适配德州仪器ADS1235模数转换器
- 已尝试方案:移植C语言CRC实现、从零手写CRC计算函数、参考PM 2Ring给出的16位CCITT CRC实现改写8位版本、尝试复用查表法逻辑,均未得到正确结果
- 已知参数:使用CRC多项式为
0x07
参考的16位CRC实现代码
逐位计算版本
def crc_16_CCITT(msg): poly = 0x8408 crc = 0xffff for byte in msg: for _ in range(8): if (byte ^ crc) & 1: crc = (crc >> 1) ^ poly else: crc >>= 1 byte >>= 1 return crc ^ 0xffff
查表法快速版本
def make_crc_table(): poly = 0x8408 table = [] for byte in range(256): crc = 0 for bit in range(8): if (byte ^ crc) & 1: crc = (crc >> 1) ^ poly else: crc >>= 1 byte >>= 1 table.append(crc) return table table = make_crc_table() def crc_16_fast(msg): crc = 0xffff for byte in msg: crc = table[(byte ^ crc) & 0xff] ^ (crc >> 8) return crc ^ 0xffff
自行改写的错误8位CRC版本
def crc_8_CCITT(msg): poly = 0x07 crc = 0x00 for byte in msg: for _ in range(8): if (byte ^ crc) & 1: crc = (crc >> 1) ^ poly else: crc >>= 1 byte >>= 1 return crc ^ 0x55
错误原因与正确实现
改写版本存在两个核心参数错误,不符合ADS1235的CRC规范:
- 初始值错误:ADS1235要求CRC计算初始值为
0xFF,而非代码中使用的0x00 - 输出异或值错误:ADS1235的CRC计算结果不需要额外异或
0x55,直接返回计算值即可
逐位计算正确实现(适配MicroPython)
def crc8_ads1235(msg): poly = 0x07 crc = 0xFF for byte in msg: crc ^= byte for _ in range(8): if crc & 1: crc = (crc >> 1) ^ poly else: crc >>= 1 return crc
查表法快速实现(适配MicroPython)
def make_crc8_table(): poly = 0x07 table = [] for byte in range(256): crc = byte for _ in range(8): if crc & 1: crc = (crc >> 1) ^ poly else: crc >>= 1 table.append(crc) return table # 初始化时一次性生成查表,避免重复计算占用运行时间 crc8_table = make_crc8_table() def crc8_ads1235_fast(msg): crc = 0xFF for byte in msg: crc = crc8_table[crc ^ byte] return crc
验证说明
可以对照ADS1235官方手册给出的校验样例验证:输入单字节0x00时,正确CRC计算结果为0x87,计算结果匹配即可确认实现正确。
内容的提问来源于stack exchange,提问作者Jakobs
相关产品推荐
相关产品推荐

