有所追求
分类:
2009-03-26 10:43:25
在汽车故障诊断领域,针对诊断设备和汽车ECU之间的数据交换,各大汽车公司几乎都制订了相关的标准和协议。其中,国外汽车厂商,包括大众、通用、奔驰、戴姆勒-克莱斯勒、JEEP、三菱、道奇等广泛使用的一种车载诊断协议标准是KWP2000(Key Word Protocol 2000)。该协议实现了较为完整的车载诊断服务,并且满足OBDII诊断要求。
LIN总线(Local Interconnection Network)是一种单线车载网络,采用类似于标准串口的通讯格式,由于其协议简单,通信可靠性好,实现成本低,近年来得到了迅速的发展。
ECU的在线编程指ECU处于工作状态时通过网络通信更新其中的应用程序,从而实现改善控制器性能、提高安全性、改善排放、改善燃油经济性、提高用户满意度等目的,在设计和试制阶段,该功能的实现为程序的更新提供极大的方便。
与传统的一对一的在线编程方式不同,由于KWP2000在网络上传输,必须考虑其它控制器的反应,必须对目标控制器作出正确的识别,必须保证数据传输的完整性等等。基于KWP2000协议ECU在线编程包括以下步骤:
1) 切换到扩展诊断状态:该步骤用于将控制器切换到一个特别的诊断状态,使得系统可以响应扩展诊断命令。
2) 识别ECU:该步骤用于上位机识别特定ECU及相应软硬件和数据的版本信息,上位机由此可决定能否执行FLASH在线编程。
3) 关闭网络上所有控制器的故障码识别和存储功能:该步骤禁止控制器在接下来的编程期间检测和记录故障。
4) 关闭常规信息传递:该步骤禁止所有控制器的常规信息传送,使网络上只有诊断和网络管理消息收发,为在线编程让出足够的总线带宽。
5) 启动在线编程模式:将控制器切换到代码保护区运行Bootloader程序,该模式关闭了中断,因此具有较快的响应速度。
6) 开启安全限制:允许在线编程过程中的安全功能,开启这些安全功能后使得ECU可以执行特定的过程。
7) 下载软件锁:上位机将关键代码下载到ECU,执行这些代码可完成FLASH的擦除和重写。
8) 擦除FLASH:ECU执行上一步骤收到的关键代码,擦除完成后,ECU将清除该段关键代码。
9) 下载数据:该过程下载新的程序到ECU的FLASH。
10) 校验数据:在此过程中ECU检查下载的数据,如果判断为正确,则在FLASH中写入识别码和代码校验数据。
11) 复位ECU:ECU执行复位,恢复到正常工作状态。
12) 开启常规信息传递:重新开启网络上其它控制器上的常规信息传递。
13) 开启故障码识别和存储功能:重新开启网络上其它控制器的故障码识别和存储功能。
3.1 硬件设计
系统CPU采用Freescale公司的MC9S08AW60,该芯片内部集成了标准串口控制器,LIN总线驱动器采用了PHILIPS公司的TJA1020,驱动部分电路如图1,由硬件部分实现了通信协议的物理层和数据链路层。
图1. LIN总线驱动部分电路图
3.2 软件设计与实现
3.2.1 内存地址分配
MC9S08AW60的存储空间分配如图2:
图2. 存储空间分配示意图
以下代码实现了上述的芯片配置。
/*设代码保护区为 0xfc00~0xffff */
const volatile NVPROTSTR _NVPROT@0x0000ffbd = {0xfa};
/*关闭芯片后门锁,打开中断向量表重映射,新的中断向量表地址为0xfbc0~0xfbff */
const volatile NVOPTSTR _NVOPT@0x0000ffbf = {0x3e};
3.2.2 软件实现
ECU程序的状态切换流程图如图3:
图3. 程序状态切换流程图
说明:
1)根据上位机的KWP2000指令,程序在以下5种工作状态中切换,如表1:
表1 程序工作状态表
2)通信中用到以下KWP2000命令,如表2:
命令 |
对应代码 | |
切换到扩展诊断过程命令 |
10 92 | |
查询目标ECU识别码命令 |
查询ECU ID |
1a 87 |
查询应用代码ID |
1a 9c | |
查询Bootloader程序ID |
1a 9e | |
查询数据区ID |
1a 9d | |
禁止故障码记录命令 |
85 02 ff 00 01 01 | |
禁止常规通信数据收发命令 |
28 02 | |
开启安全限制命令 |
请求密码种子 |
27 05 |
回复安全密码 |
27 06 | |
切换到编程模式命令 |
10 85 | |
数据传送命令 |
请求下载数据 |
34 xx |
数据传送 |
36 xx | |
请求结束下载 |
37 xx | |
数据校验 |
31 e1 01 | |
开启常规通信数据收发命令 |
29 02 | |
开启故障码记录命令 |
85 02 ff 00 02 | |
复位命令 |
11 01 |
表2: 命令说明表
3)由于芯片结构的原因,程序在写flash时必须跳到RAM中执行,以下代码定义了用于存储关键代码的RAM空间和指向该空间的函数CriticalProcess()。
volatile unsigned char criticalProcess[100]; /* 定义RAM空间用于存储关键代码 */
#define CriticalProcess ((void(*)(void))( criticalProcess)) /*定义函数指向RAM*/
在线编程过程中程序将接收到的目标代码放入RAM中,接收完成后调用CriticalProcess()来实现FLASH擦除和重写。
4)由于应用代码的起始地址是0x1860,我们用如下方法定义应用程序Application()的起始地址为0x1860,在Bootloader程序中直接调用该函数即可实现Bootloader程序向应用程序的跳转。
#define Application ((void(*)(void))(0x1860)) /* 定义0x1860为应用程序起始地址*/
3.3 实现效果
通过以上硬件和软件,实现了ECU的在线编程,并达到了以下的几个效果:
1) 程序每次上电启动都从Bootloader启动区运行并等待一定时间,使得在线编程无论成功与否都始终可以进行编程升级。
2) 程序开始部分先检测复位原因,如果是上电启动则进入Bootloader程序,否则进入用户程序,使得程序在运行过程中受到干扰复位后可立即重新进入应用程序。
3) ECU在编程过程中进行了状态判断、密码交换和数据校验,有效地保证了整个编程过程的正确性。在线编程完成后当场校验,将特征码写入特定区域,以此来判定应用程序是否合法,正确的特征码保证了应用程序的正确性。
4) 应用程序同样支持KWP2000命令,使得程序无论在Bootloader区或应用程序区均能随时根据KWP2000指令进入编程状态。
5) 由于将FLASH擦除子程序和烧写子程序作为软件锁,在FLASH编程过程中才将其下载到RAM中,并在FLASH烧写完成后将其清除,所以在整个芯片中没有FLASH的改写程序,避免了程序在运行过程中遇到干扰而异常破坏程序的现象。
从网络的分层结构看,KWP2000属于应用层协议,可以应用在各种底层通信协议上,本文讨论了该协议在LIN总线物理层和数据链路层上的应用。近年来CAN总线得到了全球各大先进汽车厂商广泛的应用,本文中的研究内容对进一步在CAN总线上实现同样的在线编程过程有着一定的借鉴和示范作用。
[1] ISO 14230-3. Road Vehicles- Diagnostic Systems - Keyword Protocol 2000 - Implementation.
[2] Daimler Chrysler. ECU flash reprogramming requirements definition. 2002.8
[3] 常越. M68HC08单片机原理及C语言开发实例 北京航空航天大学出版社 2005.9
[4] 崔俊锋、袁涛,车身混合网络中CAN/LIN网关的设计与实现[J].微计算机信息,2006.03-2,P:201-204
[5] Freescale Semiconductor. MC9S08AW60 datasheet Rev2. 2006.12
[6] Freescale Semiconductor. Developer’s Serial Bootloader for M68HC08 and HCS08 MCUs. 2006.8