首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微中的8位CRC计算

微中的8位CRC计算
EN

Stack Overflow用户
提问于 2022-06-09 07:47:05
回答 2查看 475关注 0票数 0

我试图在micropython中实现和使用8位CRC,与ADC (ADS1235德州仪器)一起使用。

我已经尝试了一段时间来重写现有的程序(主要是用C实现的),并从下到上编写这个函数,但是没有效果。

下面的功能是我能找到的最接近我正在寻找的功能。我使用的CRC具有多项式0x07。

从PM 2环获取的函数--注释"1

代码语言:javascript
复制
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 

我尝试使用基于PM 2环表的实现,但这也不起作用

代码语言:javascript
复制
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

我对第一个函数的修改如下所示:

代码语言:javascript
复制
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 
EN

回答 2

Stack Overflow用户

发布于 2022-06-10 02:05:39

对于CRC,似乎您正在尝试实现,这是一个反射CRC,您需要反映多项式。你需要poly = 0xe0

代码可以简化一些。消息的for循环可以是:

代码语言:javascript
复制
for byte in msg:
    crc ^= byte
    for _ in range(8):
        if crc & 1:
            crc = (crc >> 1) ^ poly
        else:
            crc >>= 1

至于这是否你真正需要的CRC,我不知道。您需要的CRC是否得到反映?初值是零吗?0x55是从哪里来的?您有您没有向我们透露的CRC说明书吗?您是否有您知道正确的CRC值的示例数据?

更新:

基于下面的注释,OP需要实现CRC-8/I-432-1。它不是一个反射的CRC,所以移位是向上的,而不是向下的,有多项式0x07,初始值为零,并且是最终的排他性或0x55。这方面的执行将是:

代码语言:javascript
复制
def crc8_itu(msg):
    crc = 0
    for byte in msg:
        crc ^= byte
        for _ in range(8):
            crc = (crc << 1) ^ 7 if crc & 0x80 else crc << 1
        crc &= 0xff
    return crc ^ 0x55
票数 0
EN

Stack Overflow用户

发布于 2022-06-10 10:50:29

结果发现CRC有比我预期的更多的参数。

阅读TI应用报告中的C代码部分,我看到初始的CRC-值是0xFF,最后的XOR-值是0x00

使用带有在线计算器这个设置,我可以获得与ADS1235相同的CRC结果。

重写@Mark Adler的代码:

代码语言:javascript
复制
def crc8_8_atm(msg):
    crc = 0xFF
    for byte in msg:
        crc ^= byte
        for _ in range(8):
            crc = (crc << 1) ^ 0x07 if crc & 0x80 else crc << 1
        crc &= 0xff
    return crc ^ 0x00

给了我预期的结果。

感谢@Mark

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72556517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档