汤凯丰 赵德安 华明公
(1.江苏大学电气信息工程学院 镇江 212013)(2.今创集团股份有限公司 常州 213011)
塞拉门作为旅客上下列车的通道,因为操作频繁、数量较多而成为动车上至关重要的部件[1]。为保证整个门控单元的安全可靠,需要选择性能较强的处理器。
DSP28335是TI公司推出的一款主频高达150MHZ的32位浮点型处理器,该芯片内部资源丰富,数据存储量大,精度高,能够快速执行中断响应,实现复杂的数学算法,广泛用于工业控制、军事安全等领域。因此选择DSP28335作为门控制单元的处理器,可满足列车运行的恶劣环境。
随着技术的发展和客户的需求,对塞拉门门控器软件的维护和更新越来越频繁。通常程序员更新程序时,先将仿真器连接至电路板JTAG口,再使用编译工具烧写程序[2]。但是直接连接仿真器更新程序,在列车现场复杂的工作环境中难以实现,因此烧写程序时需要采用单片机其他通信接口。在应用编程(IAP)技术则为该问题提供了解决方案,为现场程序升级带来极大的灵活性[3]。
列车的每一节车厢设置有一个主门控器和三个从门控器,主门控器通过CAN总线与从门控器进行通信[4]。上位机通过主门控器将命令发送给各个从门控器,各个从门控器通过主门控器将本地信息反馈给上位机。网络系统框图如图1所示。
图1 CAN网络系统框图
当只需更新某一扇门控器的程序时,在上位机中选择相对应的门控器地址。若只需要更新主门控器,主门控器解析代码文件后,立刻开始更新程序;若只需要更新其中一个从门控器,该从控器将“准备就绪”命令反馈给主门控器后,主门控器接收到命令后将代码文件解析,并按照协议打包发送给该从门控器。接收端对每帧数据都会进行校验,若主门控器没有收到校验正确应答帧,则重新发送该帧数据,超过三次则终止该门控器程序升级并在上位机中显示“传输失败”。当从门控器将所有数据接收完毕后,开始自动更新程序。
若需要更新所有门控器的程序,主门控器将代码文件解析,然后依次将数据打包发送给从门控器1、从门控器2、从门控器3。若某一个门控器接受数据失败,主门控器将继续对下一个门控器发送数据。当每一个从门控器接收完所有正确数据后,开始自动更新程序。主门控器完成对所有门控器数据传输后,自身开始更新程序。每一扇门更新成功后,都通过主门控器将更新成功的信息反馈给上位机。程序更新流程图如图2所示。
图2 程序更新流程图
根据要求,数据传输采用带XOR校验的通信协议。升级过程中,数据传输发送帧格式如图3所示、接收帧格式如图4所示。
图3 发送帧结构
图4 接收帧结构
实现DSP28335在应用编程,即实现FLASH的擦除、编程和校验,需要利用应用程序编程接口文件(API)[5]中相关函数。
该函数可以完成对FLASH的擦除操作。该操作每次只能针对FLASH的一个或几个扇区,而不是其中的某一位。OTP单元一旦被编译,它将无法再被擦除。
编程函数的作用是将应用程序和数据放入用户指定的FLASH扇区或者OTP单元[6]。编程时只能将某一位从1变为0,为了保护FLASH和者OTP单元,在该位未被重新擦除的情况下将无法被重写。
该函数作用于编程结束之后,将FLASH中的数据和外扩RAM中的数据进行比较,确保数据被正确写入FLASH中[7]。
FLASH编程时会得到较高的工作电压从而导致读取不稳定,故实现IAP功能还需要一个独立存储器[8]。API函数的调用有着严格的要求,它的装载一般有三种方法:
方法1:通过JTAG将控制程序直接下载到片上RAM中。
方法2:通过SPI、SCI、I2C、eCAN中的任何一种BootLoader将控制程序从片外下载到片上RAM。
方法3:编程前将API函数复制到独立的RAM中,然后在对FLASH进行操作。
该文采用方法3来装载API函数。DSP上电初始化,运行原用户代码,并将FLASH API函数复制到片上RAM。上位机发送在线升级命令后,新的用户代码全部发送至外扩RAM,片上RAM中的FLASH API函数再被发送到外扩RAM上。系统调用外扩RAM的API函数和用户程序对FLASH进行编程。在线编程系统的结构图如图5所示:
编译工具CCS对文件编译和链接后会生成COFF格式文件[9],详细的COFF文件包含了文件头、符号表、段地址、初始化段入口等信息[10]。该格式文件需要被转换成可识别的数据格式才能被写入FLASH中或者加载到RAM上。
图5 在线编程系统结构图
BIN文件是按照“顺序格式”表示的二进制代码,该文件格式只包括纯粹的二进制数据,这些数据可以被内存识别。BIN格式文件通过FLASH中的读写函数写入相应位置,从而实现在线编程。
COFF格式文件可以通过hex2000.exe转化成BIN格式文件,利用编写的命令文件可以实现该文件的十六进制转换[11]。将该命令文件保存到hex2000.exe所在的文件夹目录,命名为code.cmd。命令文件编写内容为
-code.out//输入文件
-image//指定模式
-memwidth 16//16位存储器
-map code.map//创建映射文件,命名为code.map
-order MS//指定输出文件为大模式
-b//生成BIN格式文件
-fill FFFFh//剩余空间填充指定内容
ROMS{
TEXT:org=0x00600000,len=0x80000,romwidth=16
files={code.bin}}//指定生成BIN格式文件名
针对塞拉门项目,设计了一个相应的上位机软件,实现了读取数据、下载程序。上位机和门控器通过CAN网络连接起来,打开上位机软件,其下载程序界面如图6所示。
图6 上位机显示界面
在右上角选择所需更新程序的车门编号,ALL代表更新所有门控器。点击更新应用程序按钮,选择用户程序文件,数据开始传输。程序更新的结果将在文本框里显示,图6所示四扇门中从门控器2更新失败。查看网络数据标签页中的内容,发现该门控器离线,并不在CAN网络中,做相应检查修复后,尝试对从门控器2单独更新一次程序,更新成功。
本文介绍了利用在应用编程技术实现基于DSP28335的塞拉门门控器远程更新的方案,在实际项目工程中的应用结果表明列车复杂的环境下该方案正确可行,省去了拆罩板、连接下载器等其他工作的时间。