Почему мой сгенерированный аппаратный CRC16 не совпадает с тем из Python? - PullRequest
0 голосов
/ 29 апреля 2019

Я работаю над микроконтроллером MSP430FR5869 на устройстве, которое загружает обновления программного обеспечения и проверяет, совпадает ли CRC с созданным на сервере, который использует скрипт python.Я хочу использовать аппаратно сгенерированный CRC16 MSP430, но не могу получить тот, который соответствует CRC16, который я получаю из своего скрипта Python 2.7.

В руководстве пользователя MCU говорится, что CRC16 может бытьсделано с полиномом:

f(x) = x^16 + x^12 + x^5 + 1

Далее поясняется, что сначала я должен отправить seed для инициализации регистра результата, поместить в данные два байта за раз (так как онимеет 2 байта, выделенных для ввода данных) и, наконец, запустить функцию результата.Я обычно использовал функции из стандартной библиотеки, предоставленной производителями MCU (TI).В отчаянии я перепробовал все комбинации функций, чтобы увидеть, получаю ли я совпадающее число (реверсирование ввода, реверсирование результата, добавление с 0, не добавление с 0), но безуспешно.Мне интересно, забыл ли я что-то важное, так как я впервые работаю с CRC16.Мне также интересно, отличается ли что-то от кода Python от способа создания CRC на MCU.Я даже попробовал другой модуль Python (binascii), когда мне не удалось получить подходящую пару CRC, потому что я подозревал, что модуль Python мог быть ошибочным.К моему удивлению, я получил один и тот же CRC16 с обоими модулями Python.

Код 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)

Код C ++ на MCU немного сложнее, так как яполучить данные для CRC кусками по 128 байт за раз.Это выглядит так:

      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();

И, наконец, файл .cpp с функциями crc в нем:

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, но независимо от того, каким образом явключить входные данные или результат, я не могу соответствовать CRC из сценария Python.

...