E015.D.011-FXLS90230/Drivers/BSP/crc.c

134 lines
4.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "main.h"
#include "CRC.h"
//======================CRC8计算===============================================
//CRC表数据表结束共256个字节
const unsigned char CRC8_TABLE[256]={
0X00,0X5E,0XBC,0XE2,0X61,0X3F,0XDD,0X83,
0XC2,0X9C,0X7E,0X20,0XA3,0XFD,0X1F,0X41,
0X9D,0XC3,0X21,0X7F,0XFC,0XA2,0X40,0X1E,
0X5F,0X01,0XE3,0XBD,0X3E,0X60,0X82,0XDC,
0X23,0X07,0X9F,0XC1,0X42,0X1C,0XFE,0XA0,
0XE1,0XBF,0X5D,0X03,0X80,0XDE,0X3C,0X62,
0XBE,0XE0,0X02,0X5C,0XDF,0X81,0X63,0X3D,
0X7C,0X22,0XC0,0X9E,0X1D,0X43,0XA1,0XFF,
0X46,0X18,0XFA,0XA4,0X27,0X79,0X9B,0XC5,
0X84,0XDA,0X38,0X66,0XE5,0XBB,0X59,0X07,
0XDB,0X85,0X67,0X39,0XBA,0XE4,0X06,0X58,
0X19,0X47,0XA5,0XFB,0X78,0X26,0XC4,0X9A,
0X65,0X3B,0XD9,0X87,0X04,0X5A,0XB8,0XE6,
0XA7,0XF9,0X1B,0X45,0XC6,0X98,0X7A,0X24,
0XF8,0XA6,0X44,0X1A,0X99,0XC7,0X25,0X7B,
0X3A,0X64,0X86,0XD8,0X5B,0X05,0XE7,0XB9,
0X8C,0XD2,0X30,0X6E,0XED,0XB3,0X51,0X0F,
0X4E,0X10,0XF2,0XAC,0X2F,0X71,0X93,0XCD,
0X11,0X4F,0XAD,0XF3,0X70,0X2E,0XCC,0X92,
0XD3,0X8D,0X6F,0X31,0XB2,0XEC,0X0E,0X50,
0XAF,0XF1,0X13,0X4D,0XCE,0X90,0X72,0X2C,
0X6D,0X33,0XD1,0X8F,0X0C,0X52,0XB0,0XEE,
0X32,0X6C,0X8E,0XD0,0X53,0X0D,0XEF,0XB1,
0XF0,0XAE,0X4C,0X12,0X91,0XCF,0X2D,0X73,
0XCA,0X94,0X76,0X28,0XAB,0XF5,0X17,0X49,
0X08,0X56,0XB4,0XEA,0X69,0X37,0XD5,0X8B,
0X57,0X09,0XEB,0XB5,0X36,0X68,0X8A,0XD4,
0X95,0XCB,0X29,0X77,0XF4,0XAA,0X48,0X16,
0XE9,0XB7,0X55,0X0B,0X88,0XD6,0X34,0X6A,
0X2B,0X75,0X97,0XC9,0X4A,0X14,0XF6,0XA8,
0X74,0X2A,0XC8,0X96,0X15,0X4B,0XA9,0XF7,
0XB6,0XE8,0X0A,0X54,0XD7,0X89,0X6B,0X35,
};
/*unsigned char data_crc8(volatile unsigned char *pSource, unsigned char NUM)
{
unsigned char table_data = 0, CRC_result = 0;
for( unsigned char i = 0; i < NUM; i ++ )
{
CRC_result ^= *pSource++;
table_data = CRC8_TABLE[CRC_result];
CRC_result += table_data;
}
return CRC_result;
}*/
unsigned char data_crc8(volatile unsigned char *pSource, uint16_t NUM)
{
unsigned char table_data = 0, CRC_result = 0;
uint16_t i;
for(i = 0; i < NUM; i ++ )
{
CRC_result ^= *pSource++;
table_data = CRC8_TABLE[CRC_result];
CRC_result += table_data;
}
return CRC_result;
}
const uint16_t crc16tab[256] = {
0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
};
/*输入需校验字符data,
lastResult上次crc交验结果
*/
uint16_t CRC16(unsigned char data, uint16_t lastResult)
{
return ((uint16_t)((lastResult >> 8) ^ crc16tab[ (lastResult ^ data) & 0xFF ]));
}
/*输入字符串pL_string和长度L_LEN
lastCRCresult:表示上次字符串校验结果,
如果当前校验是重新开始校验则填0;
如果当前校验是上次校验继续则填入上次校验结果.
返回CRC校验值*/
uint16_t CRC16_data(unsigned char *pL_string, uint16_t L_LEN)
{
uint16_t result = 0;
uint16_t I;
for(I = 0; I < L_LEN; I ++ )
{
result = CRC16(pL_string[I], result);
}
return result;
}