onewire:crc
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| onewire:crc [2012/05/15 13:07] – created fdc | onewire:crc [2013/09/18 09:08] (current) – sdolt | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| < | < | ||
| + | |||
| + | < | ||
| ====== DOW CRC (Dallas One Wire CRC) ====== | ====== DOW CRC (Dallas One Wire CRC) ====== | ||
| + | <note warning> | ||
| ===== DOW CRC-8 ===== | ===== DOW CRC-8 ===== | ||
| Line 9: | Line 12: | ||
| <file c> | <file c> | ||
| #include < | #include < | ||
| + | #include < | ||
| #define CRCPOLY8 0x18 // | #define CRCPOLY8 0x18 // | ||
| - | int main(void) | + | void main(void) |
| { | { | ||
| - | int crc = 0x00 , i = 0, bit_counter = 0, b = 0, feedback_bit = 0; // | + | int crc = 0x00 , i = 0, bit_counter = 0, b = 0, feedback_bit |
| char string[]={" | char string[]={" | ||
| - | for (i=0; i<=15; i++) // | + | |
| + | | ||
| { | { | ||
| - | b = string[15-i]; // | + | b = string[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> | while (bit_counter> | ||
| Line 25: | Line 30: | ||
| if (feedback_bit == 0x01) crc = crc ^ CRCPOLY8; | if (feedback_bit == 0x01) crc = crc ^ CRCPOLY8; | ||
| crc = (crc >> 1) & 0x7F; // | crc = (crc >> 1) & 0x7F; // | ||
| - | if (feedback_bit == 0x01) crc = crc | 0x80; // | + | if (feedback_bit == 0x01) crc = crc | 0x80; // |
| b = b>> | b = b>> | ||
| bit_counter--; | bit_counter--; | ||
| } | } | ||
| } | } | ||
| - | printf(" | + | printf(" |
| - | return crc; | + | |
| } | } | ||
| </ | </ | ||
| ==== 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] <=> ' | === b = string [15] <=> ' | ||
| Line 406: | Line 410: | ||
| === i=2 === | === i=2 === | ||
| === b = string [13] <=> ' | === b = string [13] <=> ' | ||
| + | |||
| + | . \\ . \\ . | ||
| + | |||
| + | === i=13 === | ||
| + | === b = string [2] <=> ' | ||
| + | |||
| + | . \\ . \\ . | ||
| + | |||
| + | == bit_counter = 1 == | ||
| + | |||
| + | <code c> feedback_bit = (crc ^ b) & 0x01;</ | ||
| + | ^ crc XOR b ^^ | ||
| + | | crc | 0101' | ||
| + | | b | 0000' | ||
| + | ^ Résultat | 0101' | ||
| + | |||
| + | ^ (crc XOR b) & 0x01 ^^ | ||
| + | |crc XOR b | 0101' | ||
| + | | 0x01 | 0000' | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> feedback_bit = 0x01** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x01) crc = crc ^ CRCPOLY8; </ | ||
| + | |||
| + | ^ crc XOR CRCPOLY8 | ||
| + | | crc | 0101' | ||
| + | | CRCPOLY8 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x45** | ||
| + | |||
| + | <code c> crc = (crc >> 1) & 0x7F; </ | ||
| + | |||
| + | ^ crc>> | ||
| + | | crc | 0100' | ||
| + | ^ crc>> | ||
| + | |||
| + | ^ (crc>> | ||
| + | | crc>> | ||
| + | | 0x7F | 0111' | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x22** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x01) crc = crc | 0x80; </ | ||
| + | |||
| + | ^ crc OR 0x80 ^^ | ||
| + | | crc | 0010' | ||
| + | | 0x80 | 1000' | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> 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] <=> ' | ||
| . \\ . \\ . | . \\ . \\ . | ||
| Line 418: | Line 480: | ||
| . \\ . \\ . | . \\ . \\ . | ||
| - | **=> crc = 0x00** | + | **=> crc = 0x00 {Nous avons au final un 0x00, 0xA2 est bel et bien le CRC de [00000001B81C02]}** |
| + | |||
| + | ===== DOW CRC-16 ===== | ||
| + | |||
| + | ==== Fonction ==== | ||
| + | |||
| + | <file c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #define CRCPOLY16 0x4002 | ||
| + | |||
| + | void main(void) | ||
| + | { | ||
| + | int crc = 0x0000 , i = 0, bit_counter = 0, b = 0, feedback_bit = 0, length = 0; // | ||
| + | char string[]={" | ||
| + | |||
| + | length = strlen(string)-1; | ||
| + | for (i=0; i< | ||
| + | { | ||
| + | b = string[length-i]; | ||
| + | bit_counter = 4; //si le caractère a déjà été décomposé en hexadécimal => 4 bits par valeur | ||
| + | while (bit_counter> | ||
| + | { | ||
| + | feedback_bit = (crc ^ b) & 0x0001; | ||
| + | if (feedback_bit == 0x0001) crc = crc ^ CRCPOLY16; | ||
| + | crc = (crc >> 1) & 0x7FFF; | ||
| + | if (feedback_bit == 0x0001) crc = crc | 0x8000; | ||
| + | b = b>> | ||
| + | bit_counter--; | ||
| + | } | ||
| + | } | ||
| + | printf(" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Exemple de fonctionnement ==== | ||
| + | 1-Wire ROM: 75 \\ CRCPOLY16 = 0x4002 \\ CRCinitial = 0x90F1 | ||
| + | === i=0 === | ||
| + | === b = string [1] <=> ' | ||
| + | |||
| + | == bit_counter = 4 == | ||
| + | |||
| + | <code c> feedback_bit = (crc ^ b) & 0x0001;</ | ||
| + | ^ crc XOR b ^^ | ||
| + | | crc | 1001' | ||
| + | | b | 0000' | ||
| + | ^ Résultat | 1001' | ||
| + | |||
| + | ^ (crc XOR b) & 0x0001 | ||
| + | |crc XOR b | 1001' | ||
| + | | 0x0001 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> feedback_bit = 0x0000** | ||
| + | |||
| + | <code c> crc = (crc >> 1) & 0x7FFF; </ | ||
| + | |||
| + | ^ crc>> | ||
| + | | crc | 1001' | ||
| + | ^ crc>> | ||
| + | |||
| + | ^ (crc>> | ||
| + | | crc>> | ||
| + | | 0x7FFF | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x4878** | ||
| + | |||
| + | <code c> b = b>>1; </ | ||
| + | |||
| + | ^ b>> | ||
| + | | b | 0000' | ||
| + | ^ b>> | ||
| + | |||
| + | **=> b = 0x0002** | ||
| + | |||
| + | == bit_counter = 3 == | ||
| + | |||
| + | <code c> feedback_bit = (crc ^ b) & 0x0001;</ | ||
| + | ^ crc XOR b ^^ | ||
| + | | crc | 0100' | ||
| + | | b | 0000' | ||
| + | ^ Résultat | 0100' | ||
| + | |||
| + | ^ (crc XOR b) & 0x0001 | ||
| + | |crc XOR b | 0100' | ||
| + | | 0x0001 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> feedback_bit = 0x0000** | ||
| + | |||
| + | <code c> crc = (crc >> 1) & 0x7FFF; </ | ||
| + | |||
| + | ^ crc>> | ||
| + | | crc | 0100' | ||
| + | ^ crc>> | ||
| + | |||
| + | ^ (crc>> | ||
| + | | crc>> | ||
| + | | 0x7FFF | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x243C** | ||
| + | |||
| + | <code c> b = b>>1; </ | ||
| + | |||
| + | ^ b>> | ||
| + | | b | 0000' | ||
| + | ^ b>> | ||
| + | |||
| + | **=> b = 0x0001** | ||
| + | |||
| + | == bit_counter = 2 == | ||
| + | |||
| + | <code c> feedback_bit = (crc ^ b) & 0x0001;</ | ||
| + | ^ crc XOR b ^^ | ||
| + | | crc | 0010' | ||
| + | | b | 0000' | ||
| + | ^ Résultat | 0010' | ||
| + | |||
| + | ^ (crc XOR b) & 0x0001 | ||
| + | |crc XOR b | 0010' | ||
| + | | 0x0001 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> feedback_bit = 0x0001** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x0001) crc = crc ^ CRCPOLY16; </ | ||
| + | |||
| + | ^ crc XOR CRCPOLY8 | ||
| + | | crc | 0010' | ||
| + | | CRCPOLY16 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x643E** | ||
| + | |||
| + | <code c> crc = (crc >> 1) & 0x7FFF; </ | ||
| + | |||
| + | ^ crc>> | ||
| + | | crc | 0110' | ||
| + | ^ crc>> | ||
| + | |||
| + | ^ (crc>> | ||
| + | | crc>> | ||
| + | | 0x7FFF | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x321F** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x0001) crc = crc | 0x80; </ | ||
| + | |||
| + | ^ crc OR 0x8000 | ||
| + | | crc | 0011' | ||
| + | | 0x8000 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0xB21F** | ||
| + | |||
| + | <code c> b = b>>1; </ | ||
| + | |||
| + | ^ b>> | ||
| + | | b | 0000' | ||
| + | ^ b>> | ||
| + | |||
| + | **=> b = 0x0000** | ||
| + | |||
| + | == bit_counter = 1 == | ||
| + | |||
| + | <code c> feedback_bit = (crc ^ b) & 0x0001;</ | ||
| + | ^ crc XOR b ^^ | ||
| + | | crc | 1011' | ||
| + | | b | 0000' | ||
| + | ^ Résultat | 1011' | ||
| + | |||
| + | ^ (crc XOR b) & 0x0001 | ||
| + | |crc XOR b | 1011' | ||
| + | | 0x0001 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> feedback_bit = 0x0001** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x0001) crc = crc ^ CRCPOLY16; </ | ||
| + | |||
| + | ^ crc XOR CRCPOLY8 | ||
| + | | crc | 1011' | ||
| + | | CRCPOLY16 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0xF21D** | ||
| + | |||
| + | <code c> crc = (crc >> 1) & 0x7FFF; </ | ||
| + | |||
| + | ^ crc>> | ||
| + | | crc | 1111' | ||
| + | ^ crc>> | ||
| + | |||
| + | ^ (crc>> | ||
| + | | crc>> | ||
| + | | 0x7FFF | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x790E** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x0001) crc = crc | 0x80; </ | ||
| + | |||
| + | ^ crc OR 0x8000 | ||
| + | | crc | 0111' | ||
| + | | 0x8000 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0xF90E** | ||
| + | |||
| + | <code c> b = b>>1; </ | ||
| + | |||
| + | ^ b>> | ||
| + | | b | 0000' | ||
| + | ^ b>> | ||
| + | |||
| + | **=> b = 0x0000** | ||
| + | |||
| + | === i= 1 === | ||
| + | === b = string [0] <=> ' | ||
| + | |||
| + | == bit_counter = 4 == | ||
| + | |||
| + | <code c> feedback_bit = (crc ^ b) & 0x0001;</ | ||
| + | ^ crc XOR b ^^ | ||
| + | | crc | 1111' | ||
| + | | b | 0000' | ||
| + | ^ Résultat | 1111' | ||
| + | |||
| + | ^ (crc XOR b) & 0x0001 | ||
| + | |crc XOR b | 1111' | ||
| + | | 0x0001 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> feedback_bit = 0x0001** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x0001) crc = crc ^ CRCPOLY16; </ | ||
| + | |||
| + | ^ crc XOR CRCPOLY8 | ||
| + | | crc | 1111' | ||
| + | | CRCPOLY16 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0xB90C** | ||
| + | |||
| + | <code c> crc = (crc >> 1) & 0x7FFF; </ | ||
| + | |||
| + | ^ crc>> | ||
| + | | crc | 1011' | ||
| + | ^ crc>> | ||
| + | |||
| + | ^ (crc>> | ||
| + | | crc>> | ||
| + | | 0x7FFF | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x5C86** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x0001) crc = crc | 0x80; </ | ||
| + | |||
| + | ^ crc OR 0x8000 | ||
| + | | crc | 0101' | ||
| + | | 0x8000 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0xDC86** | ||
| + | |||
| + | <code c> b = b>>1; </ | ||
| + | |||
| + | ^ b>> | ||
| + | | b | 0000' | ||
| + | ^ b>> | ||
| + | |||
| + | **=> b = 0x0003** | ||
| + | |||
| + | |||
| + | == bit_counter = 3 == | ||
| + | |||
| + | <code c> feedback_bit = (crc ^ b) & 0x0001;</ | ||
| + | ^ crc XOR b ^^ | ||
| + | | crc | 1101' | ||
| + | | b | 0000' | ||
| + | ^ Résultat | 1101' | ||
| + | |||
| + | ^ (crc XOR b) & 0x0001 | ||
| + | |crc XOR b | 1101' | ||
| + | | 0x0001 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> feedback_bit = 0x0001** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x0001) crc = crc ^ CRCPOLY16; </ | ||
| + | |||
| + | ^ crc XOR CRCPOLY8 | ||
| + | | crc | 1101' | ||
| + | | CRCPOLY16 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x9C84** | ||
| + | |||
| + | <code c> crc = (crc >> 1) & 0x7FFF; </ | ||
| + | |||
| + | ^ crc>> | ||
| + | | crc | 1001' | ||
| + | ^ crc>> | ||
| + | |||
| + | ^ (crc>> | ||
| + | | crc>> | ||
| + | | 0x7FFF | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x4E42** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x0001) crc = crc | 0x80; </ | ||
| + | |||
| + | ^ crc OR 0x8000 | ||
| + | | crc | 0100' | ||
| + | | 0x8000 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0xCE42** | ||
| + | |||
| + | <code c> b = b>>1; </ | ||
| + | |||
| + | ^ b>> | ||
| + | | b | 0000' | ||
| + | ^ b>> | ||
| + | |||
| + | **=> b = 0x0001** | ||
| + | |||
| + | == bit_counter = 2 == | ||
| + | |||
| + | <code c> feedback_bit = (crc ^ b) & 0x0001;</ | ||
| + | ^ crc XOR b ^^ | ||
| + | | crc | 1100' | ||
| + | | b | 0000' | ||
| + | ^ Résultat | 1100' | ||
| + | |||
| + | ^ (crc XOR b) & 0x0001 | ||
| + | |crc XOR b | 1100' | ||
| + | | 0x0001 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> feedback_bit = 0x0001** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x0001) crc = crc ^ CRCPOLY16; </ | ||
| + | |||
| + | ^ crc XOR CRCPOLY8 | ||
| + | | crc | 1100' | ||
| + | | CRCPOLY16 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x8E40** | ||
| + | |||
| + | <code c> crc = (crc >> 1) & 0x7FFF; </ | ||
| + | |||
| + | ^ crc>> | ||
| + | | crc | 1000' | ||
| + | ^ crc>> | ||
| + | |||
| + | ^ (crc>> | ||
| + | | crc>> | ||
| + | | 0x7FFF | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x4720** | ||
| + | |||
| + | <code c> if (feedback_bit == 0x0001) crc = crc | 0x80; </ | ||
| + | |||
| + | ^ crc OR 0x8000 | ||
| + | | crc | 0100' | ||
| + | | 0x8000 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0xC720** | ||
| + | |||
| + | <code c> b = b>>1; </ | ||
| + | |||
| + | ^ b>> | ||
| + | | b | 0000' | ||
| + | ^ b>> | ||
| + | |||
| + | **=> b = 0x0000** | ||
| + | |||
| + | == bit_counter = 1 == | ||
| + | |||
| + | <code c> feedback_bit = (crc ^ b) & 0x0001;</ | ||
| + | ^ crc XOR b ^^ | ||
| + | | crc | 1100' | ||
| + | | b | 0000' | ||
| + | ^ Résultat | 1100' | ||
| + | |||
| + | ^ (crc XOR b) & 0x0001 | ||
| + | |crc XOR b | 1100' | ||
| + | | 0x0001 | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> feedback_bit = 0x0000** | ||
| + | |||
| + | <code c> crc = (crc >> 1) & 0x7FFF; </ | ||
| + | |||
| + | ^ crc>> | ||
| + | | crc | 1100' | ||
| + | ^ crc>> | ||
| + | |||
| + | ^ (crc>> | ||
| + | | crc>> | ||
| + | | 0x7FFF | ||
| + | ^ Résultat | ||
| + | |||
| + | **=> crc = 0x6390** | ||
onewire/crc.1337087229.txt.gz · Last modified: 2012/05/15 13:07 by fdc