[an error occurred while processing this directive]
Вопросы по коду вычисления CRC-16
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

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

Отправлено dmyl 26 сентября 2006 г. 11:20

Вот код который дал SM

typedef unsigned char UCHAR;
typedef unsigned int WORD;
WORD CRC( UCHAR byte, WORD crc)
{
register UCHAR carry, s0_7, s8_15;

carry = (crc >> 8) ^ byte;
carry = carry ^ (carry >> 4);
s8_15 = crc ^ (carry << 4) ^ (carry >> 3);
s0_7 = carry ^ (carry << 5);
return (s8_15 << 8) ^ (s0_7 & 0xff);
}

Не понятно как инициализировать алгоритм значением 0xFFFF
Если предварительно делать CRC=0xFFFF, не получается.
Вот решение в лоб для одного байта 0x0, инициализация 0xFFFF, полином 0x1021

1111111111111111000000000000000000000000
10001000000100001 .
----------------- .
11101111110111110 .
10001000000100001 .
----------------- .
11001111100111110 .
10001000000100001 .
----------------- .
10001111000111110 .
10001000000100001 .
----------------- .
00001110000111110 .
00000000000000000 .
----------------- .
00011100001111100 .
00000000000000000 .
----------------- .
00111000011111000 .
00000000000000000 .
----------------- .
01110000111110000 .
00000000000000000 .
----------------- .
11100001111100000 .
10001000000100001 .
----------------- .
11010011110000010 .
10001000000100001 .
----------------- .
10110111101000110 .
10001000000100001 .
----------------- .
01111111011001110 .
00000000000000000 .
----------------- .
11111110110011100 .
10001000000100001 .
----------------- .
11101101101111010 .
10001000000100001 .
----------------- .
11001011010110110 .
10001000000100001 .
----------------- .
10000110100101110 .
10001000000100001 .
----------------- .
00011101000011110 .
00000000000000000 .
----------------- .
00111010000111100 .
00000000000000000 .
----------------- .
01110100001111000 .
00000000000000000 .
----------------- .
11101000011110000 .
10001000000100001 .
----------------- .
11000000110100010 .
10001000000100001 .
----------------- .
10010001100000110 .
10001000000100001 .
----------------- .
00110011001001110.
00000000000000000.
-----------------.
0110011001001110. CRC=664E

По коду инициализируем CRC=0xFFFF
carry=0xF0
s8_15=0xE1
S0_7=0xF0
CRC=0xE1F0

Кроме того из записи в столбик хоть убей непонятно что с чем перексорить надо. При записи в столбик на каком сдвиге кросится с полиномом зависит от конкретных данных, может всетаки поясните как вычислить CRC не двигая по одному биту а за несколько сдвигов как в программе.

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 
URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание