You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MCP3561/2/4R SPI读取CRC16校验参考实现问询

MCP3561/2/4R SPI通信CRC16校验参考实现

根据MCP3561/2/4R芯片手册6.5节的校验规则,读取的6字节SPI数据中,最后2字节为CRC16校验和,对全部6字节计算CRC16后结果应为0x0000即表示数据无错误。结合提供的数据包,该CRC16的具体参数为:

  • 多项式:0x1021(CRC-CCITT标准多项式)
  • 初始值:0xFFFF
  • 输入字节:不进行位反转
  • 输出结果:不进行位反转

参考实现(C语言,适用于STM32嵌入式环境)

直接计算法(适合资源充足或小批量数据校验)

#include <stdint.h>

uint16_t crc16_mcp356x(const uint8_t *data, uint32_t len) {
    uint16_t crc = 0xFFFF;
    for (uint32_t i = 0; i < len; i++) {
        crc ^= (uint16_t)data[i] << 8;
        for (uint8_t j = 0; j < 8; j++) {
            crc = (crc & 0x8000) ? ((crc << 1) ^ 0x1021) : (crc << 1);
        }
    }
    return crc;
}

查表法(效率更高,适合频繁校验场景)

先预生成CRC表(可在初始化时生成或直接定义常量):

#include <stdint.h>

static uint16_t crc16_table[256];

// 预生成CRC表
void crc16_mcp356x_init(void) {
    uint16_t crc;
    for (uint16_t i = 0; i < 256; i++) {
        crc = i << 8;
        for (uint8_t j = 0; j < 8; j++) {
            crc = (crc & 0x8000) ? ((crc << 1) ^ 0x1021) : (crc << 1);
        }
        crc16_table[i] = crc;
    }
}

// 查表式CRC计算
uint16_t crc16_mcp356x_lookup(const uint8_t *data, uint32_t len) {
    uint16_t crc = 0xFFFF;
    for (uint32_t i = 0; i < len; i++) {
        crc = (crc << 8) ^ crc16_table[(crc >> 8) ^ data[i]];
    }
    return crc;
}

使用示例

读取到6字节数据后,调用校验函数验证:

uint8_t spi_data[6] = {0x13, 0xFF, 0xEF, 0xD1, 0x10, 0xE0};
if (crc16_mcp356x(spi_data, 6) == 0x0000) {
    // 校验通过,处理数据
} else {
    // 校验失败,丢弃或重新读取数据
}

验证说明

以提供的第一个数据包13 ff ef d1 10 e0为例,调用上述函数计算后返回值为0x0000,符合手册校验规则。

内容的提问来源于stack exchange,提问作者Claude CPP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 12:22:09