一、CRC简介
随着汽车电动化与智能化的深入,车辆电子电气架构变得日益复杂,各控制节点之间的数据交换变得更为频繁且快速,此过程中为了确保车辆运行的安全可靠,数据交换过程的完整性则成为保障安全应用至关重要的手段之一,这其中,CRC校验方式便是其中一种较为常用且有效的技术实现手段。
CRC(Cyclic RedundancyCheck,循环冗余校验)是一种用于检测数据传输错误的校验算法,其是通过计算消息的校验码,并将该校验码附加到数据后面一起发送出去,当接收端节点接收到该数据后,将使用相同的算法重新计算校验码并与接收到的校验码进行比较,如果两者匹配,则认为数据传输成功,如果不匹配,则认为数据在传输过程中发生了错误,此时接收方可要求发送端重发数据或采取相关纠错措施,以此来,确保数据在传输过程中没有发生位错误。
二、CRC工作过程
在车载系统中,CRC校验可被用于确保从各传感器收集的数据在传输到控制节点时保持其完整无损。其过程如下:
当控制节点从相关传感器读取如电压、电流、温度等参数时,这些数值会按照协议要求被打包成一条或多条消息,每条消息都包含有多个数据字段以及源地址、目标地址等,如下示意:
图1报文信息
假设此时驱动电机的温度为60℃,那按照上述协议要求,则该条报文数据内容如下:
图2 报文数据内容
在数据打包完成后,会通过CRC算法并依据消息中的所有数据位选择一种多项式公式来计算出一个值,该值即校验码,会被附加到数据段末尾,以形成一个完整的消息,并将其进行传输。
当该消息到达接收节点时,接收端会再次应用相同的CRC算法来重新计算校验码,并与接收到的校验码进行对比,如果两个值相同,则表示数据在传输过程中没有发生错误,如果有差异,则说明数据可能已经损坏,此时接收端可以选择丢弃该报文并请求重新发送。
三、CAN总线应用的CRC
在车载应用中,根据通信协议和应用需求的差异,采用的CRC多项式也不尽相同。但基于CAN总线在车载中的广泛性,为了适应CAN硬件且满足其通信的高效性和可靠性,专门设计有一种特定的15位CRC多项式:x15+x14+1。其对校验码的计算方式,可简化如下:
上述函数接受一个字节数组data和数组的长度length作为输入参数,并返回计算的15位CRC值,在实际应用中,需要传递一个指向CAN数据帧的指针以及该帧的长度。但通常情况下,CAN总线的CRC计算是由集成在CAN芯片中的逻辑电路自动处理的,即此功能的实现由硬件自动完成,CAN芯片会在收发期间自动更新CRC寄存器,软件并不需要单独再去实现这部分内容。
通常我们需要做的是通信配置,即在初始化CAN模块时,确保CRC校验功能被正确开启,并根据硬件规格书、CAN规范等设置相关的寄存器、波特率、滤波器等,以确保CRC校验可按照预期的方式工作。
继续上述示例,当MCU准备发送消息时,它便会按照CAN消息结构构造一个消息帧,并填充数据域内容,然后CAN收发器会自动计算数据域的CRC校验码,并将该值插入到CRC域中。根据上述示例的数据内容及CRC算法(不需要手动完成),此时生成的CRC校验码为:0x93A7。
由此,该条CAN消息帧的完整内容包含如下:
起始域: SOF (隐式位,逻辑1)
标识符域: 0x270
RTR: 0 (数据帧)
IDE: 0 (标准帧)
DLC: 8
数据域: 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x00
CRC域: 0x93A7
ACK域: ACK Slot + ACKDelimiter
结束域: EOF (隐式位,逻辑1)
即:
图3 CAN消息帧完整内容
尽管在实际应用中,CRC计算和验证都是自动完成的,软件开发时不需要再去手动实现CRC校验逻辑。但针对错误检测与处理,当硬件检测到CRC错误时,软件需要检查这些标志位,以确定接收到的数据是否有效,同时根据CRC错误标志采取相应的措施。
如在发送数据时,软件需确保数据帧的构建是正确的:
在接收数据时,软件需检查CRC校验是否通过,从而决定如何处理接收到的这些数据:
另外,在系统调试和故障排查时,了解CRC原理对于提高排查效率等还是可以起到一定作用的。
来源:觉知汽车