CRC-преобразование endianess

Я работаю с платой ARM Cortex M3, которая имеет аппаратный блок вычисления CRC. Он поддерживает 3 стандартных полиноминала CRC. Интерфейс к модулю очень прост. Мне нужно предоставить указатель на данные и длину данных. У меня проблема в том, что сначала он вычисляет LSB. и мне нужно знать сначала CRC Msb (xmodem crc16-itt). Есть ли в любом случае, чтобы взять полученный расчет и сначала преобразовать его в msb?

3 ответа

Решение

EDIT/REWRITE:

Из представленной информации, я думаю, у вас есть следующие варианты:

1) разместить данные на хосте (который, как предполагается, не так ограничен в ресурсах, как микроконтроллер), чтобы микроконтроллер не выполнял такую ​​большую работу.

2) Сделайте (байтовую) копию данных, используя возможности / инструкции, где это возможно, чтобы сделать это быстрее, а затем позвольте механизму CRC оборудования вычислить crc.

3) Не используйте аппаратный движок CRC, рассчитайте CRC с помощью программного обеспечения.

4) Проигнорируйте crc.

5) Используйте другой микроконтроллер (который может справиться с этим вариантом использования).

[...] Сначала мне нужно знать Msb CRC (xmodem crc16-itt). Есть ли в любом случае, чтобы взять полученный расчет и сначала преобразовать его в msb?

Xmodem crc16-itt работает с байтами как данными. Таким образом, самый старший байт первым или наименее значимый байт первым будут иметь значение только для представления значения CRC. Просто поменяйте местами вычисленное значение - например, с __REV16() Функция CMSIS.

Редактировать:

Я предположил, что обе стороны видят 0x01 0x02 0x03 0x04 в качестве таких. Если одна сторона видит разные байты, например 0x04 0x03 0x02 0x01 в памяти, тогда CRC потерпит неудачу. Но, возможно, вы все равно захотите исправить это раньше, чем позже, поскольку это приведет к сильной головной боли при обработке данных.

Просто поменяйте местами 2 байта вот так:

unsigned short crc_little_endian = ...; // call to your CRC function
unsigned short crc_big_endian = (crc_little_endian >> 8) | (crc_little_endian << 8);
Другие вопросы по тегам