crc8-bit

Maxim DOW CRC algorithm. Cannot re-create example in application note


I'm building something which uses the DS18B20 temperature sensor. First I am trying to understand the example CRC in the Maxim application note 27, "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products" (https://www.analog.com/en/technical-articles/understanding-and-using-cyclic-redundancy-checks-with-maxim-1wire-and-ibutton-products.html). It doesn't look too hard to code the conversion but my problem is that I cannot find any calculator that gives me the correct answer of 0xA2.

On page 5, example 2 the complete ROM code is given in hex as A2=(CRC), 00 00 00 01 B8 1C 02=(Family code). The generator polynomial is 100110001 (X8+X5+X4+1). On the site https://crccalc.com/ it has a CRC-8/MAXIM algorithm which has the correct generator but the RefIn and RefOut are both true whereas I cannot see anything in the application note about reversing parts (although I have tried this). On the site https://tomeko.net/online_tools/crc8.php?lang=en it claims to implement the CRC from the application note but it gives the same answers as crccalc.com. Also note that crccalc has the same lookup table for the Maxim algorithm as the application note so no surprise the two web sites are giving the same answers. Finally I found a site, https://www.rndtool.info/CRC-step-by-step-calculator/, that allows me to add the polynomial and bit stream in binary and it shows the 'hand' calculation of the CRC. This says nothing about input and output refs so I assume they are false. This gives different answers to the other two sites probably because of the ref values but still does not give 0xA2.

Has anyone correctly calculated the given value in the application note?

I don't want to start programming until I understand what is going on and I cannot read data from a device if I cannot decipher the CRC correctly. This is driving me mad at the moment. I've tried the number reflected and forwards with the generator reflected and forwards plus reversing the answer but I never get 0xA2.


Solution

  • You didn't give a language in your tags. Here is an example in C:

    #include <stdio.h>
    
    unsigned crc8maximdow(unsigned char *data, size_t len) {
        unsigned crc = 0;
        for (size_t i = 0; i < len; i++) {
            crc ^= data[i];
            for (unsigned k = 0; k < 8; k++)
                crc = crc & 1 ? (crc >> 1) ^ 0x8c : crc >> 1;
        }
        return crc;
    }
    
    int main(void) {
        unsigned char data[] = {2, 0x1c, 0xb8, 1, 0, 0, 0};
        printf("0x%02x\n", crc8maximdow(data, sizeof(data)));
        return 0;
    }
    

    That prints 0xa2.