湯凱豐 趙德安 華明公
(1.江蘇大學(xué)電氣信息工程學(xué)院 鎮(zhèn)江 212013)(2.今創(chuàng)集團(tuán)股份有限公司 常州 213011)
塞拉門作為旅客上下列車的通道,因?yàn)椴僮黝l繁、數(shù)量較多而成為動(dòng)車上至關(guān)重要的部件[1]。為保證整個(gè)門控單元的安全可靠,需要選擇性能較強(qiáng)的處理器。
DSP28335是TI公司推出的一款主頻高達(dá)150MHZ的32位浮點(diǎn)型處理器,該芯片內(nèi)部資源豐富,數(shù)據(jù)存儲(chǔ)量大,精度高,能夠快速執(zhí)行中斷響應(yīng),實(shí)現(xiàn)復(fù)雜的數(shù)學(xué)算法,廣泛用于工業(yè)控制、軍事安全等領(lǐng)域。因此選擇DSP28335作為門控制單元的處理器,可滿足列車運(yùn)行的惡劣環(huán)境。
隨著技術(shù)的發(fā)展和客戶的需求,對(duì)塞拉門門控器軟件的維護(hù)和更新越來(lái)越頻繁。通常程序員更新程序時(shí),先將仿真器連接至電路板JTAG口,再使用編譯工具燒寫程序[2]。但是直接連接仿真器更新程序,在列車現(xiàn)場(chǎng)復(fù)雜的工作環(huán)境中難以實(shí)現(xiàn),因此燒寫程序時(shí)需要采用單片機(jī)其他通信接口。在應(yīng)用編程(IAP)技術(shù)則為該問題提供了解決方案,為現(xiàn)場(chǎng)程序升級(jí)帶來(lái)極大的靈活性[3]。
列車的每一節(jié)車廂設(shè)置有一個(gè)主門控器和三個(gè)從門控器,主門控器通過CAN總線與從門控器進(jìn)行通信[4]。上位機(jī)通過主門控器將命令發(fā)送給各個(gè)從門控器,各個(gè)從門控器通過主門控器將本地信息反饋給上位機(jī)。網(wǎng)絡(luò)系統(tǒng)框圖如圖1所示。
圖1 CAN網(wǎng)絡(luò)系統(tǒng)框圖
當(dāng)只需更新某一扇門控器的程序時(shí),在上位機(jī)中選擇相對(duì)應(yīng)的門控器地址。若只需要更新主門控器,主門控器解析代碼文件后,立刻開始更新程序;若只需要更新其中一個(gè)從門控器,該從控器將“準(zhǔn)備就緒”命令反饋給主門控器后,主門控器接收到命令后將代碼文件解析,并按照協(xié)議打包發(fā)送給該從門控器。接收端對(duì)每幀數(shù)據(jù)都會(huì)進(jìn)行校驗(yàn),若主門控器沒有收到校驗(yàn)正確應(yīng)答幀,則重新發(fā)送該幀數(shù)據(jù),超過三次則終止該門控器程序升級(jí)并在上位機(jī)中顯示“傳輸失敗”。當(dāng)從門控器將所有數(shù)據(jù)接收完畢后,開始自動(dòng)更新程序。
若需要更新所有門控器的程序,主門控器將代碼文件解析,然后依次將數(shù)據(jù)打包發(fā)送給從門控器1、從門控器2、從門控器3。若某一個(gè)門控器接受數(shù)據(jù)失敗,主門控器將繼續(xù)對(duì)下一個(gè)門控器發(fā)送數(shù)據(jù)。當(dāng)每一個(gè)從門控器接收完所有正確數(shù)據(jù)后,開始自動(dòng)更新程序。主門控器完成對(duì)所有門控器數(shù)據(jù)傳輸后,自身開始更新程序。每一扇門更新成功后,都通過主門控器將更新成功的信息反饋給上位機(jī)。程序更新流程圖如圖2所示。
圖2 程序更新流程圖
根據(jù)要求,數(shù)據(jù)傳輸采用帶XOR校驗(yàn)的通信協(xié)議。升級(jí)過程中,數(shù)據(jù)傳輸發(fā)送幀格式如圖3所示、接收幀格式如圖4所示。
圖3 發(fā)送幀結(jié)構(gòu)
圖4 接收幀結(jié)構(gòu)
實(shí)現(xiàn)DSP28335在應(yīng)用編程,即實(shí)現(xiàn)FLASH的擦除、編程和校驗(yàn),需要利用應(yīng)用程序編程接口文件(API)[5]中相關(guān)函數(shù)。
該函數(shù)可以完成對(duì)FLASH的擦除操作。該操作每次只能針對(duì)FLASH的一個(gè)或幾個(gè)扇區(qū),而不是其中的某一位。OTP單元一旦被編譯,它將無(wú)法再被擦除。
編程函數(shù)的作用是將應(yīng)用程序和數(shù)據(jù)放入用戶指定的FLASH扇區(qū)或者OTP單元[6]。編程時(shí)只能將某一位從1變?yōu)?,為了保護(hù)FLASH和者OTP單元,在該位未被重新擦除的情況下將無(wú)法被重寫。
該函數(shù)作用于編程結(jié)束之后,將FLASH中的數(shù)據(jù)和外擴(kuò)RAM中的數(shù)據(jù)進(jìn)行比較,確保數(shù)據(jù)被正確寫入FLASH中[7]。
FLASH編程時(shí)會(huì)得到較高的工作電壓從而導(dǎo)致讀取不穩(wěn)定,故實(shí)現(xiàn)IAP功能還需要一個(gè)獨(dú)立存儲(chǔ)器[8]。API函數(shù)的調(diào)用有著嚴(yán)格的要求,它的裝載一般有三種方法:
方法1:通過JTAG將控制程序直接下載到片上RAM中。
方法2:通過SPI、SCI、I2C、eCAN中的任何一種BootLoader將控制程序從片外下載到片上RAM。
方法3:編程前將API函數(shù)復(fù)制到獨(dú)立的RAM中,然后在對(duì)FLASH進(jìn)行操作。
該文采用方法3來(lái)裝載API函數(shù)。DSP上電初始化,運(yùn)行原用戶代碼,并將FLASH API函數(shù)復(fù)制到片上RAM。上位機(jī)發(fā)送在線升級(jí)命令后,新的用戶代碼全部發(fā)送至外擴(kuò)RAM,片上RAM中的FLASH API函數(shù)再被發(fā)送到外擴(kuò)RAM上。系統(tǒng)調(diào)用外擴(kuò)RAM的API函數(shù)和用戶程序?qū)LASH進(jìn)行編程。在線編程系統(tǒng)的結(jié)構(gòu)圖如圖5所示:
編譯工具CCS對(duì)文件編譯和鏈接后會(huì)生成COFF格式文件[9],詳細(xì)的COFF文件包含了文件頭、符號(hào)表、段地址、初始化段入口等信息[10]。該格式文件需要被轉(zhuǎn)換成可識(shí)別的數(shù)據(jù)格式才能被寫入FLASH中或者加載到RAM上。
圖5 在線編程系統(tǒng)結(jié)構(gòu)圖
BIN文件是按照“順序格式”表示的二進(jìn)制代碼,該文件格式只包括純粹的二進(jìn)制數(shù)據(jù),這些數(shù)據(jù)可以被內(nèi)存識(shí)別。BIN格式文件通過FLASH中的讀寫函數(shù)寫入相應(yīng)位置,從而實(shí)現(xiàn)在線編程。
COFF格式文件可以通過hex2000.exe轉(zhuǎn)化成BIN格式文件,利用編寫的命令文件可以實(shí)現(xiàn)該文件的十六進(jìn)制轉(zhuǎn)換[11]。將該命令文件保存到hex2000.exe所在的文件夾目錄,命名為code.cmd。命令文件編寫內(nèi)容為
-code.out//輸入文件
-image//指定模式
-memwidth 16//16位存儲(chǔ)器
-map code.map//創(chuàng)建映射文件,命名為code.map
-order MS//指定輸出文件為大模式
-b//生成BIN格式文件
-fill FFFFh//剩余空間填充指定內(nèi)容
ROMS{
TEXT:org=0x00600000,len=0x80000,romwidth=16
files={code.bin}}//指定生成BIN格式文件名
針對(duì)塞拉門項(xiàng)目,設(shè)計(jì)了一個(gè)相應(yīng)的上位機(jī)軟件,實(shí)現(xiàn)了讀取數(shù)據(jù)、下載程序。上位機(jī)和門控器通過CAN網(wǎng)絡(luò)連接起來(lái),打開上位機(jī)軟件,其下載程序界面如圖6所示。
圖6 上位機(jī)顯示界面
在右上角選擇所需更新程序的車門編號(hào),ALL代表更新所有門控器。點(diǎn)擊更新應(yīng)用程序按鈕,選擇用戶程序文件,數(shù)據(jù)開始傳輸。程序更新的結(jié)果將在文本框里顯示,圖6所示四扇門中從門控器2更新失敗。查看網(wǎng)絡(luò)數(shù)據(jù)標(biāo)簽頁(yè)中的內(nèi)容,發(fā)現(xiàn)該門控器離線,并不在CAN網(wǎng)絡(luò)中,做相應(yīng)檢查修復(fù)后,嘗試對(duì)從門控器2單獨(dú)更新一次程序,更新成功。
本文介紹了利用在應(yīng)用編程技術(shù)實(shí)現(xiàn)基于DSP28335的塞拉門門控器遠(yuǎn)程更新的方案,在實(shí)際項(xiàng)目工程中的應(yīng)用結(jié)果表明列車復(fù)雜的環(huán)境下該方案正確可行,省去了拆罩板、連接下載器等其他工作的時(shí)間。