А мне другое интересно, эти аппаратные crc считают любой полином? Если нет, то аппаратный crc на фиг не нужен...
Подсчет crc - стандартная задача для контроллера, на все стандартные задачи не напасешься аппаратных перделок.
Вот для crc8 шустрый способ, полином как у 1-wire dallas (кажись):
На сцы:
- Код: Выделить всё • Развернуть
//******************************
void CalcCrc8 (unsigned char x)
{
CrcCalc ^= x;
x = 0;
if (CrcCalc & 0x01) x ^= 0x5e;
if (CrcCalc & 0x02) x ^= 0xbc;
if (CrcCalc & 0x04) x ^= 0x61;
if (CrcCalc & 0x08) x ^= 0xc2;
if (CrcCalc & 0x10) x ^= 0x9d;
if (CrcCalc & 0x20) x ^= 0x23;
if (CrcCalc & 0x40) x ^= 0x46;
if (CrcCalc & 0x80) x ^= 0x8c;
CrcCalc = x;
}
//******************************
На асм avr:
- Код: Выделить всё • Развернуть
CalcCrc8_temp1:
eor CrcCalc,temp1
clr temp1
ldi temp3,0x5e
sbrc CrcCalc,0
eor temp1,temp3
ldi temp3,0xbc
sbrc CrcCalc,1
eor temp1,temp3
ldi temp3,0x61
sbrc CrcCalc,2
eor temp1,temp3
ldi temp3,0xc2
sbrc CrcCalc,3
eor temp1,temp3
ldi temp3,0x9d
sbrc CrcCalc,4
eor temp1,temp3
ldi temp3,0x23
sbrc CrcCalc,5
eor temp1,temp3
ldi temp3,0x46
sbrc CrcCalc,6
eor temp1,temp3
ldi temp3,0x8c
sbrc CrcCalc,7
eor temp1,temp3
mov CrcCalc,temp1
ret
На асм pic:
- Код: Выделить всё • Развернуть
CalcCrc8_w
xorwf CrcCalc,f
movlw 0
btfsc CrcCalc,0
xorlw 0x5e
btfsc CrcCalc,1
xorlw 0xbc
btfsc CrcCalc,2
xorlw 0x61
btfsc CrcCalc,3
xorlw 0xc2
btfsc CrcCalc,4
xorlw 0x9d
btfsc CrcCalc,5
xorlw 0x23
btfsc CrcCalc,6
xorlw 0x46
btfsc CrcCalc,7
xorlw 0x8c
movwf CrcCalc
return
Ой, опять на pic код красивше avr
Считаем так для асм:
- Код: Выделить всё • Развернуть
clrf CrcCalc ;сбросить регистр crc
movf Buf1,w
call CalcCrc8_w
movf Buf1+1,w
call CalcCrc8_w
movf Buf1+2,w
call CalcCrc8_w
movf CrcCalc,w
xorwf Buf1+3,w
btfss STATUS,Z ;ошибка crc
goto a0_0 ;
;crc верен
Для сцы:
- Код: Выделить всё • Развернуть
CrcCalc = 0; //пересчитать CRC
CalcCrc8(RxBuffer[2]);
CalcCrc8(RxBuffer[3]);
CalcCrc8(RxBuffer[4]);
CalcCrc8(RxBuffer[5]);
CalcCrc8(RxBuffer[6]);
CalcCrc8(RxBuffer[7]);
CalcCrc8(RxBuffer[8]);
CalcCrc8(RxBuffer[9]);
CalcCrc8(RxBuffer[10]);
CalcCrc8(RxBuffer[11]);
CalcCrc8(RxBuffer[12]);
Таблица весов получается так:
- Код: Выделить всё • Развернуть
Возмите степени двойки: 1,2,4... и прогоните через пример от производителя -> получите таблицу весов разрядов.
;1=0x31
;2=0x62
;4=0xC4
;8=0xB9
;16=0x43
;32=0x86
;64=0x3D
;128=0x7A
По поиску в гугле "Возмите степени двойки: 1,2,4... и прогоните через пример", найдете источник...
и.т.д. и.т.п.