/*
 * @Description: 工具模块-crc校验子模块
 * @Author: yangsw
 * @Date: 2021-05-24 16:12:07
 * @LastEditTime: 2022-06-11 10:39:22
 * @LastEditors: yangsw
 * @Reference: 
 */
#include "util_crc.h"

static const unsigned short wCRCTalbeAbs[]={ 0x0000,0xCC01,0xD801,0x1400,0xF001,0x3C00,0x2800,0xE401,0xA001, 0x6C00,0x7800,
0xB401,0x5000,0x9C01,0x8801,0x4400 };

/**
 * @brief: CRC16-MODBUS
 * @return {short} CRC16结果
 * @note: 
 * @see: 
 * @param {unsigned char} *data 待计算数据
 * @param {unsigned short} len 待计算数据长度
 */
unsigned short Util_Crc16(unsigned char *data,unsigned short len){ 
    unsigned short wCRC=0xFFFF; 
    unsigned short i; 
    unsigned char chChar; 
    for(i = 0;i<len;i++){ 
        chChar = *data++; 
        wCRC= wCRCTalbeAbs[(chChar^wCRC)&15]^(wCRC>>4); 
        wCRC= wCRCTalbeAbs[((chChar>>4)^wCRC)&15]^(wCRC>>4); 
    }
    return wCRC; 
}

/**
 * @brief: CRC16-MODBUS-连续
 * @return {short} CRC16结果
 * @note: 数据太大时，用此函数分段计算CRC16
 * @see: 
 * @param {unsigned short} CRC 上一次CRC16结果
 * @param {unsigned char} *data 待计算数据
 * @param {unsigned short} len 待计算数据长度
 */
unsigned short Util_Crc16_Cut(unsigned short crc,unsigned char *data,unsigned short len){ 
    unsigned short wCRC=crc; 
    unsigned short i; 
    unsigned char chChar; 
    for(i = 0;i<len;i++){ 
        chChar = *data++; 
        wCRC= wCRCTalbeAbs[(chChar^wCRC)&15]^(wCRC>>4); 
        wCRC= wCRCTalbeAbs[((chChar>>4)^wCRC)&15]^(wCRC>>4); 
    }
    return wCRC; 
}