You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 18:21:52