Files
P4-USB-transfer/main/ALGORITHM/crc.c
T

55 lines
1.1 KiB
C
Raw Normal View History

2026-10-13 21:54:50 +08:00
#include "crc.h"
#include "config.h"
// 蓝牙标准CRC16-CCITT多项式
#define CRC16_CCITT_POLY 0x1021
// 增量式更新CRC(核心函数)
uint16_t crc16_ccitt_update(uint16_t crc_prev, uint8_t data)
{
// 将当前字节与CRC高8位异或
crc_prev ^= (uint16_t)data << 8;
// 逐位处理8个bit
for (uint8_t i = 0; i < 8; i++)
{
// 判断最高位是否为1
if (crc_prev & 0x8000)
{
// 左移1位后异或多项式
crc_prev = (crc_prev << 1) ^ CRC16_CCITT_POLY;
}
else
{
// 仅左移1位
crc_prev <<= 1;
}
}
return crc_prev;
}
// 完整数据CRC计算
uint16_t crc16_ccitt_calculate(const uint8_t *data, size_t length)
{
// 入参校验:空指针/长度0直接返回初始值
if (data == NULL || length == 0)
{
return 0xFFFF;
}
// 初始化CRC为蓝牙标准初始值
uint16_t crc = 0xFFFF;
// 遍历所有字节计算
for (size_t i = 0; i < length; i++)
{
crc = crc16_ccitt_update(crc, data[i]);
}
// 返回最终CRC值(无反转、无异或)
return crc;
}