CAN-2,0 документе говорится, как именно это сделать:
CRC_RG = 0 //initialize shift register
REPEAT
CRCNXT = NXTBIT EXOR CRC_RG(14)
CRC_RG(14:1) = CRC_RG(13:0) //shift left by...
CRC_RG(0) = 0 //...one position
IF CRCNXT THEN
CRC_RG(14:0) = CRC_RG(14:0) EXOR (4599 hex)
ENDIF
UNTIL (CRC SEQUENCE starts or there is an ERROR condition)
Обратите внимание, что 4599 в шестнадцатеричном является многочленом, т.е. биты 14, 10, 8, 7, 4, 3 и 0 установлены , (Позиция 15 бит - это то, что снято после смены.)
Вы можете найти пример here, чтобы убедиться, что вы делаете это правильно. Этот CRC применяется к строке ASCII цифр (девять байтов) 123456789
: 0x059e
.
Не могли бы вы показать мне практический пример, чтобы я мог его вычислить вручную? –