User Tools

Site Tools


onewire:crc

This is an old revision of the document!


Les exemples pratiques utilisés dans cette démonstration proviennent de cette page.

DOW CRC (Dallas One Wire CRC)

DOW CRC-8

Fonction

#include <stdio.h>
#define CRCPOLY8 0x18           //correspond au masque des XOR sur le polynôme x⁸+x⁵+x⁴+x⁰
 
int main(void)
{
        int crc = 0x00 , i = 0, bit_counter = 0, b = 0, feedback_bit = 0;       //déclaration + initialisation des variables
        char string[]={"A200000001B81C02"};     //chaîne utilisée pour le calcul du crc
 
        for (i=0; i<=15; i++)           //passage dans chaque cellules de la chaine string
        {                       
                b = string[15-i];         //nous travaillons de droite à gauche(15-i)
                bit_counter = 4;        //si le caractère a déjà été décomposé en hexadécimal => 4 bits par valeur
                while (bit_counter>0)   //passage dans la boucle 4 fois
                {                               
                        feedback_bit = (crc ^ b) & 0x01;                //vérification de la valeur du dernier bit
                        if (feedback_bit == 0x01) crc = crc ^ CRCPOLY8;    //si le dernier bit est un 1, XOR entre le CRC et le polynôme
                        crc = (crc >> 1) & 0x7F;                        //déplacement de crc de 1 sur la droite + vérification que le bit rajouter (celui de gauche) est bien un 0
                        if (feedback_bit == 0x01) crc = crc | 0x80;      //implantation du 1 du feedback_bit (1 au dernier bit) dans le crc en tant que premier bit
                        b = b>>1;         //déplacement de b de 1 sur la droite (car le dernier bit a déjà été utilisé)
                        bit_counter--;
                }
        }
        printf("0x%i%i\n",crc/16,crc%16);
        return crc;
}

Exemple de fonctionnement

1-Wire ROM: A2 00 00 00 01 B8 1C 02
CRCPOLY8 = 0x18

i=0

