#define MSG_CRC_INIT 0xFFFF
#define MSG_CCITT_CRC_POLY 0x1021
void CRC_calcCrc8(uint16 *crcReg, uint16 poly, uint16 u8Data)
{
    uint16 i;
    uint16 xorFlag;
    uint16 bit;
    uint16 dcdBitMask = 0x80;
    for (i = 0; i < 8; i++)
    {
        xorFlag = *crcReg & 0x8000;
        *crcReg <<= 1;
        bit = ((u8Data & dcdBitMask) == dcdBitMask);
        *crcReg |= bit;
        if (xorFlag)
        {
            *crcReg = *crcReg ^ poly;
        }
        dcdBitMask >>= 1;
    }
}
uint16 CalcCRC(uint8 *msgbuf, uint8 msglen)
{
    uint16 calcCrc = MSG_CRC_INIT;
    uint8 i;
    for (i = 1; i < msglen; ++i)
        CRC_calcCrc8(&calcCrc, MSG_CCITT_CRC_POLY, msgbuf[i]);
    return calcCrc;
}