为什么我的硬件生成的CRC16与Python中的不匹配?

时间:2019-04-29 07:55:03

标签: c++ python-2.7 crc16

我正在一个设备上的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。

0 个答案:

没有答案