#include <stdio.h>
unsigned short int pec15Table[256];
unsigned short int CRC15_POLY = 0x4599;
void init_PEC15_Table();
unsigned short int pec15 (unsigned char *data , int len);
unsigned char Tx_data[8]={0};
unsigned short int pec;
int main(void)
{
int i;
Tx_data[0] = 0xFF;
Tx_data[1] = 0xFF;
Tx_data[2] = 0xFF;
Tx_data[3] = 0xFF;
Tx_data[4] = 0xFF;
Tx_data[5] = 0xFF;
init_PEC15_Table();
for(i=0;i<256;i++)
{
/* printf("\t%d",pec15Table[i]);*/
}
pec= pec15(&Tx_data[0],6);
return 0;
}
void init_PEC15_Table()
{
int i,bit ;
unsigned short int remainder;
for ( i = 0; i < 256; i++)
{
remainder = i << 7;
for (bit = 8; bit > 0; --bit)
{
if (remainder & 0x4000)
{
remainder = ((remainder << 1));
remainder = (remainder ^ CRC15_POLY);
}
else
{
remainder = ((remainder << 1));
}
}
pec15Table[i] = remainder&0xFFFF;
}
}
unsigned short int pec15 (unsigned char *data , int len)
{
unsigned int i, remainder,address;
remainder = 16;//PEC seed
for (i = 0; i < len; i++)
{
address = ((remainder >> 7) ^ data[i]) & 0xff;//calculate PEC table address
remainder = (remainder << 8 ) ^ pec15Table[address];
}
return (remainder*2);//The CRC15 has a 0 in the LSB so the final value must be multiplied by 2
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp1bnNpZ25lZCBzaG9ydCBpbnQgcGVjMTVUYWJsZVsyNTZdOwp1bnNpZ25lZCBzaG9ydCBpbnQgQ1JDMTVfUE9MWSA9IDB4NDU5OTsKdm9pZCBpbml0X1BFQzE1X1RhYmxlKCk7CnVuc2lnbmVkIHNob3J0IGludCBwZWMxNSAodW5zaWduZWQgY2hhciAqZGF0YSAsIGludCBsZW4pOwp1bnNpZ25lZCBjaGFyIFR4X2RhdGFbOF09ezB9Owp1bnNpZ25lZCBzaG9ydCBpbnQgcGVjOwoKCmludCBtYWluKHZvaWQpIAp7CglpbnQgaTsKCVR4X2RhdGFbMF0gPSAweEZGOwoJVHhfZGF0YVsxXSA9IDB4RkY7CglUeF9kYXRhWzJdID0gMHhGRjsKCVR4X2RhdGFbM10gPSAweEZGOwoJVHhfZGF0YVs0XSA9IDB4RkY7CglUeF9kYXRhWzVdID0gMHhGRjsKCQogICAgaW5pdF9QRUMxNV9UYWJsZSgpOwoJZm9yKGk9MDtpPDI1NjtpKyspCgl7CgkvKiBwcmludGYoIlx0JWQiLHBlYzE1VGFibGVbaV0pOyovCgl9CglwZWM9IHBlYzE1KCZUeF9kYXRhWzBdLDYpOwoJcHJpbnRmKCJcdCVkIixwZWMpOwoJcmV0dXJuIDA7Cn0KCgp2b2lkIGluaXRfUEVDMTVfVGFibGUoKQp7CmludCBpLGJpdCA7CnVuc2lnbmVkIHNob3J0IGludCByZW1haW5kZXI7CmZvciAoIGkgPSAwOyBpIDwgMjU2OyBpKyspCnsKCXJlbWFpbmRlciA9IGkgPDwgNzsKCglmb3IgKGJpdCA9IDg7IGJpdCA+IDA7IC0tYml0KQoJewoJCWlmIChyZW1haW5kZXIgJiAweDQwMDApCgkJewoJCQlyZW1haW5kZXIgPSAoKHJlbWFpbmRlciA8PCAxKSk7CgkJCXJlbWFpbmRlciA9IChyZW1haW5kZXIgXiBDUkMxNV9QT0xZKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmVtYWluZGVyID0gKChyZW1haW5kZXIgPDwgMSkpOwoJCX0KCX0KCglwZWMxNVRhYmxlW2ldID0gcmVtYWluZGVyJjB4RkZGRjsKCQp9Cn0KdW5zaWduZWQgc2hvcnQgaW50IHBlYzE1ICh1bnNpZ25lZCBjaGFyICpkYXRhICwgaW50IGxlbikKewoJdW5zaWduZWQgaW50IGksIHJlbWFpbmRlcixhZGRyZXNzOwoJcmVtYWluZGVyID0gMTY7Ly9QRUMgc2VlZAoJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQoJewoJCWFkZHJlc3MgPSAoKHJlbWFpbmRlciA+PiA3KSBeIGRhdGFbaV0pICYgMHhmZjsvL2NhbGN1bGF0ZSBQRUMgdGFibGUgYWRkcmVzcwoJCXJlbWFpbmRlciA9IChyZW1haW5kZXIgPDwgOCApIF4gcGVjMTVUYWJsZVthZGRyZXNzXTsKCX0KCXJldHVybiAocmVtYWluZGVyKjIpOy8vVGhlIENSQzE1IGhhcyBhIDAgaW4gdGhlIExTQiBzbyB0aGUgZmluYWwgdmFsdWUgbXVzdCBiZSBtdWx0aXBsaWVkIGJ5IDIKfQo=