Как определить начальную контрольную сумму CRC16, чтобы итоговая контрольная сумма была равна нулю - PullRequest
1 голос
/ 23 апреля 2020

Работа на коммуникационной шине SPI между массивом микроконтроллеров SAMD.

У меня есть входящий пакет, который похож на { 0x00, 0xFF, 0x00, 0xFF }. Чип приемника выполняет проверку CRC16 входящего пакета.

Поскольку я ожидаю один и тот же пакет каждый раз, я хочу иметь нулевую контрольную сумму CR C, когда пакет действителен, и не нулевую контрольную сумму при ошибке передачи.

I знаю, что я могу добавить вычисленный CRC16 в конец пакета при отправке и на стороне получателя проверка CR C выдаст 0, но в этом случае невозможно добавить контрольную сумму CRC16 в пакет, так как пакет создается несколькими чипами отправителя на линии SPI, и каждый чип заполняет только два своих байта из всего пакета.

Мне нужно загрузить начальную контрольную сумму CR C на стороне получателя, поэтому после входящего пакет проверен, результирующий CR C равен нулю (если пакет не поврежден).

Ответ здесь на SO на самом деле то, что я ищу, но это для CRC32 формат, и я на самом деле не понимаю принцип кода, поэтому я не могу переписать, если для формата CRC16.

Любая помощь будет принята с благодарностью!

* 101 7 * С уважением, Нико

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Решение состоит в том, чтобы просто использовать справочную таблицу на основе CR C. Если вы не можете добавить контрольную сумму (также известную как Frame Check Sequence , FCS) к пакету, сначала выполните поиск в таблице, а затем просто сравните ее с ожидаемой последовательностью для ваших фиксированных данных.

Обратите внимание, что «CR C 16» может означать что угодно, существует несколько версий и (не) стандартов. Наиболее распространенным является, пожалуй, тот, который называется «CR C -16-CCITT» с 1021h poly и начальным значением FFFFh, но даже для этого есть несколько алгоритмов - некоторые верны, некоторые не работают. Ваша самая большая задача будет найти надежный алгоритм CR C.

Однако , на самом деле я думаю, что SAMD специально использует аппаратно сгенерированный CR C -16-CCITT на кристалле для целей DMA. Поскольку это SPI, он должен поддерживать DMA, так что, возможно, выясните, можете ли вы каким-то образом его использовать.

0 голосов
/ 26 апреля 2020

Я нашел решение, благодаря совету Бастиана Молкентина, который сделал этот замечательный онлайн-калькулятор CR C .

Он посоветовал попробовать расчет грубой силы всех 2 ^ 16 значений начального значения CRC16. Действительно, после нескольких строк кода и нескольких микросекунд спустя SAMD51 обнаружил начальное значение, которое соответствует нулевому значению CR C для данного буфера.

...