#include <util/crc16.h>
Этот header файл предоставляет оптимизированные подставляемые функции для вычисления циклического контроля избыточности (CRC), используя общие полиномы.
Ссылки:
См. Dallas Semiconductor приложение 27 для 8051, пример на ассемблере, и основные предложения по оптимизации CRC. Таблица на последней странице приложения - ключ к пониманию.
"Джек Креншоу - осуществление контроля с помощью CRC - статья Внедренные Системы Программирования за январь 1992 года. Её возможно трудно найти, но в ней CRC объяснён очень ясно и кратко. Стоит усилий найти её.
Типовое приложение может быть таким:
// Dallas iButton тестирующий вектор.
uint8_t serno[] = { 0x02, 0x1c, 0xb8, 0x01, 0, 0, 0, 0xa2 }; // Глобальный массив из байтов серийного номера
int kcrc(void) // Функция CRC
{
uint8_t crc = 0, i; // Локальные переменные – crc и i
for (i = 0; i < sizeof serno / sizeof serno[0]; i++) // Цикл (7 раз) sizeof serno / sizeof serno[0] = 8 / 1 = 8
crc = _crc_ibutton_update(crc, serno[i]); // Использование функции _crc_ibutton_update
return crc; // должен быть 0
}
|
|
Функции |
|
static __inline__ uint16_t |
_crc16_update (uint16_t
__crc, uint8_t
__data) |
static __inline__ uint16_t |
_crc_xmodem_update (uint16_t
__crc, uint8_t
__data) |
static __inline__ uint16_t |
_crc_ccitt_update (uint16_t
__crc, uint8_t
__data) |
static __inline__ uint8_t |
_crc_ibutton_update (uint8_t
__crc, uint8_t
__data) |
Оптимизированное CRC-16 вычисление.
Полином:
x^16 + x^15 + x^2 + 1 (0xa001)
Начальное
значение: 0xffff
Этот CRC обычно используется в контроллерах дисковода.
Исходный код функции, написан на C:
Оптимизированное CRC-CCITT вычисление.
Полином:
x^16 + x^12 + x^5 + 1 (0x8408)
Начальное
значение: 0xffff
Этот CRC используется PPP и IrDA.
См. RFC1171 (PPP протокол) и IrDA IrLAP 1.1
Примечание:
Хотя полином CCITT такой же, как используемый в протоколе Xmodem, они весьма различны. Различие находится в том, как биты сдвинуты через алгоритм. Xmodem сдвигает MSB из CRC и сначала ввод, а CCITT сдвигает LSB из CRC и сначала ввод.
Исходный код функции, написан на C:
Оптимизированное Dallas (теперь Maxim) iButton 8-и битное CRC вычисление.
Полином:
x^8 + x^5 + x^4 + 1 (0x8C)
Начальное
значение: 0x0
См. http://www.maxim-ic.com/appnotes.cfm/appnote_number/27
Исходный код функции, написан на C:
uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data)
{
uint8_t i;
crc = crc ^ data;
for (i = 0; i < 8; i++)
{
if (crc & 0x01)
crc = (crc >> 1) ^ 0x8C;
else
crc >>= 1;
}
return crc;
}
Оптимизированное CRC-XMODEM вычисление.
Полином:
x^16 + x^12 + x^5 + 1 (0x1021)
Начальное
значение: 0x0