关于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
计算步骤
- 初始化CRC寄存器为
0x38; - 对
[39-7]字段的每一位数据:- 提取CRC寄存器的最高位(位5);
- 将该最高位与当前数据位进行异或;
- 将CRC寄存器左移1位,仅保留低6位;
- 如果异或结果为1,将CRC寄存器与
0x19(多项式低6位)异或;
- 处理完所有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为例:
- 提取
[39-7]字段:(0xC270080001 >>7) & 0x1FFFFFFF = 0x184E0100; - 调用
l9963e_calculate_crc(0xC270080001)得到CRC值0x00; - 提取帧中的CRC:
(0xC270080001 >>1) &0x3F =0x00,与计算结果一致,验证通过。
其他捕获的帧均可通过此代码验证CRC正确性。
内容的提问来源于stack exchange,提问作者idem
相关产品推荐
相关产品推荐

