User Tools

Site Tools


onewire:crc

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
onewire:crc [2012/05/15 15:35] fdconewire:crc [2013/09/18 09:08] (current) sdolt
Line 1: Line 1:
 <note>Les exemples pratiques utilisés dans cette démonstration proviennent de [[http://www.maxim-ic.com/app-notes/index.mvp/id/27|cette page]]. </note> <note>Les exemples pratiques utilisés dans cette démonstration proviennent de [[http://www.maxim-ic.com/app-notes/index.mvp/id/27|cette page]]. </note>
 +
 +<note>Sur processeur AVR, une bibliothèque existe : [[avr:crc16.h|Somme de contrôle CRC]]</note>
  
 ====== DOW CRC (Dallas One Wire CRC) ====== ====== DOW CRC (Dallas One Wire CRC) ======
 +<note warning>Le code ci-dessous ne fonctionne pas. Mélange entre chaine de caractère et chaine normale</note>
  
 ===== DOW CRC-8 ===== ===== DOW CRC-8 =====
Line 17: Line 20:
         char string[]={"A200000001B81C02"};     //chaîne utilisée pour le calcul du crc         char string[]={"A200000001B81C02"};     //chaîne utilisée pour le calcul du crc
  
-        length = strlen(string)-1;+        length = strlen(string)-1;          //la longueur de la chaîne -1 (car tableau de caractères commence à 0)
         for (i=0; i<=length; i++)           //passage dans chaque cellules de la chaine string         for (i=0; i<=length; i++)           //passage dans chaque cellules de la chaine string
         {                                {                       
-                b = string[length-i];         //nous travaillons de droite à gauche(15-i)+                b = string[length-i];         //nous travaillons de droite à gauche(length-i)
                 bit_counter = 4;        //si le caractère a déjà été décomposé en hexadécimal => 4 bits par valeur                 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                 while (bit_counter>0)   //passage dans la boucle 4 fois
Line 32: Line 35:
                 }                 }
         }         }
-        printf("%#x\n,crc);+        printf("%#x\n",crc);
 } }
  
 </file> </file>
 ==== Exemple de fonctionnement ==== ==== Exemple de fonctionnement ====
-1-Wire ROM: A2 00 00 00 01 B8 1C 02 \\ CRCPOLY8 = 0x18+1-Wire ROM: A2 00 00 00 01 B8 1C 02 \\ CRCPOLY8 = 0x18 \\ CRCinitial = 0x00
 === i=0 === === i=0 ===
 === b = string [15] <=> '2' [0000'0010] === === b = string [15] <=> '2' [0000'0010] ===
Line 407: Line 410:
 === i=2 === === i=2 ===
 === b = string [13] <=> 'C' [0000'1100] === === b = string [13] <=> 'C' [0000'1100] ===
 +
 +. \\ . \\ .
 +
 +=== i=13 ===
 +=== b = string [2] <=> '0' [0000'0000] ===
 +
 +. \\ . \\ .
 +
 +== bit_counter = 1 ==
 +
 +<code c> feedback_bit = (crc ^ b) & 0x01;</code>
 +^  crc XOR b  ^^
 +|  crc  |  0101'1101  |
 +|  b  |  0000'0000  |
 +^ Résultat |  0101'1101  |
 +
 +^  (crc XOR b) & 0x01  ^^
 +|crc XOR b  |  0101'1101  |
 +|  0x01  |  0000'0001  |
 +^  Résultat  |  0000'0001  |
 +
 +**=> feedback_bit = 0x01**
 +
 +<code c> if (feedback_bit == 0x01) crc = crc ^ CRCPOLY8; </code>
 +
 +^  crc XOR CRCPOLY8  ^^
 +|  crc  |  0101'1101  |
 +|  CRCPOLY8  |  0001'1000  |
 +^  Résultat  |  0100'0101  |
 +
 +**=> crc = 0x45**
 +
 +<code c> crc = (crc >> 1) & 0x7F; </code>
 +
 +^  crc>> ^^
 +|  crc  |  0100'0101  |
 +^  crc>> |  0010'0010  |
 +
 +^  (crc>>1) & 0x7F  ^^
 +|  crc>> |  0010'0010  |
 +|  0x7F  |  0111'1111  |
 +^ Résultat  |  0010'0010  |
 +
 +**=> crc = 0x22**
 +
 +<code c> if (feedback_bit == 0x01) crc = crc | 0x80; </code>
 +
 +^  crc OR 0x80  ^^
 +|  crc  |  0010'0010  |
 +|  0x80  |  1000'0000  |
 +^  Résultat  |  1010'0010  |
 +
 +**=> crc = 0xA2 {C'est la valeur du CRC pour [00000001B81C (Numéro de série) + 02 (Family Code)], s'il est ajouté à la suite du numéro de série, le CRC final sera de 0x00!}**
 +
 +. \\ . \\ .
 +
 +=== i=14 ===
 +=== b = string [1] <=> '2' [0000'0010] ===
  
 . \\ . \\ . . \\ . \\ .
Line 419: Line 480:
 . \\ . \\ . . \\ . \\ .
  
-**=> crc = 0x00**+**=> crc = 0x00 {Nous avons au final un 0x00, 0xA2 est bel et bien le CRC de [00000001B81C02]}**
  
 ===== DOW CRC-16 ===== ===== DOW CRC-16 =====
Line 428: Line 489:
 #include <stdio.h> #include <stdio.h>
 #include <string.h> #include <string.h>
-#define CRCPOLY16 0x4002           //correspond au masque des XOR sur le polynôme x^16+x^15+x^2+x+#define CRCPOLY16 0x4002           //correspond au masque des XOR sur le polynôme x^16+x^15+x^2+x^0
  
 void main(void) void main(void)
Line 435: Line 496:
         char string[]={"75"};     //chaîne utilisée pour le calcul du crc         char string[]={"75"};     //chaîne utilisée pour le calcul du crc
  
-        length = strlen(string)-1;+        length = strlen(string)-1;          //la longueur de la chaîne -1 (car tableau de caractères commence à 0)
         for (i=0; i<=length; i++)           //passage dans chaque cellules de la chaine string         for (i=0; i<=length; i++)           //passage dans chaque cellules de la chaine string
         {                                {                       
-                b = string[length-i];         //nous travaillons de droite à gauche(1-i)+                b = string[length-i];         //nous travaillons de droite à gauche(length-i)
                 bit_counter = 4;        //si le caractère a déjà été décomposé en hexadécimal => 4 bits par valeur                 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                 while (bit_counter>0)   //passage dans la boucle 4 fois
Line 455: Line 516:
  
 ==== Exemple de fonctionnement ==== ==== Exemple de fonctionnement ====
-1-Wire ROM: 75 \\ CRCPOLY8 = 0x4002 \\ CRCinitial = 0x90F1+1-Wire ROM: 75 \\ CRCPOLY16 = 0x4002 \\ CRCinitial = 0x90F1
 === i=0 === === i=0 ===
 === b = string [1] <=> '5' [0000'0000'0000'0101] === === b = string [1] <=> '5' [0000'0000'0000'0101] ===
onewire/crc.1337096132.txt.gz · Last modified: 2012/05/15 15:35 by fdc