CRC (volt: TITKOSITAS - uC)
Palasik Sandor
palasik at mail.datanet.hu
Fri Oct 22 12:06:48 CEST 2004
> void rotate_crc(int new_byte)
> {
> int crc_temp;
> int i;
> for (i=8; i; i--)
> {
> crc_temp=crc; //crc_temp 0. bit = crc 0. bit
> crc_temp^=new_byte; //crc_temp 0. bit XOR= new_byte 0. bit
> #asm
> rrf new_byte,F //rotate bejovo_adat
> #endasm
> if (bit_test(crc_temp,0)) //ha a visszacsatolando bit = 1
> {
> crc^=0x55; //a megforgatando bitek pl. 01010101
> }
> else //ha a visszacsatolando bit = 0
> {
> crc^=0xAA; //a megforgatando bitek pl. 10101010
> }
> #asm
> bcf status,0 //carry = crc_temp.0
> btfsc crc_temp,0
> bsf status,0
> rrf crc,F //rotate crc
> #endasm
> }
> }
Elismerem, hogy ez egy nagyon ravasz bitcsavaró program. Amit viszont én
tudok a CRC-ről: csak akkor kell XOR művelet, ha az MSB és a bejövő bit
különbözik, úgyhogy szerintem ez nem CRC.
Csináltam egy példaprogramot, abból, amit küldtél. Ciklus hossz alatt én azt
értem, hogy ha csupa nulla a bemenő adat, akkor hány bájtonként ismétlődik a
CRC értéke.
Az általad megadott 0x55 és 0xAA értékekkel ez vagy 2 vagy 8 byte. Ellenben
ha pl. a visszacsatolás értéke 0x1C, akkor ez a ciklushossz 254 byte,
kivéve, ha a CRC kezdőértéke 0. Én erről a visszacsatolás-függésről
beszéltem. Nagyon nem mindegy, hogy milyen CRC polinomot használsz.
Palasik Sándor
#include <stdio.h>
#include <stdlib.h>
int bit_test(int a,int b)
{
return (a>>b)&1;
}
int crc,XOR1,XOR0;
void rotate_crc(int new_byte)
{
int crc_temp;
int i;
for (i=8; i; i--)
{
crc_temp=crc; //crc_temp 0. bit = crc 0. bit
crc_temp^=new_byte; //crc_temp 0. bit XOR= new_byte 0. bit
new_byte >>= 1; // mivel a kicsorgo bitekre nem lesz szukseg,
// nem kuzdok a rotalassal
if (bit_test(crc_temp,0)) //ha a visszacsatolando bit = 1
{
crc^=XOR1; //a megforgatando bitek pl. 01010101
}
else //ha a visszacsatolando bit = 0
{
crc^=XOR0; //a megforgatando bitek pl. 10101010
}
/* #asm
bcf status,0 //carry = crc_temp.0
btfsc crc_temp,0
bsf status,0
rrf crc,F //rotate crc
#endasm */
crc = ((crc >> 1) & 0x7f) | ((crc_temp << 7) & 0x80);
}
}
int main()
{
int i,j,k;
for (k=0; k<2; k++) {
if (k == 0) {
XOR1=0x55;
XOR0=0xAA;
}
else {
XOR1 = 0x1C;
XOR0 = 0;
}
printf("=============================\n"
"XOR1: %02X, XOR0: %02X\n",XOR1,XOR0);
for (i=0; i<256; i++) {
crc = i;
for (j=0; j<256; j++) {
rotate_crc(0);
if (crc == i)
break;
}
printf("CRC: %02X, ciklus: %d\n",i,j);
}
}
return 0;
}
More information about the Elektro
mailing list