|
Берете схему делителя из даташита. Перерисовываете ее на бумажку.
Пусть данные, подлежащие кодированию, лежат в массиве (старший бит нулевого байта самый старший, последний байт есть остаток, равный нулю при использовании процедупы в качестве кодера и собственно остатку при работе в качестве декодера) :
unsigned char code_bufer[]={0x00,0x00,0x00,0x00,0x00,0x00};
Обозначаете выходы элементов искл. или и выход делителя как a, b, c, d, e:
bit a; //Выходы
bit b; //элементов
bit c; //"исключающее ИЛИ"
bit d; //схемы
bit e; //деления на полином X^8+X^4+X^3+X^2+1
Далее все очень просто. На схему делителя подаются кодируемые биты (старшими разрядами вперед, т.е. с нулевого байта):
//Функция вычисляет CRC
unsigned char crc_counter (unsigned char *start_addr)
{
unsigned char i, j; //Вспомогательные переменные
unsigned char remainder; //Здесь накапливается остаток от деления
remainder=0; //Сначала остаток равен нулю
for (i=0;i<=5;i++){
for (j=0;j<=7;j++){
e=(remainder & 0x80) ? 1:0;
d=((remainder & 0x08) ? 1:0)^e;
c=((remainder & 0x04) ? 1:0)^e;
b=((remainder & 0x02) ? 1:0)^e;
a=((*(start_addr+i) & (0x80>>j)) ? 1:0)^e;
//собственно вычисление остатка
if ((remainder & 0x40) !=0) {remainder=remainder | 0x80;} else {remainder=remainder & 0x7f;}
if ((remainder & 0x20) !=0) {remainder=remainder | 0x40;} else {remainder=remainder & 0xbf;}
if ((remainder & 0x10) !=0) {remainder=remainder | 0x20;} else {remainder=remainder & 0xdf;}
if (d!=0) {remainder=remainder | 0x10;} else {remainder=remainder & 0xef;}
if (c!=0) {remainder=remainder | 0x08;} else {remainder=remainder & 0xf7;}
if (b!=0) {remainder=remainder | 0x04;} else {remainder=remainder & 0xfb;}
if ((remainder & 0x01) !=0) {remainder=remainder | 0x02;} else {remainder=remainder & 0xfd;}
if (a!=0) {remainder=remainder | 0x01;} else {remainder=remainder & 0xfe;}
}
}
return remainder;
}
Т.е. дам пояснение. Приведенная функция может как формировать остаток, так и проверять корректность CRC. Вункции передается указатель на нулевой элемент кодируемого (проверяемого) массива.
При работе процедуры в качестве кодера байт остатка равен нулю (вы домножили исходную комбинацию на x^8), и функция, отработав, возвращает остаток, который записывается в последний байт комбинации. Все, комбинация закодирована. Для проверки на корректность некоторой комбинации ее подают на вход функции вместе с остатком. Корректная комбинация делится без остатка на образующий полином, т.е. функция вернет remainder=0. Если в комбинации есть ошибки, остаток будет отличным от нуля.
Во написал, целая повесть. Удачи ...
E-mail: info@telesys.ru