朱少辉,夏超英
(天津大学 电气与自动化工程学院,天津 300072)
基于CAN总线的ECU在线编程技术*
朱少辉,夏超英
(天津大学 电气与自动化工程学院,天津 300072)
针对已安装完成的车身ECU程序升级困难的问题,基于CAN总线的自定义协议,设计了一种ECU在线升级方案,并在Infineon XC2000系列单片机上具体实现。详细介绍了在线升级系统的软硬件组成、单片机Bootloader的设计方案,以及系统的工作过程。实验结果表明,该系统能够很好地完成ECU在线升级功能,并能有效解决ECU在线升级过程中的一些问题。
CAN总线;在线编程;引导加载程序; Infineon XC2000
随着IAP技术的出现以及Flash价格的降低,一般的电控单元(ECU)都具有IAP(In Application Programming)功能和较大的Flash空间,为实现ECU在线编程功能提供了必要条件[1]。
目前基于IAP技术的在线编程的方案有很多,采用的通信方式和具体实现方法也各不相同。参考文献[2]采用RS232总线 和YMODEM协议开发了用于智能终端的在线升级系统,但是RS232总线的传输速率有限。参考文献[3]采用LIN总线实现了适用于汽车ECU的在线升级系统,LIN总线除了传输速率有限以外,同时它只是一种辅助总线,并不是所有车身ECU都采用LIN接口。参考文献[1]、[4]采用基于CCP(CAN Calibration Protocol)协议的在线升级系统,兼具CAN总线传输速率快和CCP协议可扩展性好的优点。本文采用CAN总线,基于CCP原理自定义协议的在线升级系统,具有传输速度快的特点。自定义协议各命令基本沿用CCP协议,但内容做了改动,这样通过改动协议内容能够很好地适合特定环境的应用。同时在升级过程中加入升级请求标志位,能够很好地改进程序下载过程中命令延时等待、应用程序下载失败以后下次无法连接的问题。
IAP和Bootloader原理略——编者注。
在线编程系统硬件主要包含三个部分:带有下载上位机软件的PC机、USB-CAN接口卡和安装有Bootloader程序的ECU。上位机通过USB-CAN接口卡与ECU通信,并进行代码的升级。软件主要包含两个部分:上位机的Bootloader下载程序和下位机的Bootloader程序。
1.1 通信协议与上位机程序设计
1.1.1 通信协议的制定
系统通信协议的以CCP协议原理为基础,结合实际操作过程的需求来制定。CCP协议提供11个基本命令和17个可选命令,基本命令包括:CONNECT、GET_CCP_VERS ION、EXCHANGE_ID、SET_MTA、DNLOAD、UPLOAD、GET_DAQ_PTR、WRITE_DAQ、START_STOP、DISCONNECT。本协议采用其中CONNECT、DISCONNECT、CLEAR_MEMORY、PROGRAM、SET_MTA。命令内容根据实际需要自定义;消息应答信号有连接成功应答、编程准备就绪应答、页编程完成应答、编程完成应答、编程失败应答、SECTION擦除就绪应答、SECTION擦除完成应答等。本套自定义协议能够很好地应用在实际下载过程中。
1.1.2 PC端下载程序的组成
PC端的Bootloader下载程序主要功能是实现对目标文件的解析和与下位机软件通信。下载程序采用Visual C++ 6.0编写,主要分成目标文件加载与解析以及Flash编程两个模块。
(1) 目标文件的生成和解析
系统应用程序文件采用*.HEX格式文件,该文件是记录文本行的ASCII文本文件,每一行是一条记录,每条记录是16进制数组成的机械码或数据常量。记录格式:
: LL ADDR TT [DDD…] CC
其中,冒号是记录开始;LL表示数据长度,即[DDD…]的字节数;ADDR表示地址信息;TT表示记录的类型;[DDD…]表示数据内容;CC表示校验和。
利用Tasking开发环境,能够生成包含应用程序的*.HEX文件,文件中的记录类型只有数据记录、线性扩展地址记录和文件结束记录。通过上位机载入目标文件,逐条检索文件内容将带有地址信息的数据解析出来,并以CAN数据帧(8字节)的形式存放,每16帧数据组合成一个页,同时记录每个数据页的首地址。
(2) Flash编程模块
Flash编程模块实现与下位机的通信,主要包含命令的解析、CAN总线驱动、数据发送和状态显示等部分。CAN总线驱动采用广州周立功单片机发展有限公司的USB-CAN采集卡的驱动程序,加入提供的库函数,来实现对于CAN总线数据的发送和接收。上位机软件提供相关命令的按钮,下载过程中通过按动相应按钮来实现命令的发送。下载过程中如果接收到连接成功、编程完成或者编程失败等信号以后,显示相应状态。
1.1.3 PC端下载程序的运行流程
PC端程序运行以后,通过上位机界面上的“载入文件”按钮,将要升级程序HEX文件载入,点“解析按钮”,程序自动将HEX文件分成包含有效数据长度为128字节的页,同时将页首地址保存。根据已经制定好的协议,上位机将这些命令封装成CAN总线消息发送到下位机。编程过程中,上位机将所需要发送的程序页总数发送给下位机,然后从第一页开始发送,每一页发送完成以后,等待下位机发送页编程完成信号,完成以后继续发送下一页,直到所有程序页都发送完成,这时如果无错误,接收下位机编程完成应答消息,显示编程完成;否则显示编程失败。程序流程图如图 1所示。
图1 PC端下载程序流程图
1.2 Bootloader设计
Flash编程的机制主要有两种,分别是调用Flash擦写函数法和Flash kernel法[4]。Flash kernel法需要在进行软件升级时将Bootloader程序中 Flash擦写以及相关的初始化程序都下载到单片机RAM中,这对RAM资源的要求较高,对于单片机来说这是有困难的。采用Flash擦写函数法,只需要在升级程序时调用Flash擦写函数即可。对于某些单片机,在对Flash进行擦写时,加在Flash区的电压高于普通电压,会引起Flash区的操作不稳定,因此也需要将Flash擦写函数放在RAM中运行,这样采用Flash擦写函数能够有效的减少RAM区的占用。Infineon XC2000单片机支持同时对不同页的读/写操作,不会出现Flash擦写操作不稳定的问题,因此本设计采用Flash擦写函数法。
1.2.1 Flash空间代码分布
本设计中ECU采用XC2785A单片机,其片上集成32 KB的PSRAM和832 KB的Flash(0xC00000~0xCCFFFF)用于代码存储。Flash阵列由4个块组成,分别是F0(256 KB,0xC00000~0xC3FFFF)、F1(256 KB,0xC40000~0xC7FFFF)、F2(256 KB,0xC80000~0xCBFFFF)、F3(64 KB,0xCC0000~0xCCFFFF)。每一个Flash块由若干个大小为4 KB的扇区组成,而每一个扇区可分为32个页(128字节),可对每个页单独进行擦除和编程操作。Flash区段的最开始存放程序的中断向量表,0xC01000~0xC0DFFF区段存放Bootloader代码,0xC0E000~0xC0EFFF区段中的最开始那个页存放升级标志, 0xC0F000~0xC0FFFF区段为单片机保留区段,0xC10000~0xCCFFFF段存放应用程序,代码空间分布如图2所示。
图2 Flash空间代码分布示意图
1.2.2 Bootloader程序流程
复位中断向量的出口地址是0xC01000,因此单片机上电启动或者软件重启以后,首先跳转到STARTUP.C,通过判断升级标志是否置位来进行跳转。若置位表示有升级请求,则进行Bootloader的初始化,然后执行主函数,升级完成以后擦除标志位;若无升级请求则跳转到用户程序区执行用户程序。用户程序更新时,需要同时更新中断向量,这样保证用户程序能够正常使用中断功能。
[1]中采用的方法是在用户程序运行时,接受到连接命令,则单片机跳转到Bootloader程序执行升级流程,但是如果升级过程中出现错误,用户程序升级未完成,则下一次上电系统将无法运行。参考文献[4]中,采用上电进入Bootloader之前发送握手信号,等待上位机回复,这样每次上电都要先进行Bootloader的初始化,并且等待这种方式不能很好地保证和上位机连接。本文采用增加升级状态标志位的方法,用户程序在运行时,如有升级请求则置状态标志位,并软件重启。重启以后,单片机先检测状态标志位,有升级请求则进入Bootloader进行软件升级,若升级过程中出现错误导致升级未完成的话,升级状态标志位将不会清除,单片机重启以后仍然进去Bootloader,直接操作上位机上的编程按钮即可进行程序升级操作。这种方法能够有效解决升级过程中出现失败以及握手等待的问题,下位机软件流程如图 3所示。
图3 下位机软件流程图
1.3 在线编程系统工作流程
图4 系统工作过程
系统连接完成以后,通过上位机载入需要更新的应用程序文件,点击“CONNECT”按钮,在线编程系统启动,系统工作过程如图 4所示。上位机界面中显示连接成功,则可进行下一步操作。点击擦除按钮,上位机发送擦除指令,下位机擦除相应Flash区域以后发送给上位机应答信号。上位机给下位机发送编程命令的同时,发送给下位机需要编程的页总数。下位机在接收到页编程地址以后,连续接收上位机发送过来的16帧数据(一页128字节),然后擦除相应区域,并将这一页数据写入相应的页,页编程完成以后向上位机发送页编程完成应答,接着接收上位机发送过来的下一页数据,当所有页编程完成以后向上位机发送编程完成应答信号。此时断开连接,ECU将会软件重启。若编程过程中有任一页编程失败,上位机则显示编程失败,断开连接以后ECU重启,仍然进入Bootloader程序,然后直接点击编程即可。
图5 目标HEX文件
在线升级系统采用PC机(安装有上位机软件),连接广州周立功单片机发展有限公司的USB-CAN采集卡,ECU的CPU采用Infineon XC2785A单片机,系统连接完成以后进行升级测试。本文设计的在线编程方案测试结果如下:图 5为待更新程序的HEX文件(通过Tasking环境生成),其中有下划线的位HEX文件记录中的数据记录,起始地址为0xC11000;图6为程序下载到Flash以后的数据,通过Tasking软件的Debug状态,来查看Flash地址为0xC11000的数据。通过对比两幅图片,发现程序数据正确下载到了相应的Flash区域。在下载过程中,通过错误操作制造在线编程失败现象,然后断开连接,ECU重启以后仍然进入Bootloader程序,直接在上位机界面上点击“Program”,能够完成在线升级。实验结果表明,所设计的基于CAN总线的在线升级系统能够实现代码在线下载的功能,并且能够有效改善升级过程中下载失败的问题。
图6 Flash中的数据
本文提出的基于CAN总线的ECU在线升级系统设计方案,切实可行,并已在Infineon XC2785A单片机上完成实际测试。Infineon XC2000单片机具有相同的内核,因此此方案将对这一系列单片机的Bootloader设计具有指导意义。同时采用升级标志位的方法,对于单片机IAP功能的实现提供一个有益的参考。
参考文献
[1] 蒋建春,陈红霞,郑太雄.基于CCP的ECU在线编程技术的实现[J].计算机工程,2011, 37(5):241-243.
[2] 江晓梅,李祥和.基于ARM的IAP在线及远程升级技术 [J].计算机应用,2008,28(2):519-521.
[3] 韩江洪,常安云.车身控制系统在线编程技术的研究与实现[C]//全国计算机技术与应用学术会议论文集.宁波:[出版者不详],2008.
[4] 张艳,鲍可进.整车控制器Bootloader的设计与实现 [J].计算机工程,2011,37(12):233-235.
[5] 刘矗,罗峰.基于飞思卡尔微控制器的CAN Bootloader的实现与应用[J].苏州大学学报:工学版,2010,30(2):57-61.
[6] Infineon Technologies.XC2000 Derivatives User’s Manual,2008.
朱少辉(硕士研究生),主要研究领域为纯电动汽车整车控制器开发、电机控制器开发;夏超英(教授),主要研究领域为电力电子技术与装置、控制理论与应用、纯电动汽车和混合动力汽车、交流驱动控制系统与技术。
Zhu Shaohui, Xia Chaoying
( Electrical Engineering and Automation School, Tianjin University, Tianjin 300072, China)
Focusing on the problem of installed Body ECU program updating, a design of ECU program updating based on self-defined CAN protocol is realized on Infineon XC2000 series MCU. Then the hardware and software composition of program updating system, approach of MCU Bootloader, and working process of the system are introduce. The experimental results show that the system can achieve the function of program updating online and effectively solve some problems in the process of ECU online updating.
CAN bus; online programming; Bootloader; Infineon XC2000
TP23
A
珍
2013-08-04)