最近在开发一款新的芯片,涉及到crc8数据校验算法部分,现对此算法记录如下
- crc8参考网站
crc8
2.C语言实现代码如下
cpp
#include <stdio.h>
#include <stdint.h>
#define CRC8_POLY 0x39 // 多项式值
#define CRC8_INIT 0x00 // 初始值
#define CRC8_OR 0x00 // 结果异或值
#define REFIN true // 输入数据字节反转
#define REFOUT true // 输出结果字节反转
// 字节反转函数(8位)
uint8_t reverse_byte(uint8_t data) {
uint8_t result = 0;
for (int i = 0; i < 8; i++) {
result <<= 1;
result |= (data & 0x01);
data >>= 1;
}
return result;
}
uint8_t crc8_cal(const uint8_t* data, uint32_t length) {
uint8_t crc = CRC8_INIT;
uint8_t byte_data;
for (uint32_t i = 0; i < length; i++) {
// 根据RefIn参数决定是否反转输入字节
if (REFIN) {
byte_data = reverse_byte(data[i]);
}
else {
byte_data = data[i];
}
crc ^= byte_data;
// 处理8位数据
for (int j = 0; j < 8; j++) {
if (crc & 0x80) {
crc = (crc << 1) ^ CRC8_POLY;
}
else {
crc = crc << 1;
}
}
}
// 根据RefOut参数决定是否反转输出结果
if (REFOUT) {
crc = reverse_byte(crc );
}
//最终异或
crc ^= CRC8_OR;
return crc;
}
/**
* 测试函数 - 验证算法正确性
* 测试数据: 0xB4, 0x3C, 0xB5, 0x03, 0x56
* 预期结果:
*/
int main()
{
uint8_t result = 0;
uint8_t test_data[] = { 0xB4, 0x3C, 0xB5, 0x03, 0x56 };
uint16_t data_len = sizeof(test_data) / sizeof(test_data[0]);
printf("测试数据: ");
for (int i = 0; i < data_len; i++) {
printf("%02X ", test_data[i]);
}
printf("\n");
result = crc8_cal(test_data, data_len);
printf("crc8_bluetooth_calculate 计算结果: 0x%02X\n", result);
return 0;
}
3.可以结合网站上的计算和算法进行验证