User Tools

Site Tools


avr:crc16.h

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
avr:crc16.h [2013/09/18 08:55] 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. Ces fonctions sont codée en assembleur et de type "inline" pour augmenter leur vitesse d'exécution.+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>
Line 15: Line 15:
 ==== CRC pour OneWire ==== ==== CRC pour OneWire ====
  
-Le protocole OneWire utilise deux types de CRC, un sur 8 bits et l'autre sur 16 bits.+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 === === DOW CRC8 ===
Line 33: Line 33:
 <code c> <code c>
 static __inline__ uint16_t _crc16_update (uint16_t __crc, uint8_t __data); 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> </code>
avr/crc16.h.1379494531.txt.gz · Last modified: 2013/09/18 08:55 by sdolt