MotorControlModuleSDFM_TMS3.../Projects/epwm_test/src/crc.c

133 lines
3.1 KiB
C
Raw Normal View History

/*
* crc.c
*
* Created on: 7 <EFBFBD><EFBFBD><EFBFBD>. 2024 <EFBFBD>.
* Author: seklyuts
*/
#include "f28x_project.h"
const int order = 6;
const unsigned long polynom = 0x43;
const int direct = 1;
const unsigned long crcinit = 0x0000;
const unsigned long crcxor = 0xffff;
const int refin = 0;
const int refout = 0;
// internal global values:
unsigned long crcmask;
unsigned long crchighbit;
unsigned long crcinit_direct;
unsigned long crcinit_nondirect;
unsigned long crctab[256];
unsigned long reflect (unsigned long crc, int bitnum) {
// reflects the lower <20>bitnum<75> bits of <20>crc<72>
unsigned long i, j=1, crcout=0;
for (i=(unsigned long)1<<(bitnum-1); i; i>>=1) {
if (crc & i) crcout|=j;
j<<= 1;
}
return (crcout);
}
unsigned long crcbitbybit(unsigned char* p, unsigned long len) {
// bit by bit algorithm with augmented zero bytes.
// does not use lookup table, suited for polynom orders between 1...32.
unsigned long i, j, c, bit;
unsigned long crc = crcinit_nondirect;
for (i=0; i<len; i++) {
c = (unsigned long)*p++;
if (refin) c = reflect(c, 8);
for (j=0x80; j; j>>=1) {
bit = crc & crchighbit;
crc<<= 1;
if (c & j) crc|= 1;
if (bit) crc^= polynom;
}
}
for (i=0; i<order; i++) {
bit = crc & crchighbit;
crc<<= 1;
if (bit) crc^= polynom;
}
if (refout) crc=reflect(crc, order);
crc^= crcxor;
crc&= crcmask;
return(crc);
}
//unsigned long crcbitbybitfast(unsigned char* p, unsigned long len) {
uint16_t crcbitbybitfast(uint64_t data)
{
// fast bit by bit algorithm without augmented zero bytes.
// does not use lookup table, suited for polynom orders between 1...32.
unsigned long i, j, c, bit;
unsigned long crc = crcinit_direct;
crcmask = ((((uint64_t)1<<(order-1))-1)<<1)|1;
crchighbit = (uint64_t)1<<(order-1);
uint16_t p[5];
p[4] = data & 0xFF;
p[3] = (data >> 8) & 0xFF;
p[2] = (data >> 16) & 0xFF;
p[1] = (data >> 24) & 0xFF;
p[0] = (data >> 32) & 0xFF;
for (i=0; i<5; i++) {
c = p[i];
// if (refin) c = reflect(c, 8);
for (j=0x80; j; j>>=1) {
bit = crc & crchighbit;
crc<<= 1;
if (c & j) bit^= crchighbit;
if (bit) crc^= polynom;
}
}
// if (refout) crc=reflect(crc, order);
crc^= crcxor;
crc&= crcmask;
return(crc);
}
#define ALL_BITS 38
#define CS_BITS 6
uint16_t calcCRC(uint64_t data) // 38 bit -> 6 bit // x6 + x1 + 1/// poly = 0b1000011 = 0x86;
{
uint64_t temp1, temp2, crc = 0;
uint64_t poly = (uint64_t)0b1000011 << (ALL_BITS - CS_BITS - 1);
uint16_t i = 0;
crc = poly;
temp1 = data;
crc ^= temp1;
for(i=0; i < (ALL_BITS - CS_BITS); i++)
{
// crc = (crc & ((uint64_t)1 << (ALL_BITS-1))) ? ((crc ^ poly) << 1) : (crc << 1);
temp2 = ((uint64_t)1 << (ALL_BITS-1));
if(crc & temp2)
{
crc = ((crc ^ poly) << 1);
}
else
{
crc = (crc << 1);
}
}
return (crc >> (ALL_BITS - CS_BITS));
}