郭健忠,田潇寒,谢 斌,杜新宝,胡文龙
(1.武汉科技大学汽车与交通工程学院,湖北武汉 430065;2.武汉保华显示科技有限公司,湖北 武汉 430082)
CAN(Controller Area Network)总线作为目前唯一具有国际标准的现场总线,其以数据在通信过程中突出的可靠性、实时性和灵活性,被作为车载控制器之间的主要通信网络[1]。CAN 总线上的报文数据不仅记录了汽车的实时运行状态,而且可以反映出汽车行驶过程中的各种问题[2]。采集和使用好实车数据,可以给车辆检测、故障诊断与汽车相关产品开发等带来正面影响,其中完整的实车数据可为车辆检测与故障诊断提供全面客观的数据依据,同时运用完整的实车数据可以在开发过程中对车载电子嵌入式设备进行多工况模拟测试[3],模拟汽车真实运行环境,发现车载电子嵌入式设备开发设计中的不足,提出改进思路,形成分析-改进-分析的闭环设计过程[4]。针对目前CAN 总线数据记录仪在CAN 总线数据量大的应用场景下存在数据丢帧,所采集的数据内容无法为车辆检测与车载电子嵌入式开发提供完整可靠的数据支持,以及人工操作PC 搭配CAN 分析仪采集实车数据流程繁琐的问题[5-6],有必要设计一种可以完整采集总线实车数据、操作简单的CAN总线数据采集方案。
文中所设计开发的系统主要实现数据采集和数据存储两种功能[7]。
1)CAN 总线报文数据采集:车载设备产生的数据信息通过CAN 总线进行通信,设计的系统将采集监听到的总线数据信息。
2)采集数据固定格式存储:系统主控芯片将采集到的CAN 总线数据以既定格式写入Micro SD 卡中进行存储。
文中的CAN 总线数据采集系统以CAN 节点的形式加入车载CAN 总线中,并对总线中产生的CAN报文数据进行监听、采集与记录。当采集系统监听到总线上有CAN 报文数据时,自动触发系统中断,并将实时采集的数据暂存在无锁FIFO 队列中,队列依据数据量的多少自动调节队列大小,在保证总线数据存储无误的同时改变系统资源占用。系统控制单元将队列内的数据依次取出并将其以标准CANLog 格式存储到Micro SD 卡中。最终从Micro SD 卡中导出相应数据,为车载电子嵌入式开发、测试等提供实车数据支持。
无锁FIFO 队列作为一种受限制线性表,具有只允许在队列的前端进行删除操作,而在队列的后端进行插入操作的特殊性。也是因为此特性,最早进入队列的元素才能最先从队列中删除,即先进先出[8]。由于队列只有一端可以进行插入操作,故队列中的每一个元素都是按照先后顺序排列的。根据以上特点,无锁FIFO 队列在实际应用中常用于流量削峰、日志处理场等景中[9]。文中所设计的CAN 总线数据采集系统属于单生产者单消费者问题,不涉及多生产者多消费者情况,可避免多生产者多消费者队列中ABA 问题带来的不利影响[10]。
系统硬件主要由核心板和功能扩展板两部分组成,功能口展板搭载CAN 数据采集模块与数据存储模块。CAN 总线数据采集系统工作时作为CAN 节点接入总线中,对车辆CAN 总线上的电子设备进行监听并采集存储车辆在运行过程中所产生的数据信息。系统中的Micro SD 卡可随时取出,用于PC 端读取数据。系统硬件总体设计框图如图1 所示。
图1 系统硬件总体设计框图
逻辑控制单元作为整个系统的核心,控制协调着系统中各个模块之间的关系与系统运行的稳定。因此,选择合适的主控芯片至关重要。通过对比调研,针对该系统功能明确、所用外设资源少的特点,综合各种因素,最终选择STM32F103ZET6 芯片作为主控芯片,其性能可以保证逻辑程序的流畅性。该系列外设类型、数量丰富,具有良好的扩展能力。其中,CAN 接口是ST 公司为汽车领域应用专门增加的汽车总线接口,支持CAN2.0B 接口标准。
1)CAN 数据采集模块
主控设备采集到的CAN 信号通过外部CAN 收发器将电压差动信号转化为数字信号之后,将CAN报文以数字信号的形式存在到指定的邮箱内[11]。TJA1042 作为一款高速CAN 收发器,可为CAN 控制器提供差动发送与接收功能,最高传输输出达1 Mbit/s,完全符合ISO 11898-2 标准。
根据CAN 节点组成关系,CAN 数据采集单元电路设计如图2 所示。为保证通信过程中的信号稳定性,采用在电路中加上较小电容的共模电感L3来抑制干扰。电阻R42、R43、R342为CAN 总线在高速通信时提供一个阻抗以避免回拨干扰。
图2 CAN数据采集单元电路图
2)数据存储模块
由于CAN 总线上数据传输量大、传输速率快,在对接收到的CAN 总线数据进行存储时采用Micro SD 卡作为外部设存储设备,Micro SD 卡支持两种读写方式,即SPI 模式与SDIO 模式。在SPI 模式下,主从机之间只有一条数据线用于数据传输,其传输速率为1~2 MB/s。但SDIO 模式允许四线的高速数据传输,单线传输速率可达到2 MB/s。文中设计选择采用SDIO 模式四线高速数据传输方式[12]。
CAN 数据采集功能的实现需要完成对主控芯片内部CAN 控制器初始化、CAN 中断接收进行相应的程序设计。
1)CAN 控制器初始化
CAN 控制器初始化通过功能配置函数操作CAN控制器寄存器、CAN 邮箱寄存器、CAN 筛选器等三大类寄存器,对CAN 总线工作模式、波特率及滤波器等进行配置,为CAN 总线数据接收工作准备好环境。具体流程图如图3 所示。
图3 CAN控制器初始化流程图
由于CAN 总线网络上挂载的节点数量多、总线数据传输量大。为了保证数据在采集时不丢失,无关信息对采集产生干扰,在接收方面CAN 控制器具有两个三级FIFO 缓冲结构。此外,在CAN 控制器中包含时间触发机制,可以为采集到的数据提供时间戳信息。
2)CAN 接收中断处理
从CAN 总线上接收到的数据帧经过筛选器筛选,通过FIFO 触发接收中断进入中断函数,在中断服务中识别产生中断的FIFO,读取相应的数据,再将接收到的CAN 报文数据存入到已经初始化的数据结构体当中。
CAN 总线数据的存储功能主要基于FatFS 文件系统进行开发,与常规的裸机直接操作Micro SD 卡相比,利用FatFS 文件系统模块可以对Micro SD 的物理地址进行高效统一的管理,所存储的文件可以随时在PC 端使用。而裸机程序操作Micro SD 卡直接将数据写入物理内存,查找困难,电脑等其他设备也无法读取所存储的信息。
1)Micro SD 卡
Micro SD 卡与主控芯片之间的命令交互需要通过CMD 引脚实现。在对Micro SD 卡进行读写操作之前,需要对其进行初始化,完成各项参数配置。Micro SD 介入后,自动进入等待电压稳定需上电延时至少74 个时钟周期[13]。Micro SD 卡初始化完成之后,对其进行读写操作,将采集到的CAN 总线数据写入到Micro SD 卡中。
2)FatFS 文件系统移植
FatFS 文件系统在移植的过程中需要用到六个文件:diskio.c、dickio.h、ff.c、ff.h、integer.h 与ffconf.h[14],其中,integer.h 中定义了FatFS 所使用的各种数据类型;ffcinf.h 是关于FatFS 文件系统模块的相关配置;diskio.c 与dickio.h 包含了FatFS 所规定的标准函数接口;ff.c 与ff.h 为标准文件,为应用程序提供标准文件操作接口,使用时只需调用相关接口即可。在移植时,只需要根据具体需求更改diskio.c 与ffconf.h 两个文件。其移植主要分为以下三个步骤:
1)在integer.h 文件内根据需求对数据结构进行定义;
2)根据具体功能需求,通过ffconf.h 配置FatFS文件系统相关模块;
3)调用diskio.c 中六个函数接口,进行底层驱动编写,完成相关功能函数编写。
通过上述三步完成FatFS 文件系统移植。FatFS文件系统完成移植后,只需要根据具体需求调用相关函数即可实现相关功能。
在应用文中设计的系统时,CAN 数据报文最终以CANlog 格式存储,在采集、存储数据报文时,需要对报文信息进行逐条处理,广义上属于日志处理范畴[15-16]。同时,当CAN 总线上的报文数据量激增时,系统需具备处理大流量数据的能力。结合FIFO 队列自身特点与应用场景大数据量的特性,在设计开发时将FIFO 队列融入到数据采集、存储功能当中,并对其进行适应性改进,提出了无锁FIFO 队列。当总线数据量较小时,自适应地减小队列大小,以减少系统资源占用;当总线数据量激增时,则自适应地增加队列大小,以避免数据丢失。无锁FIFO 队列算法原理如图4 所示。
图4 无锁FIFO队列算法原理
系统采集到CAN 总线上产生的报文数据之后,触发硬件外部中断,报文数据作为队列元素临时存入到无锁FIFO 队列当中,完成入队操作,此过程通过系统硬件设备采集数据来激活系统软件功能。队列中被临时存入数据时,系统会自动将队列中临时存储的数据通过FatFs 文件系统以标准CANLog 格式写入到Micro SD 卡中,完成出队与存储操作。在入队、出队操作时,系统会根据数据量的大小自动调整队列大小,其数据存储流程如图5 所示。
图5 数据存储流程图
文中将对所开发的CAN 总线数据采集系统进行相应功能验证,主要以室内实验为主,以此对该系统进行初步功能验证。此方法也是设备研究开发过程中的主要测试方法,避免试车测试过程中繁琐的安装流程,提高开发效率。
在CAN 总线数据采集系统功能验证实验中,模拟发送不同ID 的实车数据报文,发送周期为100 ms,表2 为PC 端模拟发送数据,图6 为Micro SD 卡中读取数据。通过对比表2 与图6 中的报文主要信息可知,CAN 总线数据采集系统所存储的数据完全正确,且无数据丢失现象。
图6 存储数据读取
表2 实车模拟数据报文
通过在测试实验中加入对无锁FIFO 队列的功能验证,进一步证明无锁FIFO 队列可避免数据丢失问题。在所有实验条件不变的情况下,分别使用有、无锁FIFO 队列系统进行模拟实车数据采集,所采集的数据对比如图7 所示。以第一轮采集到所有模拟发送的不同ID 实车数据报文为例,使用无锁FIFO 队列的系统采集到全部ID 的报文,没有使用无锁FIFO队列的系统存在丢帧现象,说明CAN 总线数据采集系统具有一定可行性。
图7 存储数据对比
文中结合无锁FIFO 队列,针对CAN 总线数据量大的特点,设计开发了基于无锁FIFO 队列的CAN 总线数据采集系统。其具有以下优势:
1)系统运用无锁FIFO 队列算法,可根据CAN 总线上数据量的大小自适应地调整队列缓冲区的大小,可避免在实车数据采集过程中的丢帧现象,完成采集总线实车数据。
2)该系统无需人工跟车操作,实现脱离PC 端独立采集实车数据,简化数据采集流程。系统中搭载FatFs 文件系统,将总线数据以标准格式存储于Micro SD 卡,生成的文件具有一定通用性,可在PC端相关软件中直接读取。