цифровая электроника
вычислительная техника
встраиваемые системы

 


Вычисление CRC-16

Автор: Mike(admin) от 22-06-2014, 16:05

Представленный код позволяет реализовать основанный на полиномиальной арифметике алгоритм расчёта контрольной суммы CRC16.


Для выполнения функции алгоритма нужно сначала присвоить константе POLYNOM одно из перечисленных до этого значений CRC16.



/***** crc16.h *****/
//Протестировано
#define CRC16_DNP       0x3D65          // DNP, IEC 870, M-BUS, wM-BUS, ...
#define CRC16_CCITT     0x1021          // X.25, V.41, HDLC FCS, Bluetooth, ...

//Другие полиномы, не протестированы
#define CRC16_IBM       0x8005          // ModBus, USB, Bisync, CRC-16, CRC-16-ANSI, ...
#define CRC16_T10_DIF   0x8BB7          // SCSI DIF
#define CRC16_DECT      0x0589          // Радиотелефоны
#define CRC16_ARINC     0xA02B          // приложения ACARS


#define POLYNOM         CRC16_XXX   // Подставить полином из списка выше

// Расчет нового crc16 с переменной newByte. Переменная crcValue текущее или начальное значение (0).
unsigned int crc16(unsigned int crcValue, unsigned char newByte);

/***** crc16.c *****/

#include "crc16.h"

unsigned int crc16(unsigned int crcValue, unsigned char newByte)
{
        unsigned char i;

        for (i = 0; i < 8; i++) {

                if (((crcValue & 0x8000) >> 8) ^ (newByte & 0x80)){
                        crcValue = (crcValue << 1)  ^ POLYNOM;
                }else{
                        crcValue = (crcValue << 1);
                }

                newByte <<= 1;
        }
 
        return crcValue;
}


/***** ПРИМЕР *****/

unsigned int exampleOfUseCRC16 (unsigned char *Data, usigned char len){

        unsigned int crc;
        unsigned char aux = 0;

        crc = 0x0000; //Инициализация crc в 0x0000 для DNP
        //crc = 0xFFFF; // Инициализация crc в 0xFFFF для CCITT


        while (aux < len){
                crc = crc16(crc,Data[aux]);
                aux++;
        }

        return (~crc); //Значение crc для DNP получается благодаря инверсии

        //return crc; // Значение crc для CCITT
}



Перевод © digitrode.ru


<Источник>




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий