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

关于ST L9963E芯片6位CRC计算及帧字段[39-7]的技术问询

L9963E SPI通信CRC计算澄清与实现指南

一、[39-7]字段的明确含义

L9963E的40位SPI帧采用**高位优先(MSB)**编号规则:位39为帧的最高位,位0为最低位。手册中提到的[39-7]字段指的是从位39到位7的所有位,共33位(39-7+1=33),这部分是CRC的计算数据源。

剩余的7位中,位6到位1是6位CRC值(对应取值范围0x00~0x3F),位0为芯片保留位(不参与CRC计算)。这就解释了为何数据部分不是直觉中的34位——手册未单独说明保留位的存在,导致了误解。

二、CRC计算的具体实现

基于手册给出的参数,正确的计算流程如下:

  • 多项式:0b1011001(十六进制0x49),计算时仅使用其低6位0x19(最高位的1仅用于异或判断,左移后会溢出)
  • 初始种子:0b111000(十六进制0x38)
  • 数据处理顺序:高位优先(MSB先行),即从帧的位39开始,依次处理到位7

计算步骤

  1. 初始化CRC寄存器为0x38;
  2. 对[39-7]字段的每一位数据:
    • 提取CRC寄存器的最高位(位5);
    • 将该最高位与当前数据位进行异或;
    • 将CRC寄存器左移1位,仅保留低6位;
    • 如果异或结果为1,将CRC寄存器与0x19(多项式低6位)异或;
  3. 处理完所有33位数据后,CRC寄存器的值即为最终的6位CRC,对应帧的位6到位1。

代码实现(C语言)

#include <stdint.h>

// 计算L9963E的6位CRC
uint8_t l9963e_calculate_crc(uint64_t frame) {
    // 提取[39-7]字段:帧右移7位,保留33位(掩码0x1FFFFFFF)
    uint64_t data = (frame >> 7) & 0x1FFFFFFF;
    uint8_t crc = 0x38; // 初始种子0b111000
    const uint8_t poly_low6 = 0x19; // 多项式0b1011001的低6位

    // 从最高位到最低位处理33位数据
    for (int i = 32; i >= 0; i--) {
        uint8_t data_bit = (data >> i) & 1;
        uint8_t crc_msb = (crc >> 5) & 1;
        uint8_t xor = crc_msb ^ data_bit;

        crc = (crc << 1) & 0x3F; // 左移1位,仅保留6位CRC
        if (xor) {
            crc ^= poly_low6;
        }
    }

    return crc;
}

// 验证帧的CRC是否正确
uint8_t l9963e_verify_crc(uint64_t frame) {
    uint8_t calculated_crc = l9963e_calculate_crc(frame);
    // 提取帧中位6到位1的CRC值
    uint8_t frame_crc = (frame >> 1) & 0x3F;
    return (calculated_crc == frame_crc) ? 1 : 0;
}

三、验证示例

以捕获的帧0xC270080001为例:

  1. 提取[39-7]字段:(0xC270080001 >>7) & 0x1FFFFFFF = 0x184E0100;
  2. 调用l9963e_calculate_crc(0xC270080001)得到CRC值0x00;
  3. 提取帧中的CRC:(0xC270080001 >>1) &0x3F =0x00,与计算结果一致,验证通过。

其他捕获的帧均可通过此代码验证CRC正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:46:07