[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Тот же вопрос для CRC-8. При пакете более 256 байт программы в девайсе и на Си дают разный результат. Подумал что есть ограничения на размер пакета для соответствующего CRC? Вообще когда надо переходить на CRC-32? Может быть уважаемый All поделится своими изысканиями на тему.
Хотя, Скорее всего у меня ошибка в Сишной программе. Не могу понять где. Что-нибудь с типами переменных?
В этом примере симулируется духбайтовое слово данных простым инкрементом.
Когда данных до 256 все впорядке...
/* CRC.C
*/
unsigned char f,g;
char Nr,nnL,nnH;
short crc, temp, DOS_POLY=0xA001u;
unsigned short h;
int i,nn,k,p0,p1,p2,p3;
main() { SSS bank $10
E-mail:
info@telesys.ru
nn=1398;
crc=0;
for (i=0; i
crc ^= nnL;
for( k = 8; k--;) { temp = -(crc<0),
crc <<= 1,
crc ^= DOS_POLY & temp;
}
crc ^= nnH;
for( k = 8; k--;) { temp = -(crc<0),
crc <<= 1,
crc ^= DOS_POLY & temp;
}
}
h = crc; f = h%256; /*low*/
g = h/256; /*high*/
p0 = f%16; /*0*/
p1 = f/16; /*1*/
p2 = g%16; /*2*/
p3 = g/16; /*3*/
printf("%2d, %2d, %2d, %2d, \n\n",p3,p2,p1,p0);
}
;CRC for Scenix
clr rAhH ;clr CRC
clr rAhL
clr rNnc3 ;clr DATA
clr rNnc4
mov W,#$BB ;1398/2=699 (2BBh)
mov rNnc1,W ;Low byte counter for transmit
mov W,#$03
mov rNnc2,W ;High byte counter for transmit
CrSS NOP ;send DATA to NIC
mov W,rNnc3 ; DATA byte (Low)
page $0600
call CrcBay
inc rNnc3
snb STATUS.2
inc rNnc4 ; DATA byte (High)
mov W,rNnc4
call CrcBay
decsz rNnc1 ;Low byte counter for transmit
jmp CrSS
decsz rNnc2 ;High byte counter for transmit
jmp CrSS
ret ;CRC in rAhL rAhH
;
CrcBay bank $10
xor rAhL,W ;=1
mov W,#$08
mov rCrcT,W ;loop 8 times (1 byte)
CrB2 clrb STATUS.0
rl rAhL
rl rAhH
sb STATUS.0
jmp CrB1
mov W,#$01 ;CRC^A001
xor rAhL,W
mov W,#$A0
xor rAhH,W
CrB1 decsz rCrcT
jmp CrB2
ret
Ответы