User Tools

Site Tools


avr:crc16.h

Differences

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

Link to this comparison view

Next revision
Previous revision
avr:crc16.h [2013/09/18 08:23] – created sdoltavr:crc16.h [2013/09/18 09:10] (current) sdolt
Line 5: Line 5:
 ===== Utilisation sur microprocesseur AVR ===== ===== Utilisation sur microprocesseur AVR =====
  
-La bibliothèque standard avr-libc possède des fonctions permettant de calculer rapidement certain type de CRC grâce au fichier d'en-tête crc16.h.+La bibliothèque standard avr-libc possède des fonctions permettant de calculer rapidement certain type de CRC grâce au fichier d'en-tête crc16.h. Ces fonctions sont codées en assembleur pour augmenter leur vitesse d'exécution. 
 <code c> <code c>
 #include <util/crc16.h> #include <util/crc16.h>
 </code> </code>
  
 +Documentation : [[http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html]]
 +
 +==== CRC pour OneWire ====
 +
 +Le protocole OneWire utilise deux types de CRC, un sur 8 bits et l'autre sur 16 bits. Les deux types utilises une valeur initiale de 0.
 +
 +=== DOW CRC8 ===
 +Le CRC 8 bits est utilisés pour la lecture de la mémoire ROM. C'est mémoire de 8 octets contients 1 octets avec la famille du composant utilisé, 6 octets contenant un numéro de série unique et enfin un octets contenants le CRC des 7 octets précédents.
 +
 +^Famille^ID^CRC^
 +|1 octet|6 octets| 1 octet|
 +
 +Pour ce cas, on peut utilisé la fonction _crc_ibutton_update dans le prototype est :
 +<code c>
 +static __inline__ uint8_t _crc_ibutton_update (uint8_t __crc, uint8_t __data);
 +</code>
 +=== DOW CRC16 ===
 +Le CRC 16 bits est utilisés pour la lecture et l'écriture de la mémoire RAM. 
 +
 +Pour ce cas, on peut utilisé la fonction _crc16_update dans le prototype est :
 +<code c>
 +static __inline__ uint16_t _crc16_update (uint16_t __crc, uint8_t __data);
 +</code>
 +
 +=== Exemple d'utilisation ===
 +Les exemples ci-dessous sont tirés de la documentation d'avr-libc
 +== Calcul du CRC ==
 +<code c>
 +    // Contenu des 7 premiers octets de la mémoire ROM, donc sans l'octet CRC
 +    uint8_t serno[] = { 0x02, 0x1c, 0xb8, 0x01, 0, 0, 0 };
 +
 +    uint8_t make_crc8(void)
 +    {
 +        uint8_t crc = 0
 +        uint8_t i;
 +
 +        for (i = 0; i < sizeof serno / sizeof serno[0]; i++)
 +            crc = _crc_ibutton_update(crc, serno[i]);
 +
 +        return crc; // Return 0xa2
 +    }
 +</code>
 +== Vérification du CRC ==
 +<code c>
 +    // Contenu des 8 octets de la mémoire ROM, donc avec l'octet CRC
 +    uint8_t serno[] = { 0x02, 0x1c, 0xb8, 0x01, 0, 0, 0, 0xa2 };
 +
 +    uint8_t check_crc8(void)
 +    {
 +        uint8_t crc = 0
 +        uint8_t i;
 +
 +        for (i = 0; i < sizeof serno / sizeof serno[0]; i++)
 +            crc = _crc_ibutton_update(crc, serno[i]);
 +
 +        return crc; // Return 0 is CRC is correct
 +    }
 +</code>
avr/crc16.h.1379492622.txt.gz · Last modified: 2013/09/18 08:23 by sdolt