#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; }