Skip to main content
parisa
Associate III
March 3, 2020
Solved

Calculate CRC-8

  • March 3, 2020
  • 6 replies
  • 17934 views

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

This topic has been closed for replies.
Best answer by Tesla DeLorean
// 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);
}

6 replies

waclawek.jan
Super User
March 3, 2020

Which STM32?

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

JW

parisa
parisaAuthor
Associate III
March 3, 2020

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.

waclawek.jan
Super User
March 3, 2020

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

Tesla DeLorean
Tesla DeLoreanBest answer
Guru
March 3, 2020
// 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 VenmoUp vote any posts that you find helpful, it shows what's working..
waclawek.jan
Super User
March 3, 2020

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

JW

parisa
parisaAuthor
Associate III
March 19, 2020

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.