asialll
回答者
回答于 2026-10-23
SPI通信传输16位数据时,通过CRC(循环冗余校验)算法计算校验位,并将其附加在数据帧中一同传输。
计算与附加步骤
- 选择CRC多项式:确定使用的CRC-16标准多项式,常见的有CRC-16/CCITT(0x1021)、CRC-16/MODBUS(0x8005)等。收发双方必须使用相同的多项式和初始值。
- 计算CRC值:将16位待发送数据作为输入,按选定的多项式进行模2除法运算,得到16位的CRC校验码。
- 拼接数据帧:将16位原始数据与16位CRC校验码拼接为32位数据帧。常见格式为高16位是数据、低16位是CRC,或反之,需由通信协议定义。
- SPI发送:若SPI配置为16位模式,可分两次连续发送(先发数据,再发CRC);若配置为8位模式,则分四个字节依次发送。
- 接收端校验:接收端提取前16位数据,用相同算法重新计算CRC,并与收到的后16位CRC值比较。两者一致说明传输无误。
判断依据
- CRC多项式、初始值、输入输出是否反转、最终异或值等参数必须收发两端完全一致,否则校验必然失败。
- 校验不通过时应根据协议执行重传或报错处理。
适用条件
- 适用于对数据完整性要求较高的SPI通信场景,如传感器数据采集、存储器读写、工业控制总线等。
- 硬件SPI外设若自带CRC计算单元(如部分STM32系列),可直接配置寄存器实现,无需软件逐位计算。
常见误区
- 混淆校验和与CRC:简单的累加和(Checksum)检错能力弱于CRC,不能互相替代。
- 忽略字节序:大端与小端模式下数据的字节排列不同,会导致CRC计算结果不一致。
- 未统一初始值:不同的CRC-16变体要求的初始值不同(如0x0000或0xFFFF),未对齐会导致校验错误。
- SPI位数配置不当:发送32位帧时,若SPI仅配置为8位模式且未正确处理片选信号(CS)拉低时机,可能导致数据被截断或误判。