Все очень просто (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Vinogradov Alexei 02 ноября 2004 г. 21:17
В ответ на: Кто может по подробней рассказать про алгоритм вычисления CRC в ds1820? отправлено Kovrov 02 ноября 2004 г. 19:41

Берете схему делителя из даташита. Перерисовываете ее на бумажку.
Пусть данные, подлежащие кодированию, лежат в массиве (старший бит нулевого байта самый старший, последний байт есть остаток, равный нулю при использовании процедупы в качестве кодера и собственно остатку при работе в качестве декодера) :

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