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