纳入固件源码、屏幕组件、nand_xfer 工具和文档。忽略本机构建产物、sdkconfig,以及含本机路径的依赖锁。 Co-authored-by: Cursor <[email protected]>
55 lines
1.1 KiB
C
55 lines
1.1 KiB
C
#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;
|
|
}
|
|
|