SparkFun Forums 

Where electronics enthusiasts find answers.

Have questions about a SparkFun product or board? This is the place to be.
User avatar
By Chupa
#51119
I need to check my CRCs on my AVR to make sure im doing them right. Is there a CRC calculator out there where I can enter a custom poly? I cat seem to find one using the poly I am, which is the maxim 1 wire 8 bit CRC: x^8 + X^5 + X^4 +1

I can figure it out by hand but i cant seem to grasp how to use a calculator (or if thats possible) to figure it out.

For example, with a cleared CRC, 0x81 will generate a checksum of 0xD2 which is right according to my AVR and my hand calculations on the white board. How can I use a calculator to do the dirty work?
User avatar
By leon_heller
#51130
Several maths programs will allow the input of polynomials into a program. Scilab is free.

Leon
By jasonharper
#51145
Each application of the polynomial generates one bit of the CRC; assuming you're interested in full bytes, you'd have to press a LOT of keys on your calculator, unless it was a programmable unit with loops.

There are several CRC calculators online, but I couldn't find one that both supports this polynomial, and allows data entry in hex...

Here's some Python code that calculates the Maxim 8-bit CRC:
Code: Select all
#! /usr/bin/python

crctab = [
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53]

def crc(*args):
	val = 0
	args = list(args)
	args.reverse()
	for x in args:
		val = crctab[val ^ x]
	return val

print hex(crc(0x81))
Note that you can pass multiple bytes to crc(), but they're used in reverse, to match the way 1-Wire device IDs are normally written.
User avatar
By Chupa
#51149
jasonharper wrote: Note that you can pass multiple bytes to crc(), but they're used in reverse, to match the way 1-Wire device IDs are normally written.
I was also unsuccessful in finding an online calc that used that poly.

I do have a ti-89 so it is possible for me to write a program.

Can you elaborate on what you mean by passing bytes to the crc in reverse? do you mean a MSB or LSB first type thing?
By wiml
#51277
If you haven't already, check out Ross Williams' “Painless Guide to CRC Algorithms”. It's the clearest description I've read of how to get from the basic theory of CRCs to the way they're actually implemented (table-driven CRCs, and all the weird quirks and twists like bit ordering, and so on).

If you just want to verify your AVR code, after you've checked one or two cases by hand, you could use some actual 1-wire devices to generate “test vectors” and make sure that your CRC matches the one they actually send, assuming that there weren't any bits dropped while you were communicating with it.
By andy4us
#51371
I found some code on the web, a one wire lib which had the following code in it
Code: Select all

BSP_UINT8 crcTable[] = {
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53 };


void doCrc(BSP_UINT8 val, BSP_UINT8 *crc)
{
 *crc = crcTable[(*crc) ^ val];
}


and to use my code is something like this
Code: Select all
  id = 0;
   // first read the ID of the device
   for (loop=0;loop < 8 ;loop++)
    {
     id |= (bspDS2401ReadBit() << loop);
    }
  // bspSendString(0," id:");
//   bspSendHex(0,id);
//   bspSendByte(0,' ');
   doCrc(id,&calcCrc);

   for (dataLoop =0;dataLoop < 6;dataLoop++)
    {
     readData=0;
     for (loop=0;loop < 8 ;loop++)
      {
       readData |= (bspDS2401ReadBit() << loop);
      }
//     bspSendString(0,":");
//     bspSendHex(0,readData);
     *(data+dataLoop)=readData;
//     bspSendString(0,":");
     doCrc(readData,&calcCrc);

    }
   crc=0;
   for (loop=0;loop < 8 ;loop++)
    {
     crc |= (bspDS2401ReadBit() << loop);
    }
   if (crc == calcCrc)
    {
     ec=ECS_OK;
    }
   else
    {
     ec=ECF_FAIL;
    }
hope that makes sense,

Andy