串行通信的CRC32计算

snz8szmq  于 2023-03-22  发布在  其他
关注(0)|答案(2)|浏览(200)

我被分配使用CRC8的CRC32更新现有固件。背景是2个MCU使用串行通信进行通信。当我在网上做一些研究时,我看到了2个版本的CRC计算。第一个版本是

uint32_t  CalcCRC32(const uint8_t *pData, uint32_t length, uint32_t crc)
{
    const uint8_t *end = pData + length;

    while (pData < end)
    {
        crc ^= *pData++;

        for(i=0; i<8; i++){
           crc = crc & 0x80000000 ? (crc << 1) ^ 0x04C11DB7 : (crc << 1);
        }
    }

    return crc;
}

第二个版本是

uint32_t CRC32_function(uint8_t *pData, uint32_t len, uint32_t crc){

    uint32_t val, crc;
    uint8_t i;

    crc = 0xFFFFFFFF;
    while(len--){
        val=(crc^*pData++)&0xFF;
        for(i=0; i<8; i++){
            val = val & 0x1 ? (val>>1)^0xEDB88320 : val>>1;
        }
        crc = val^crc>>8;
    }
    return crc^0xFFFFFFFF;
}

我的假设是我必须使用第一个功能的第一个MCU和第二个功能的第二个MCU,因为多项式0xEDB88320是0x04C11DB7的反向。我是正确的吗?如果不是,我会非常感谢的建议。提前感谢。

2cmtqfgy

2cmtqfgy1#

不,这是不正确的。您将在两端使用相同的函数,或至少是等效的计算。
这两个函数计算两个完全不同的CRC-32。第二个函数是一个非常标准的CRC-32,广泛使用的CRC-32/ISO-HDLC,可以在zlib中快速软件实现(比您显示的简单位函数快得多)。
第一个函数计算一个未出现在CRC目录中的纯CRC,但它可能在其来源的应用程序中用于预处理和后处理,以计算CRC-32/BZIP 2或CRC-32/MPEG 2。

lyfkaqu1

lyfkaqu12#

功能提示

在发射机和接收机中使用相同的环路。

速度提示

使用串行通信-如果一次执行1个字节,即使在高波特率下,如果CRC一次执行一个字节,则CPU可能有大量时间执行CRC。
IOW,在发送/接收时计算CRC,而不是之后。
伪码

Set-up initial `crc` state.
While there is data to receive/transmit
  send/receiver one byte in `*pData`
  val = (crc ^ *pData++) & 0xFF;
  for (i=0; i<8; i++){
    val = val & 0x1 ? (val>>1)^0xEDB88320 : val>>1;
  }
  crc = val ^ crc>>8;
}
Finish CRC.

现在你的CRC计算不会在最后一个字节后花费大量时间-延迟的改善。

相关问题