Алгоритм-то мы вытащили, уже у нас есть достоверные и софтовые и аппаратные реализации, но я хочу докопаться до математической сути.

Если упрощенно и в терминах обычной арифметики, то у нас есть некоторое число m - сообщение (передаваемый блок полезных данных). Есть некоторая константа делитель p. Мы берем вычисляем остаток от деления: r = m mod p. Понятно что остаток от деления: (m - r) mod p будет нулевым и на этом можно выполнять простую проверку.

CRC - это остаток полиномиального деления на полином. У нас в данном случае используется методика проверки CRC "one-pass" - это когда сама CRC принимается и загоняется в тот же поток вместе с данными, а результирующая CRC сравнивается с константой. Чтобы такая методика работала надо делить не само сообщение, а конкатенацию: i | m | c, где i представляет собой начальное значение, а c - некоторая дополняющая константа (магическое число, разрядностью такой же как и у остатка, которое получится на приемном конце после вычисления CRC для блока + принятая сумма), часто c нулевое (как и в нашем случае). Принимающая сторона уже выполняет деление i | m | (c - r) и в итоге получает в остатке константу c.

Классическое полиномиальное деление "в столбик" (методы сдвигов и табличный - суть оптимизация, нам сейчас надо понять первичный алгоритм):

Код:
unsigned short int crc16_m2(unsigned short crc, unsigned char data)
{
  int i;
  for(i=0; i<8; i++)
  {
    if (crc & 0x8000)
    {
      crc <<= 1;
      crc |= (data >> 7) & 1;
      crc ^= 0x1021;
    }
    else
    {
      crc <<= 1;
      crc |= (data >> 7) & 1;
    }
    data <<= 1;
  }
  return crc;
}
Вот я и хочу привести процедуру к использованию этой канонической функции. В Вашем коде делится сообщение уже сдвинутое на 16 разрядов влево, то есть имеет место добавление той самой константы c состоящей из 16 нулевых битов. В-общем, тут загвоздка похоже просто чтоi достаточно хитрое и не является простым префиксом из 0xFFFF, поэтому у меня не получается аналогичный результат. А так - да, ясно что вдвигание данных по факту в 17-бит - это и есть учет последних нулевых бит, которые отдельно в конце у нас не вдвигаются.