cancel
Showing results for 
Search instead for 
Did you mean: 

Calculate CRC-8

parisa
Senior

Hello,

I need to know how to calculate CRC-8 of input data.

I have a binary stream like (12586966 Dec or 0XC00FD6) and CRC-8(22 DEC, 0x16). Based on 0x97 polynomial how I can calculate my input binary stream CRC-8?

Thanks

1 ACCEPTED SOLUTION

Accepted Solutions
// 8-bit CRC Model - sourcer32@gmail.com
//  Copyright (C) 1988-2020, All Rights Reserved
 
#include <windows.h>
 
#include <stdio.h>
#include <stdlib.h>
 
#define POLY 0x97 // # 0x197 = x^8 + x^7 + x^4 + x^2 + x^1 +1  (0x97 -> 0x197)
 
unsigned char Slow_CRC_Cal8Bits(unsigned char crc, int Size, unsigned char *Buffer)
{
  int i;
 
  while(Size--)
  {
    crc = crc ^ *Buffer++; // Apply Byte
 
    for(i=0; i<8; i++) // Eight rounds of 1-bit
    {
      if (crc & 0x80)
        crc = (crc << 1) ^ POLY;
      else
        crc = (crc << 1); // Left Shifting
    }
  }
 
  return(crc);
}
 
unsigned char Quick_CRC_Cal8Bits(unsigned char crc, int Size, unsigned char *Buffer)
{
  static const unsigned char CrcTable[] = {
    0x00,0x97,0xB9,0x2E,0xE5,0x72,0x5C,0xCB, // 0x97 Polynomial Table, 4-bit, sourcer32@gmail.com
    0x5D,0xCA,0xE4,0x73,0xB8,0x2F,0x01,0x96 };
 
 
  while(Size--)
  {
    crc = crc ^ *Buffer++; // Apply Byte
 
    crc = (crc << 4) ^ CrcTable[(crc >> 4) & 0xF]; // Two rounds of 4-bits
    crc = (crc << 4) ^ CrcTable[(crc >> 4) & 0xF];
  }
 
  return(crc);
}
 
unsigned char Fast_CRC_Cal8Bits(unsigned char crc, int Size, unsigned char *Buffer)
{
  static const unsigned char CrcTable[] = { // 0x97 Polynomial Table, 8-bit, sourcer32@gmail.com
    0x00,0x97,0xB9,0x2E,0xE5,0x72,0x5C,0xCB,
    0x5D,0xCA,0xE4,0x73,0xB8,0x2F,0x01,0x96,
    0xBA,0x2D,0x03,0x94,0x5F,0xC8,0xE6,0x71,
    0xE7,0x70,0x5E,0xC9,0x02,0x95,0xBB,0x2C,
    0xE3,0x74,0x5A,0xCD,0x06,0x91,0xBF,0x28,
    0xBE,0x29,0x07,0x90,0x5B,0xCC,0xE2,0x75,
    0x59,0xCE,0xE0,0x77,0xBC,0x2B,0x05,0x92,
    0x04,0x93,0xBD,0x2A,0xE1,0x76,0x58,0xCF,
    0x51,0xC6,0xE8,0x7F,0xB4,0x23,0x0D,0x9A,
    0x0C,0x9B,0xB5,0x22,0xE9,0x7E,0x50,0xC7,
    0xEB,0x7C,0x52,0xC5,0x0E,0x99,0xB7,0x20,
    0xB6,0x21,0x0F,0x98,0x53,0xC4,0xEA,0x7D,
    0xB2,0x25,0x0B,0x9C,0x57,0xC0,0xEE,0x79,
    0xEF,0x78,0x56,0xC1,0x0A,0x9D,0xB3,0x24,
    0x08,0x9F,0xB1,0x26,0xED,0x7A,0x54,0xC3,
    0x55,0xC2,0xEC,0x7B,0xB0,0x27,0x09,0x9E,
    0xA2,0x35,0x1B,0x8C,0x47,0xD0,0xFE,0x69,
    0xFF,0x68,0x46,0xD1,0x1A,0x8D,0xA3,0x34,
    0x18,0x8F,0xA1,0x36,0xFD,0x6A,0x44,0xD3,
    0x45,0xD2,0xFC,0x6B,0xA0,0x37,0x19,0x8E,
    0x41,0xD6,0xF8,0x6F,0xA4,0x33,0x1D,0x8A,
    0x1C,0x8B,0xA5,0x32,0xF9,0x6E,0x40,0xD7,
    0xFB,0x6C,0x42,0xD5,0x1E,0x89,0xA7,0x30,
    0xA6,0x31,0x1F,0x88,0x43,0xD4,0xFA,0x6D,
    0xF3,0x64,0x4A,0xDD,0x16,0x81,0xAF,0x38,
    0xAE,0x39,0x17,0x80,0x4B,0xDC,0xF2,0x65,
    0x49,0xDE,0xF0,0x67,0xAC,0x3B,0x15,0x82,
    0x14,0x83,0xAD,0x3A,0xF1,0x66,0x48,0xDF,
    0x10,0x87,0xA9,0x3E,0xF5,0x62,0x4C,0xDB,
    0x4D,0xDA,0xF4,0x63,0xA8,0x3F,0x11,0x86,
    0xAA,0x3D,0x13,0x84,0x4F,0xD8,0xF6,0x61,
    0xF7,0x60,0x4E,0xD9,0x12,0x85,0xAB,0x3C };
 
  while(Size--)
  {
    crc = crc ^ *Buffer++; // Apply Byte
 
    crc = CrcTable[crc & 0xFF]; // One round of 8-bits
  }
 
  return(crc);
}
 
