冯海明, 王 波, 张 健, 陈 强, 李海海, 黄玉鹏
(中通客车控股股份有限公司,山东 聊城 252000)
整车控制器VCU是电动客车的核心零部件之一,其可以根据驾驶员的加速踏板、制动踏板和方向盘等信号实现整车的驱动控制,还可以进行制动能量回收及对各子系统进行故障诊断管理等[1-2]。在以TriCore1872微控制器作为载体设计VCU过程中,由于逻辑策略需要不断修改,因此需要进行反复的程序烧写及更新。一般升级过程中,开发人员需要通过携带串口线及频繁的上下电才能完成对整车控制器程序的下载及升级。刷写烧写过程比较繁琐,降低了程序升级的效率。因此,本文开发一种基于CAN在线程序刷写的方法,利用VCU现有的CAN通讯方式对其进行在线编程升级,通过开发BootLoader的程序引导与终端PC相结合,即可实现控制器程序在线更新。
BootLoader是VCU系统上电后应用程序执行前最早运行的一段引导代码程序[3-4]。其主要作用是硬件设备初始化及内存映射等。以某款自主开发的VCU为例,在进行CAN在线程序升级时,首先需要在线更新BootLoader,然后等待BootLoader进入下载模式,最后再通过CAN网络从上位机中下载应用程序。
基于英飞凌32位TC1872内核微控制器的VCU作为下位机,基于VS开发工具的PC为上位机。目标VCU是英飞凌汽车级单片机,时钟频率为180 MHz,具有3路完全独立的高速CAN驱动,支持CAN下载及在线调试模式。上位机PC与下位机的数据通讯选用USB CAN卡实现。
整个CAN在线刷写系统主要由VCU端、USB CAN卡、PC上位机3部分组成。其中,CAN卡实现PC上位机与VCU端之间的通信连接,用来传输指令与数据;PC上位机是基于VS工具的MFC框架进行开发。
VCU端系统上电或复位后,应用层程序在main函数中会周期性地调用底层can_prog_ack()函数。该函数主要用于内存地址的跳转、握手密钥的解析及密钥接收超时处理。当VCU解析到密钥报文数据域中第五个字节为0x38时,即进入在线程序升级模式;若不进行应用程序的升级,则跳转到0x0E00000处。在上位机发送BootLoader的长度后,VCU返回握手成功,在BootLoader升级完成后,VCU会立即返回该BootLoader的版本号,通过该版本号进行BootLoader升级是否成功的校验判据。BootLoader升级成功后,VCU发送请求用户代码信号,上位机接收到该信号后,开始下发应用程序代码长度。VCU接收到上位机下发应用程序代码长度数据帧后,调用Flash擦除函数进行扇区的擦除并返回相应的数据帧报文。擦除完毕后,PC上位机正式进入应用程序数据域的下发,VCU接收到数据帧后由CAN命令函数处理解析各个数据包,并将数据写入到相应的Flash扇区中,同时VCU会返回剩余扇区数,VCU每接收到32帧数据,就进行一次数据校验。直至最后接收全部数据后再进行应用程序数据总和的校验,校验结束无误后上位机会发送VCU重启指令,VCU接收到该PC下发的重启指令后,自动跳转执行新的应用程序。
2.2.1 HEX文件转Bin文件
在Tasking中经过编译生成的是HEX文件,PC端上位机主要为VCU提供加载该升级程序代码。HEX文件是ASCII的记录文本文件,在HEX文件中,每一行是一个HEX记录,包括数据长度域、地址域、记录类型域、数据域及校验和域[5-7]。上位机在发送应用程序时为了保证数据传输的准确性,需要按照地址高低顺序进行传输,但是HEX文件中数据记录并不是按照起始地址到终止地址的顺序进行排列的,由于每行数据都包含起始地址和数据长度,所以HEX文件中数据不需要按照地址顺序从低到高进行排列;而Bin文件中的数据则是严格按照地址顺序进行排列。因此,需要将HEX文件的内容转换成按地址顺序从低到高排列的二进制数据Bin文件[8-10]。
转换过程主要分为4步:第一,打开HEX文件后通过遍历整个HEX文件,找出起始地址和终止地址,然后根据终止地址和起始地址相减算出数据长度,用得到的数据长度开辟相应的数组进行内存的分配[11-12];第二,再次遍历整个HEX文件,计算每条数据记录中的起始地址与HEX文件起始地址的偏移量,按照偏移量将该条数据记录中的数据部分写入刚开辟的数组中;第三,遍历保存完的数组,判定是否与目标VCU程序相匹配;第四,将该数组写到文件中。
2.2.2 主从机通信协议
主从机数据传输与命令交互采用自定义的CAN通信协议,协议具体内容见表1。
表1 主从机通信协议
2.2.3 功能设计需求
PC端上位机界面的具体功能需求如下:
1) 设置CAN波特率、CAN通道、报文间隔发送周期。
2) 打开CAN设备并能正常接收CAN报文数据,能根据路径打开需要发送的HEX文件,并将文件自动转换成Bin文件,发送完成后发送重启VCU指令。
3) 数据通信相关信息显示在编辑框中,并实时显示程序更新状态。
4) 具备重刷及设备重启功能。
2.2.4 关键功能模块设计
1) 数据发送、校验。CAN报文的发送通过CAN卡提供的库函数实现。由于HEX文件的下发需要通过路径打开并进行读取和转换才能进行发送,所以报文数据的发送分为报文的填充和报文的发送。32位程序烧写,每发送32帧数据校验一次,全部发送完毕后再进行总和校验,由于VCU会返回剩余的扇区数,所以数据发送完后,程序会自动停止。
2) 数据的接收。CAN报文的接收通过接收数据线程,在线程中调用自定义的接收函数,该接收函数会校验接收ID并返回相应状态值。
3) 数据收发信息显示。数据发送、接收时会触发设定的data_show_add函数,在该函数中,数据会被加载及显示在编辑框中。
2.2.5 PC端上位机界面及发送流程
打开通过VS开发设计的PC端上位机软件后,在界面上选择相应的CAN通道及波特率,点击“连接”按钮,此时编辑框会显示设备开启成功信息,通过“文件路径”按钮加载生成HEX文件,然后会弹出是否刷写该HEX文件的提示框,点击“确定”按钮,开始进行BootLoader的烧写,烧写完后自动进行应用程序的烧写,烧写过程中,VCU会返回校验数据,确保传输数据的真实性与完整性。当全部应用程序下载完后,进度条会显示100%,VCU自动进入重启,编辑框显示程序刷写成功及当前程序版本,整个应用程序更新过程完成。
本文设计的基于CAN在线VCU程序升级系统在某8 m纯电动客车上进行实车验证。首先系统上电后用CAN卡设备连接VCU与PC上位机,然后上位机进行相关操作,经过约20 s完成对VCU程序的升级,升级后VCU自动重启,程序运行正常。
运行结果表明,该系统进行VCU程序升级时,整个过程快速稳定,更新升级后VCU程序运行正常。
本文设计的基于CAN总线的VCU程序升级系统实现了VCU程序升级的快速性、准确性及便捷性,提高了VCU程序更新效率。经实车验证,该系统擦除Flash过程稳定,CAN通信实时性高。该方法极大地方便了VCU程序的后期更新和维护。