我正在一个设备上的MSP430FR5869 MCU上,该设备下载软件更新并检查CRC是否与使用python脚本从服务器创建的CRC匹配。我想使用MSP430的硬件生成的CRC16,但似乎无法获得与从Python 2.7脚本获得的CRC16匹配的代码。
在MCU用户指南中,它说可以使用多项式进行CRC16运算:
f(x) = x^16 + x^12 + x^5 + 1
它继续说明,首先我必须发送种子以初始化结果寄存器,一次将数据放入两个字节(因为它为数据输入分配了2个字节),然后最后运行结果函数。我通常使用MCU生产商(TI)提供的标准库中的功能。无奈之下,我尝试了所有功能组合,以查看是否获得了匹配的数字(反转输入,反转结果,添加0而不是0),但是没有成功。我想知道我是否忘记了一些重要的事情,因为这是我第一次使用CRC16。我也想知道是否与Python代码和在MCU上创建CRC的方式有所不同。 当我无法获得一对匹配的CRC时,我什至尝试了另一个Python模块(binascii),因为我怀疑Python模块可能存在缺陷。令我惊讶的是,两个Python模块都得到了相同的CRC16。
Python代码如下:
import crcmod
def otherTry():
myFile = open(r"C:\Users\mabr\Desktop\TEST\files\04-3001-00-0000-0001.bin","r")
s = myFile.read()
crc16_func = crcmod.mkCrcFun(poly = 0x11021, initCrc = 0x0000, xorOut = 0x0000)
print crc16_func(s)
MCU上的C ++代码稍微复杂一点,因为我一次以128个字节的块获取CRC数据。看起来像这样:
bool finished = false;
bool lastRun = false;
crc16drv crc;
const uint16_t seed = 0;
crc.init(seed);
uint16_t tempStorage;
uint16_t* dataPtr;
uint8_t size = 128;
uint16_t offset = 0;
while(!finished)
{
if(fileSize - offset<128)
{
size = fileSize-offset;
lastRun = true;
}
if (twi.transfer(&transfer) && (transfer.result == TwiMaster::kResOk))
{
uint8_t i;
dataPtr = (uint16_t*) wordHolder.data;
for(i=0;i<size/2;i++) //crc16 generation loop
{
crc.inputData(dataPtr);
dataPtr++;
}
}
if(offset < fileSize-128)
{
offset = offset+128;
}
else
{
if(lastRun)
{
finished = true;
}
}
}
uint16_t result = crc.getCrc();
最后是其中具有crc功能的.cpp文件:
uint16_t baseAddress = 0x0150;
void crc16drv::init(uint16_t seed)
{
CRC_setSeed(baseAddress, seed);
}
void crc16drv::inputData(uint16_t* dataPtr)
{
CRC_set16BitData(baseAddress, *dataPtr);
}
uint16_t crc16drv::getCrc()
{
uint16_t result = CRC_getResult(baseAddress);
return result;
}
我希望获得匹配的CRC,但是无论我以哪种方式转换输入数据或结果,我似乎都无法匹配Python脚本中的CRC。