int main(int argc, char **argv)
{
  unsigned char crc;
  unsigned char test[] = { 0xC0, 0x0F, 0xD6 };
 
  /* The expected CRC value of test[] using the polynomial 0x97 is 0x16, when initialized with 0x00 */
 
  printf("crc=%02X Slow\n", Slow_CRC_Cal8Bits(0x00, sizeof(test), test));
 
  printf("crc=%02X Quick\n", Quick_CRC_Cal8Bits(0x00, sizeof(test), test));
 
  printf("crc=%02X Fast\n", Fast_CRC_Cal8Bits(0x00, sizeof(test), test));
 
  return(1);
}

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

View solution in original post

6 REPLIES 6

Which STM32?

Give us also an example stream with the resulting correct CRC.

JW

parisa
Senior

Thank you for your swift comment.

My MCU is STM32F103. Here is data:

Transmitter:

Binary stream: ‭110000000000111111010110‬ (0XC00FD6)

CRC-8:‭ 00010110‬

And based on the datasheet the CRC-8 is obtained by initial polynomial 0x97 value.

The 'F103's CRC module allows to calculate only fixed-poly CRC-32, so you have to perform the calculation in software.

You will find numerous examples for CRC-8 in C on the internet.

JW

// 8-bit CRC Model - sourcer32@gmail.com
//  Copyright (C) 1988-2020, All Rights Reserved
 
#include <windows.h>
 
#include <stdio.h>
#include <stdlib.h>
 
#define POLY 0x97 // # 0x197 = x^8 + x^7 + x^4 + x^2 + x^1 +1  (0x97 -> 0x197)
 
unsigned char Slow_CRC_Cal8Bits(unsigned char crc, int Size, unsigned char *Buffer)
{
  int i;
 
  while(Size--)
  {
    crc = crc ^ *Buffer++; // Apply Byte
 
    for(i=0; i<8; i++) // Eight rounds of 1-bit
    {
      if (crc & 0x80)
        crc = (crc << 1) ^ POLY;
      else
        crc = (crc << 1); // Left Shifting
    }
  }
 
  return(crc);
}
 
unsigned char Quick_CRC_Cal8Bits(unsigned char crc, int Size, unsigned char *Buffer)
{
  static const unsigned char CrcTable[] = {
    0x00,0x97,0xB9,0x2E,0xE5,0x72,0x5C,0xCB, // 0x97 Polynomial Table, 4-bit, sourcer32@gmail.com
    0x5D,0xCA,0xE4,0x73,0xB8,0x2F,0x01,0x96 };
 
 
  while(Size--)
  {
    crc = crc ^ *Buffer++; // Apply Byte
 
    crc = (crc << 4) ^ CrcTable[(crc >> 4) & 0xF]; // Two rounds of 4-bits
    crc = (crc << 4) ^ CrcTable[(crc >> 4) & 0xF];
  }
 
  return(crc);
}
 
