Contrôle d'erreur par test de redondance cyclique
 

CRC_RG:=0; // Initialisation du registre
repeat

Le test de redondance cyclique CRC à déjà été décrit dans le cas d'Ethernet.

Pour ce qui est du bus CAN, le polynôme générateur, par lequel sera divisé le flux formé par le bit de start, les bits du champ d'arbitrage, ceux du champ de contrôle et du champ de données, suivis de 15 bits à 0, a pour valeur :

CRC_next := nextbit OUEXC CRC_RG[14];
CRC_RG[14:1]:=CRC_RG[13:0]; // Décalage
CRC_RG[0]:=0;
if CRC_next then

CRC_RG[14:0]:=CRC_RG[14:0] OUEXC $C599;

endif ;

until (début de séquence CRC ou erreur)
(d'après un document Philips)

Le reste de cette division polynômiale est la séquence CRC, transmise sur le bus et suivie d'un bit 'récessif' marquant la fin de la séquence CRC. Ce bit est appelé délimiteur CRC.

Il est possible de matérialiser cette fonction de transmission par un registre à décalage à 15 bits CRC_RG, de CRC_RG[14] à CRC_RG[0]. La séquence CRC peut aussi être calculée selon le programme ci-contre, dans lequel nextbit représente le bit suivant du flux de données réalisé précédemment.

La station émettrice envoie la séquence CRC à la suite des données. La station réceptrice recalcule cette séquence à partir du flux reçu et en déduit qu'il n'y a pas d'erreur si les deux séquences CRC sont identiques.