CRC-32 值不匹配

CRC-32 values not matching

我正在使用 SPI 通信在 Raspberry Pi 和微控制器之间进行通信。我发送的值是“32”(一个 32 位整数)或“0x00000020”,微控制器计算出的 CRC 值为“2613451423”。我是这个 32 位整数的 运行 CRC32。 MCU 上使用的多项式是“0x04C11DB7”。下面是我在微控制器上使用的代码片段:

GPCRC_Init_TypeDef initcrc = GPCRC_INIT_DEFAULT;
initcrc.initValue = 0xFFFFFFFF; // Standard CRC-32 init value
initcrc.reverseBits = true; 
initcrc.reverseByteOrder =true; //Above line and this line converts data from big endian to little endian

/*********other code here**************/

for(int m=0;m<1;m++){
   data_adc = ((uint8_t *)(StartPage+m));//reading data from flash memory,StartPage is the address from where to read (data stored as 32bit integers),here reading only a byte 
   ecode = SPIDRV_STransmitB(SPI_HANDLE, data_adc, 4, 0);//transmitting 4 bytes (32-bit value) through SPI over to RPi
        
   GPCRC_Start(GPCRC); //Set CRC parameters such as polynomial  
   for(int i=0;i<1;i++){
      GPCRC_InputU32(GPCRC,((uint32_t *)(StartPage+i)));//generating crc for the same 32 bit value
   }

   //I also tried using below code:
   /*for(int i=0;i<4;i++){
      GPCRC_InputU8(GPCRC,((uint8_t *)(StartPage+i)));//generating crc for the same 32 bit value
     }*/

   checksum[0] = ~GPCRC_DataRead(GPCRC); //CRC value inverted and stored in array
   ecode = SPIDRV_STransmitB(SPI_HANDLE, checksum, 4, 0);//sending this value through SPI (in chunks of 4 bytes) 

在 RPi 上,我正在收集这个值(即“32”,我收到的值是正确的)但是 RPi 计算的 CRC 是“2172022818”。我正在使用“zlib”来计算 CRC32。我也添加了一个代码片段:

import datetime
import os
import struct
import time
import pigpio
import spidev
import zlib

bus = 0
device = 0
spi = spidev.SpiDev()
spi.open(bus, device)
spi.max_speed_hz = 4000000
spi.mode = 0

pi.set_mode(25, pigpio.INPUT)

rpi_crc=0
 
def output_file_path():
    return os.path.join(os.path.dirname(__file__),
               datetime.datetime.now().strftime("%dT%H.%M.%S") + ".csv")
 
def spi_process(gpio,level,tick):
    print("Detected")
    data = bytes([0]*4)
    crc_data = bytes([0]*4)
    spi.xfer2([0x02])
    with open(output_file_path(), 'w') as f:
        t1=datetime.datetime.now()
        for x in range(1):
            recv = spi.xfer2(data)
            values = struct.unpack("<" +"I"*1, bytes(recv))
            print(values)
            rpi_crc = zlib.crc32(bytes(recv))
            print('RPis own CRC generated:') 
            print(rpi_crc)
            f.write("\n")
            f.write("\n".join([str(x) for x in values]))
        mcu_crc_bytes = spi.xfer2(crc_data)
        mcu_crc = struct.unpack("<"+"I"*1,bytes(mcu_crc_bytes))
        mcu_crc_int = int(''.join(map(str,mcu_crc)))
        print('MCU sent this CRC:')
        print(mcu_crc_int)
        if (rpi_crc != mcu_crc_int):
            spi.xfer([0x03])
        t2=datetime.datetime.now()
        print(t2-t1)

input("Press Enter to start the process ")
spi.xfer2([0x01])

cb1=pi.callback(25, pigpio.RISING_EDGE, spi_process)

while True:
    time.sleep(1)

从这个论坛本身我了解到这可能是字节顺序的问题,所以我尝试使用一个值的字节顺序并将其与其他值进行比较,但它仍然产生不同的值。 例如:RPi 发送的值 is:2172022818(十进制) 将其更改为十六进制:0x81767022 更改字节顺序:0x22707681

微控制器发送的值is:2613451423(十进制) 将其更改为十六进制:0x9BC61A9F

如您所见,两个粗体值并不相同。如果我做错了什么或这里可能发生什么,请告诉我。谢谢!

编辑: 添加了更多代码以更好地概述之前缺少的某些方面。微控制器数据表(第 347 页上的 CRC):https://www.wless.ru/files/ZigBee/EFR32MG21/EFR32xG21_reference_manual.pdf

我能够找出问题所在。我用这个 https://crccalc.com/?crc=C5&method=crc32&datatype=hex&outtype=0 来确认我在微控制器和 RPi 上获得的 CRC 值。

第一个问题是关于微控制器的,我什至没有对数据执行 CRC,而是对存储数据的地址执行。

第二个问题是 MCU 正在对存储在 little-endian 表格中的值执行 CRC。同样在 RPi 上,CRC 正在对以 little-endian 形式存储的值执行。因此,由于两个设备上的字节序相同,我不必反转位或字节。

进行这些更改后,我能够在 RPi 和微控制器上获得正确且相同的 CRC 值。