Files
CHJ/user/Utility/CRC.c
2026-03-20 21:19:04 +08:00

138 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/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;
}