Le CRC, ou Contrôle de Redondance Cyclique est un mécanisme de détection d'erreurs utilisé par certains protocole de communication. Il est par exemple utilisé par le bus OneWire.
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.
#include <util/crc16.h>
Documentation : http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html
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.
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 :
static __inline__ uint8_t _crc_ibutton_update (uint8_t __crc, uint8_t __data);
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 :
static __inline__ uint16_t _crc16_update (uint16_t __crc, uint8_t __data);
Les exemples ci-dessous sont tirés de la documentation d'avr-libc
// 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 }
// 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 }