CRC - это вообще-то остаток от деления. В вашей функции оно сильно неэффективно. (сдвигами). Табличная реализация значительно эффективнее.
(Есть замечательный документ "Ross N. Williams
Элементарное руководство
по CRC алгоритмам
обнаружения ошибок
Все, что Вы хотели бы знать о CRC алгоритмах, но боялись спросить,
опасаясь, что ошибки Ваших знаний могут быть обнаружены" -погуглите. )
В даташите указано, что полином аппаратного блока CRC фиксированный :
Uses CRC-32 (Ethernet) polynomial: 0x4C11DB7
– X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1
и изменить его нельзя, увы
А было бы здорово, если бы для полинома был отдельный регистр...