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 值。
我正在使用 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 值。