138 lines
4.7 KiB
C
138 lines
4.7 KiB
C
#include "../main/SystemInclude.h"
|
||
|
||
const u8 CRC_TABLE[]={
|
||
0x000,0x007,0x00E,0x009,0x01C,0x01B,0x012,0x015,0x038,0x03F,0x036,0x031,0x024,0x023,0x02A,0x02D,
|
||
0x070,0x077,0x07E,0x079,0x06C,0x06B,0x062,0x065,0x048,0x04F,0x046,0x041,0x054,0x053,0x05A,0x05D,
|
||
0x0E0,0x0E7,0x0EE,0x0E9,0x0FC,0x0FB,0x0F2,0x0F5,0x0D8,0x0DF,0x0D6,0x0D1,0x0C4,0x0C3,0x0CA,0x0CD,
|
||
0x090,0x097,0x09E,0x099,0x08C,0x08B,0x082,0x085,0x0A8,0x0AF,0x0A6,0x0A1,0x0B4,0x0B3,0x0BA,0x0BD,
|
||
0x0C7,0x0C0,0x0C9,0x0CE,0x0DB,0x0DC,0x0D5,0x0D2,0x0FF,0x0F8,0x0F1,0x0F6,0x0E3,0x0E4,0x0ED,0x0EA,
|
||
0x0B7,0x0B0,0x0B9,0x0BE,0x0AB,0x0AC,0x0A5,0x0A2,0x08F,0x088,0x081,0x086,0x093,0x094,0x09D,0x09A,
|
||
0x027,0x020,0x029,0x02E,0x03B,0x03C,0x035,0x032,0x01F,0x018,0x011,0x016,0x003,0x004,0x00D,0x00A,
|
||
0x057,0x050,0x059,0x05E,0x04B,0x04C,0x045,0x042,0x06F,0x068,0x061,0x066,0x073,0x074,0x07D,0x07A,
|
||
0x089,0x08E,0x087,0x080,0x095,0x092,0x09B,0x09C,0x0B1,0x0B6,0x0BF,0x0B8,0x0AD,0x0AA,0x0A3,0x0A4,
|
||
0x0F9,0x0FE,0x0F7,0x0F0,0x0E5,0x0E2,0x0EB,0x0EC,0x0C1,0x0C6,0x0CF,0x0C8,0x0DD,0x0DA,0x0D3,0x0D4,
|
||
0x069,0x06E,0x067,0x060,0x075,0x072,0x07B,0x07C,0x051,0x056,0x05F,0x058,0x04D,0x04A,0x043,0x044,
|
||
0x019,0x01E,0x017,0x010,0x005,0x002,0x00B,0x00C,0x021,0x026,0x02F,0x028,0x03D,0x03A,0x033,0x034,
|
||
0x04E,0x049,0x040,0x047,0x052,0x055,0x05C,0x05B,0x076,0x071,0x078,0x07F,0x06A,0x06D,0x064,0x063,
|
||
0x03E,0x039,0x030,0x037,0x022,0x025,0x02C,0x02B,0x006,0x001,0x008,0x00F,0x01A,0x01D,0x014,0x013,
|
||
0x0AE,0x0A9,0x0A0,0x0A7,0x0B2,0x0B5,0x0BC,0x0BB,0x096,0x091,0x098,0x09F,0x08A,0x08D,0x084,0x083,
|
||
0x0DE,0x0D9,0x0D0,0x0D7,0x0C2,0x0C5,0x0CC,0x0CB,0x0E6,0x0E1,0x0E8,0x0EF,0x0FA,0x0FD,0x0F4,0x0F3 };
|
||
//;---------------------------------------------------------------------------------------------
|
||
//;8位CRC校验程序
|
||
//;dataLen:校验字节数,dataPoint:待校验数据起始地址(LSB)
|
||
//;CRC_CODE:CRC校验码
|
||
//;---------------------------------------------------------------------------------------------
|
||
/******************************************************************************/
|
||
u8 CRC8(u8 *ucDptr, u8 ucLen)
|
||
{
|
||
u8 ucIndex; // CRC8校验表格索引
|
||
u8 ucCRC8 = 0; // CRC8字节初始化
|
||
|
||
//进行CRC8位校验
|
||
while(ucLen--)
|
||
{
|
||
ucIndex = ucCRC8 ^ (*ucDptr++);
|
||
ucCRC8 = CRC_TABLE[ucIndex];
|
||
}
|
||
|
||
// 返回CRC8校验数据
|
||
return (~ucCRC8);
|
||
}
|
||
|
||
|
||
/******************************************************************************/
|
||
u16 SlowCRC16(u16 sum, u32 codeAdr, u16 Len) //获取CRC
|
||
{
|
||
// while(Len--)
|
||
// {
|
||
// u16 I;
|
||
//
|
||
// u8 CByte = __data20_read_char(codeAdr++);
|
||
//
|
||
// for(I = 0; I<8; ++I)
|
||
// {
|
||
// u32 osum = sum;
|
||
// sum <<= 1;
|
||
// if(CByte & 0x80) sum |= 1;
|
||
// if(osum & 0x8000) sum ^= CRC16_POLY;
|
||
// CByte <<= 1;
|
||
// }
|
||
//
|
||
// Clear_WDT();
|
||
// }
|
||
|
||
// while(Len--)
|
||
// {
|
||
// sum = sum ^ ((u16)__data20_read_char(codeAdr++) << 8u);
|
||
// for(u16 I = 0u; I < 8u; I++)
|
||
// {
|
||
// if((sum & 0x8000u) == 0x8000)
|
||
// {
|
||
// sum = (sum << 1u) ^ CRC16_POLY;
|
||
// }
|
||
// else
|
||
// {
|
||
// sum <<= 1u;
|
||
// }
|
||
// }
|
||
//
|
||
// // Clear_WDT();
|
||
// }
|
||
|
||
return sum;
|
||
}
|
||
|
||
/******************************************************************************/
|
||
u8 CRC8_Talbe_I2CWord(u16 Data)
|
||
{
|
||
u8 crc8 = 0;
|
||
u8 Temp;
|
||
TypeWord wtData;
|
||
|
||
wtData.Word = Data;
|
||
|
||
Temp = crc8^wtData.Byte[1];
|
||
crc8 = CRC_TABLE[Temp];
|
||
Temp = crc8^wtData.Byte[0];
|
||
crc8 = CRC_TABLE[Temp];
|
||
|
||
return crc8;
|
||
}
|
||
|
||
/******************************************************************************/
|
||
u8 I2CWordCrc(u8 crcH, u8 crcL)
|
||
{
|
||
u8 crc8 = 0;
|
||
|
||
crc8 = crc8 ^ crcH;
|
||
crc8 = CRC_TABLE[ crc8 ];
|
||
crc8 = crc8 ^ crcL;
|
||
crc8 = CRC_TABLE[ crc8 ];
|
||
|
||
return crc8;
|
||
}
|
||
|
||
/******************************************************************************/
|
||
void CodeCheckCRC(void)
|
||
{
|
||
// u16 sumAdr;
|
||
// extern const u16 __checksum;
|
||
//
|
||
// // Check update program code
|
||
// softCRCCode = __checksum;
|
||
//
|
||
// // 获取 CHECKSUM 地址
|
||
// // 校验第一段代码区
|
||
// sumAdr = (u16)&__checksum; // 获取 CHECKSUM 地址
|
||
// CodeCRC = SlowCRC16(CRC16_INIT_VAL, (u32)APP_CODE1_START, (u16)(sumAdr-APP_CODE1_START));
|
||
// sumAdr += 2;
|
||
// CodeCRC = SlowCRC16(CodeCRC, (u32)sumAdr, (u16)(APP_CODE1_END-sumAdr+1));
|
||
//
|
||
// // BootLoader区以0代替
|
||
// // 校验第二段代码区
|
||
// CodeCRC = SlowCRC16(CodeCRC, (u32)APP_CODE2_START, (u16)(APP_CODE2_END-APP_CODE2_START+1));
|
||
// // 返回CHECKSUM
|
||
// //CodeCRC = SlowCRC16(CodeCRC, (u32)&area, 2);
|
||
//
|
||
// CodeCRC = (CodeCRC == __checksum) ? 0 : 0xAA55;
|
||
} |