unsigned char Fast_CRC_Cal8Bits(unsigned char crc, int Size, unsigned char *Buffer)
{
  static const unsigned char CrcTable[] = { // 0x97 Polynomial Table, 8-bit, sourcer32@gmail.com
    0x00,0x97,0xB9,0x2E,0xE5,0x72,0x5C,0xCB,
    0x5D,0xCA,0xE4,0x73,0xB8,0x2F,0x01,0x96,
    0xBA,0x2D,0x03,0x94,0x5F,0xC8,0xE6,0x71,
    0xE7,0x70,0x5E,0xC9,0x02,0x95,0xBB,0x2C,
    0xE3,0x74,0x5A,0xCD,0x06,0x91,0xBF,0x28,
    0xBE,0x29,0x07,0x90,0x5B,0xCC,0xE2,0x75,
    0x59,0xCE,0xE0,0x77,0xBC,0x2B,0x05,0x92,
    0x04,0x93,0xBD,0x2A,0xE1,0x76,0x58,0xCF,
    0x51,0xC6,0xE8,0x7F,0xB4,0x23,0x0D,0x9A,
    0x0C,0x9B,0xB5,0x22,0xE9,0x7E,0x50,0xC7,
    0xEB,0x7C,0x52,0xC5,0x0E,0x99,0xB7,0x20,
    0xB6,0x21,0x0F,0x98,0x53,0xC4,0xEA,0x7D,
    0xB2,0x25,0x0B,0x9C,0x57,0xC0,0xEE,0x79,
    0xEF,0x78,0x56,0xC1,0x0A,0x9D,0xB3,0x24,
    0x08,0x9F,0xB1,0x26,0xED,0x7A,0x54,0xC3,
    0x55,0xC2,0xEC,0x7B,0xB0,0x27,0x09,0x9E,
    0xA2,0x35,0x1B,0x8C,0x47,0xD0,0xFE,0x69,
    0xFF,0x68,0x46,0xD1,0x1A,0x8D,0xA3,0x34,
    0x18,0x8F,0xA1,0x36,0xFD,0x6A,0x44,0xD3,
    0x45,0xD2,0xFC,0x6B,0xA0,0x37,0x19,0x8E,
    0x41,0xD6,0xF8,0x6F,0xA4,0x33,0x1D,0x8A,
    0x1C,0x8B,0xA5,0x32,0xF9,0x6E,0x40,0xD7,
    0xFB,0x6C,0x42,0xD5,0x1E,0x89,0xA7,0x30,
    0xA6,0x31,0x1F,0x88,0x43,0xD4,0xFA,0x6D,
    0xF3,0x64,0x4A,0xDD,0x16,0x81,0xAF,0x38,
    0xAE,0x39,0x17,0x80,0x4B,0xDC,0xF2,0x65,
    0x49,0xDE,0xF0,0x67,0xAC,0x3B,0x15,0x82,
    0x14,0x83,0xAD,0x3A,0xF1,0x66,0x48,0xDF,
    0x10,0x87,0xA9,0x3E,0xF5,0x62,0x4C,0xDB,
    0x4D,0xDA,0xF4,0x63,0xA8,0x3F,0x11,0x86,
    0xAA,0x3D,0x13,0x84,0x4F,0xD8,0xF6,0x61,
    0xF7,0x60,0x4E,0xD9,0x12,0x85,0xAB,0x3C };
 
  while(Size--)
  {
    crc = crc ^ *Buffer++; // Apply Byte
 
    crc = CrcTable[crc & 0xFF]; // One round of 8-bits
  }
 
  return(crc);
}
 
int main(int argc, char **argv)
{
  unsigned char crc;
  unsigned char test[] = { 0xC0, 0x0F, 0xD6 };
 
  /* The expected CRC value of test[] using the polynomial 0x97 is 0x16, when initialized with 0x00 */
 
  printf("crc=%02X Slow\n", Slow_CRC_Cal8Bits(0x00, sizeof(test), test));
 
  printf("crc=%02X Quick\n", Quick_CRC_Cal8Bits(0x00, sizeof(test), test));
 
  printf("crc=%02X Fast\n", Fast_CRC_Cal8Bits(0x00, sizeof(test), test));
 
  return(1);
}

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

... or just wait until Clive brings it to you on a silver plate... 😉

JW

parisa
Senior

Hello all,

I am sorry for delay in my response. I really appreciate your help and your code with has been set for my CRC algorithm.

Thank you again for everything.