b = string [15] <=> '2' [0000'0010]

bit_counter = 4
 feedback_bit = (crc ^ b) & 0x01;
crc XOR b
crc 0000'0000
b 0000'0010
Résultat 0000'0010
(crc XOR b) & 0x01
crc XOR b 0000'0010
0x01 0000'0001
Résultat 0000'0000

⇒ feedback_bit = 0x00

 crc = (crc >> 1) & 0x7F; 
crc»1
crc 0000'0000
crc»1 0000'0000
(crc»1) & 0x7F
crc»1 0000'0000
0x7F 0111'1111
Résultat 0000'0000

⇒ crc = 0x00

 b = b>>1; 
b»1
b 0000'0010
b»1 0000'0001

⇒ b = 0x01

bit_counter = 3
 feedback_bit = (crc ^ b) & 0x01;
crc XOR b
crc 0000'0000
b 0000'0001
Résultat 0000'0001
(crc XOR b) & 0x01
crc XOR b 0000'0001
0x01 0000'0001
Résultat 0000'0001

⇒ feedback_bit = 0x01

 if (feedback_bit == 0x01) crc = crc ^ CRCPOLY8; 
crc XOR CRCPOLY8
crc 0000'0000
CRCPOLY8 0001'1000
Résultat 0001'1000

⇒ crc = 0x18

 crc = (crc >> 1) & 0x7F; 
crc»1
crc 0001'1000
crc»1 0000'1100
(crc»1) & 0x7F
crc»1 0000'1100
0x7F 0111'1111
Résultat 0000'1100

⇒ crc = 0x0C

 if (feedback_bit == 0x01) crc = crc | 0x80; 
crc OR 0x80
crc 0000'1100
0x80 1000'0000
Résultat 1000'1100

⇒ crc = 0x8C

 b = b>>1; 
b»1
b 0000'0001
b»1 0000'0000

⇒ b = 0x00

bit_counter = 2
 feedback_bit = (crc ^ b) & 0x01;
crc XOR b
crc 1000'1100
b 0000'0000
Résultat 1000'1100
(crc XOR b) & 0x01
crc XOR b 1000'1110
0x01 0000'0001
Résultat 0000'0000

⇒ feedback_bit = 0x00

 crc = (crc >> 1) & 0x7F; 
crc»1
crc 1000'1100
crc»1 0100'0110
(crc»1) & 0x7F
crc»1 0100'0110
0x7F 0111'1111
Résultat 0100'0110

⇒ crc = 0x46

 b = b>>1; 
b»1
b 0000'0000
b»1 0000'0000

⇒ b = 0x00

bit_counter = 1
 feedback_bit = (crc ^ b) & 0x01;
crc XOR b
crc 0100'0110
b 0000'0000
Résultat 0100'0110
(crc XOR b) & 0x01
crc XOR b 0100'0110
0x01 0000'0001
Résultat 0000'0000

⇒ feedback_bit = 0x00

 crc = (crc >> 1) & 0x7F; 
crc»1
crc 0100'0110
crc»1 0010'0011
(crc»1) & 0x7F
crc»1 0010'0011
0x7F 0111'1111
Résultat 0010'0011

⇒ crc = 0x23

 b = b>>1; 
b»1
b 0000'0000
b»1 0000'0000

⇒ b = 0x00

i=1

b = string [14] <=> '0' [0000'0000]

bit_counter = 4
 feedback_bit = (crc ^ b) & 0x01;
crc XOR b
crc 0010'0011
b 0000'0000
Résultat 0010'0011
(crc XOR b) & 0x01
crc XOR b 0010'0011
0x01 0000'0001
Résultat 0000'0001

⇒ feedback_bit = 0x01

 if (feedback_bit == 0x01) crc = crc ^ CRCPOLY8; 
crc XOR CRCPOLY8
crc 0010'0011
CRCPOLY8 0001'1000
Résultat 0011'1011

⇒ crc = 0x3B

 crc = (crc >> 1) & 0x7F; 
crc»1
crc 0011'1011
crc»1 0001'1101
(crc»1) & 0x7F
crc»1 0001'1101
0x7F 0111'1111
Résultat 0001'1101

⇒ crc = 0x1D

 if (feedback_bit == 0x01) crc = crc | 0x80; 
crc OR 0x80
crc 0001'1101
0x80 1000'0000
Résultat 1001'1101

⇒ crc = 0x9D

 b = b>>1; 
b»1
b 0000'0000
b»1 0000'0000

⇒ b = 0x00

bit_counter = 3
 feedback_bit = (crc ^ b) & 0x01;
crc XOR b
crc 1001'1101
b 0000'0000
Résultat 1001'1101
(crc XOR b) & 0x01
crc XOR b 1001'1101
0x01 0000'0001
Résultat 0000'0001

⇒ feedback_bit = 0x01

 if (feedback_bit == 0x01) crc = crc ^ CRCPOLY8; 
crc XOR CRCPOLY8
crc 1001'1101
CRCPOLY8 0001'1000
Résultat 1000'0101

⇒ crc = 0x85

 crc = (crc >> 1) & 0x7F; 
crc»1
crc 1000'0101
crc»1 0100'0010
(crc»1) & 0x7F
crc»1 0100'0010
0x7F 0111'1111
Résultat 0100'0010

⇒ crc = 0x42

 if (feedback_bit == 0x01) crc = crc | 0x80; 
crc OR 0x80
crc 0100'0010
0x80 1000'0000
Résultat 1100'0010

⇒ crc = 0xC2

 b = b>>1; 
b»1
b 0000'0000
b»1 0000'0000

⇒ b = 0x00

bit_counter = 2
 feedback_bit = (crc ^ b) & 0x01;
crc XOR b
crc 1100'0010
b 0000'0000
Résultat 1100'0010
(crc XOR b) & 0x01
crc XOR b 1100'0010
0x01 0000'0001
Résultat 0000'0000

⇒ feedback_bit = 0x00

 crc = (crc >> 1) & 0x7F; 
crc»1
crc 1100'0010
crc»1 0110'0001
(crc»1) & 0x7F
crc»1 0110'0001
0x7F 0111'1111
Résultat 0110'0001

⇒ crc = 0x61

 b = b>>1; 
b»1
b 0000'0000
b»1 0000'0000

⇒ b = 0x00

bit_counter = 1
 feedback_bit = (crc ^ b) & 0x01;
crc XOR b
crc 0110'0001
b 0000'0000
Résultat 0110'0001
(crc XOR b) & 0x01
crc XOR b 0110'0001
0x01 0000'0001
Résultat 0000'0001

⇒ feedback_bit = 0x01

 if (feedback_bit == 0x01) crc = crc ^ CRCPOLY8; 
crc XOR CRCPOLY8
crc 0110'0001
CRCPOLY8 0001'1000
Résultat 0111'1001

⇒ crc = 0x79

 crc = (crc >> 1) & 0x7F; 
crc»1
crc 0111'1001
crc»1 0011'1100
(crc»1) & 0x7F
crc»1 0011'1100
0x7F 0111'1111
Résultat 0011'1100

⇒ crc = 0x3C

 if (feedback_bit == 0x01) crc = crc | 0x80; 
crc OR 0x80
crc 0011'1100
0x80 1000'0000
Résultat 1011'1100

⇒ crc = 0xBC

 b = b>>1; 
b»1
b 0000'0000
b»1 0000'0000

⇒ b = 0x00

i=2

b = string [13] <=> 'C' [0000'1100]

.
.
.

i=15

b = string [0] <=> 'A' [0000'1010]

.
.
.

bit_counter = 1

.
.
.

⇒ crc = 0x00

onewire/crc.1337087229.txt.gz · Last modified: 2012/05/15 13:07 by fdc