基于CAN總線節(jié)點(diǎn)的遠(yuǎn)程在線升級(jí)系統(tǒng)設(shè)計(jì)
引言
本文引用地址:http://butianyuan.cn/article/201610/306152.htm特種纖維檢測控制系統(tǒng)是對生產(chǎn)線上產(chǎn)出的纖維產(chǎn)品各種參數(shù)進(jìn)行實(shí)時(shí)檢測和設(shè)備的控制裝置。系統(tǒng)由多個(gè)數(shù)據(jù)采集節(jié)點(diǎn)組成,通過CAN總線網(wǎng)絡(luò)將數(shù)據(jù)匯總到主節(jié)點(diǎn),主節(jié)點(diǎn)對數(shù)據(jù)進(jìn)行處理、分析后輸出相應(yīng)的控制信號(hào),實(shí)現(xiàn)對生產(chǎn)線設(shè)備的實(shí)時(shí)調(diào)整和控制。傳統(tǒng)情況下,如果需要針對節(jié)點(diǎn)進(jìn)行軟件升級(jí)更新,就需要專業(yè)技術(shù)人員到生產(chǎn)現(xiàn)場,通過專用的下載設(shè)備進(jìn)行程序燒錄更新,使系統(tǒng)維護(hù)成本大幅提高,降低了生產(chǎn)效率。因此,結(jié)合特種纖維檢測控制系統(tǒng)現(xiàn)有的CAN總線網(wǎng)絡(luò),并利用節(jié)點(diǎn)微控制器的IAP功能,設(shè)計(jì)一個(gè)節(jié)點(diǎn)遠(yuǎn)程在線升級(jí)系統(tǒng)十分有必要。
本文在實(shí)現(xiàn)CAN總線報(bào)文數(shù)據(jù)收發(fā)的基礎(chǔ)上,參考TCP/IP協(xié)議中的TFTP協(xié)議規(guī)范,設(shè)計(jì)了一個(gè)簡單實(shí)用的系統(tǒng)在線升級(jí)應(yīng)用層協(xié)議,并結(jié)合微控制器的IAP功能,實(shí)現(xiàn)待升級(jí)節(jié)點(diǎn)軟件升級(jí)的目的。
1 IAP技術(shù)及升級(jí)系統(tǒng)總體結(jié)構(gòu)
1.1 IAP技術(shù)及其編程實(shí)現(xiàn)
IAP(In Application Programming,在應(yīng)用中編程)是指用戶在運(yùn)行應(yīng)用程序過程中通過程序控制實(shí)現(xiàn)對片上Flash存儲(chǔ)器的擦除和讀/寫等操作。IAP技術(shù)是實(shí)現(xiàn)系統(tǒng)在線升級(jí)的必要前提,本系統(tǒng)中待升級(jí)節(jié)點(diǎn)采用NXP公司的基于Cortex—M4內(nèi)核的微控制器LPC4357。該芯片集成了功能強(qiáng)大的IAP技術(shù),可以單次最多向目標(biāo)Flash中寫入4 KB數(shù)據(jù)。
IAP的功能函數(shù)被固化在ROM的Boot中。以LPC4357為例,ROM的地址0x 1040 0100作為指針指向IAP功能函數(shù)入口地址IAP_entry,因此當(dāng)使用C語言編寫調(diào)用函數(shù)時(shí),首先定義IAP入口地址。在進(jìn)行IAP函數(shù)調(diào)用時(shí),通過寄存器R0 作為指針來傳遞命令代碼和參數(shù)。IAP命令的返回結(jié)果通過寄存器R1作為指針來傳遞。
實(shí)現(xiàn)節(jié)點(diǎn)軟件升級(jí)的關(guān)鍵一步就是將CAN總線接收的代碼數(shù)據(jù)通過IAP編程到指定的片上Flash的扇區(qū)。IAP通過以下幾個(gè)步驟實(shí)現(xiàn)編程操作:IAP初始化、準(zhǔn)備扇區(qū)、擦除扇區(qū)、準(zhǔn)備扇區(qū)、編程扇區(qū)和數(shù)據(jù)校驗(yàn)。
1.2 在線升級(jí)系統(tǒng)總體結(jié)構(gòu)
系統(tǒng)由檢測節(jié)點(diǎn)、CAN總線網(wǎng)絡(luò)和升級(jí)服務(wù)器組成。其中檢測節(jié)點(diǎn)和CAN總線網(wǎng)絡(luò)是特種纖維檢測控制系統(tǒng)的組成部分,因此,只要將升級(jí)服務(wù)器接入CAN總線網(wǎng)絡(luò),就可以搭建在線升級(jí)系統(tǒng)的硬件平臺(tái)。升級(jí)系統(tǒng)總體框圖如圖1所示。
升級(jí)系統(tǒng)的軟件由節(jié)點(diǎn)端軟件和服務(wù)器端軟件組成,節(jié)點(diǎn)端和服務(wù)器端通過CAN總線進(jìn)行數(shù)據(jù)交互,在此基礎(chǔ)上,設(shè)計(jì)CAN應(yīng)用層協(xié)議。本文通過分析TCP/IP協(xié)議中的TFTP協(xié)議規(guī)范,設(shè)計(jì)了一款簡單實(shí)用而且適用于CAN總線網(wǎng)絡(luò)的系統(tǒng)升級(jí)協(xié)議。升級(jí)系統(tǒng)協(xié)議分層結(jié)構(gòu)如圖2所示。
2 系統(tǒng)升級(jí)協(xié)議設(shè)計(jì)
2.1 TFTP協(xié)議及文件傳輸基本流程
TFTP(Trivial File Transfer Protocol,簡單文件傳輸協(xié)議)是TCP/IP協(xié)議族中的應(yīng)用層協(xié)議,基于UDP傳輸協(xié)議。最初用來引導(dǎo)無盤系統(tǒng),主要用于傳輸小文件。TFTP協(xié)議報(bào)文分為:讀/寫請求報(bào)文、數(shù)據(jù)包報(bào)文、確認(rèn)信息報(bào)文以及差錯(cuò)報(bào)文。TFTP報(bào)文格式如圖3所示。
TFTP客戶端首先向服務(wù)器的端口69發(fā)送文件下載/上傳請求,請求的相應(yīng)報(bào)文格式如圖3(a)所示。服務(wù)器接收請求后打開一個(gè)新的端口與客戶端進(jìn)行通信,服務(wù)器端口69則繼續(xù)等待其他客戶端的請求,從而實(shí)現(xiàn)同時(shí)響應(yīng)多個(gè)客戶端的文件傳輸請求。當(dāng)客戶端發(fā)送的文件下載請求得到服務(wù)器ACK確認(rèn)后,開始發(fā)送編號(hào)為1的數(shù)據(jù)包,數(shù)據(jù)包的報(bào)文格式如圖3(b)所示。每個(gè)數(shù)據(jù)包的大小為固定的512字節(jié),服務(wù)器每次發(fā)送數(shù)據(jù)包之前都必須得到客戶端的ACK確認(rèn)。當(dāng)客戶端接收到小于固定字節(jié)的數(shù)據(jù)包時(shí),則認(rèn)為文件傳輸結(jié)束。
TFTP協(xié)議也提供了相應(yīng)的錯(cuò)誤處理機(jī)制。服務(wù)器端和客戶端都可實(shí)現(xiàn)超時(shí)重傳,只要有一端出現(xiàn)超時(shí),就將重傳丟失的報(bào)文,從而有效的提高文件傳輸?shù)恼_率。在傳輸過程中出現(xiàn)錯(cuò)誤時(shí),服務(wù)器端向客戶端發(fā)送差錯(cuò)報(bào)文。
2.2 系統(tǒng)升級(jí)協(xié)議的報(bào)文格式
CAN總線協(xié)議定義了5種類型的幀:數(shù)據(jù)幀、遙控幀、錯(cuò)誤幀、過載幀、間隔幀。其中,數(shù)據(jù)幀用于發(fā)送單元向接收單元傳送數(shù)據(jù)。數(shù)據(jù)幀格式分為標(biāo)準(zhǔn)格式和擴(kuò)展格式,兩者區(qū)別在于標(biāo)識(shí)符分別占11位和29位,這里僅使用標(biāo)準(zhǔn)格式的數(shù)據(jù)幀作為節(jié)點(diǎn)和升級(jí)服務(wù)器通信的基本單位。
由于一個(gè)數(shù)據(jù)幀最多只能攜帶8字節(jié)數(shù)據(jù),而在一般文件傳輸應(yīng)用中數(shù)據(jù)以數(shù)據(jù)塊的形式進(jìn)行傳輸,因此在文件傳輸時(shí)需要進(jìn)行數(shù)據(jù)拆分、重組的操作。在應(yīng)用層的數(shù)據(jù)報(bào)文中對這一操作進(jìn)行屏蔽,具體操作通過底層協(xié)議實(shí)現(xiàn),因此這里僅需關(guān)心數(shù)據(jù)幀的數(shù)據(jù)段。升級(jí)協(xié)議的報(bào)文分為:升級(jí)命令、數(shù)據(jù)包、確認(rèn)信息、錯(cuò)誤信息,相應(yīng)的報(bào)文格式如圖4所示。
升級(jí)命令由升級(jí)服務(wù)器發(fā)出,ID號(hào)用于確認(rèn)待升級(jí)節(jié)點(diǎn),升級(jí)模式分為單節(jié)點(diǎn)升級(jí)模式和多節(jié)點(diǎn)同時(shí)升級(jí)模式。數(shù)據(jù)包用于服務(wù)器向節(jié)點(diǎn)傳輸升級(jí)所需的二進(jìn)制文件,每個(gè)數(shù)據(jù)包攜帶固定的1024字節(jié)數(shù)據(jù),這是因?yàn)楣?jié)點(diǎn)利用IAP技術(shù)進(jìn)行軟件升級(jí)時(shí),每次對片上Flash編程的字節(jié)數(shù)是固定的,可選512字節(jié)、1024字節(jié)、4096字節(jié)3個(gè)選項(xiàng),這里選用1024字節(jié)。確認(rèn)信息和錯(cuò)誤信息參考TFTP協(xié)議的相應(yīng)報(bào)文格式。
2.3 系統(tǒng)升級(jí)協(xié)議及文件傳輸流程
系統(tǒng)升級(jí)命令由升級(jí)服務(wù)器發(fā)出,節(jié)點(diǎn)在接收到升級(jí)命令后通過校驗(yàn)ID號(hào)判斷升級(jí)模式,進(jìn)入相應(yīng)的升級(jí)狀態(tài),并向服務(wù)器發(fā)送確認(rèn)信息ACK。升級(jí)服務(wù)器接收到ACK確認(rèn)后,開始發(fā)送編號(hào)為1的數(shù)據(jù)包,節(jié)點(diǎn)接收到數(shù)據(jù)包就立即將1024字節(jié)數(shù)據(jù)編程到片內(nèi)Flash中,編程成功后返回ACK 1,以此類推。如果最后一個(gè)數(shù)據(jù)包N的數(shù)據(jù)長度小于1024字節(jié),則自動(dòng)向數(shù)據(jù)包添加0,使數(shù)據(jù)包長度正好為1024字節(jié)。
升級(jí)服務(wù)器接收到節(jié)點(diǎn)確認(rèn)信息ACK N,表明節(jié)點(diǎn)升級(jí)完成。這里,節(jié)點(diǎn)端采用邊接收邊升級(jí)的方案。如果將升級(jí)文件全部接收后再進(jìn)行升級(jí),則需要大量的RAM空間,一旦升級(jí)文件過大,節(jié)點(diǎn)升級(jí)就會(huì)失敗。系統(tǒng)升級(jí)流程如圖5所示。
2. 4 系統(tǒng)升級(jí)中的錯(cuò)誤處理
在系統(tǒng)升級(jí)過程中,可能會(huì)出現(xiàn)發(fā)送數(shù)據(jù)包丟失、連接中斷的情況。當(dāng)服務(wù)器端發(fā)送的數(shù)據(jù)包丟失或節(jié)點(diǎn)端接收該數(shù)據(jù)包失敗時(shí),節(jié)點(diǎn)端向服務(wù)器端發(fā)送錯(cuò)誤信息。服務(wù)器端接收錯(cuò)誤信息,根據(jù)錯(cuò)誤內(nèi)容判斷是否需要重新發(fā)送數(shù)據(jù)包。如果服務(wù)器端在一定時(shí)間內(nèi)沒有接收到節(jié)點(diǎn)端的確認(rèn)信息或錯(cuò)誤信息,則認(rèn)為系統(tǒng)升級(jí)失敗,服務(wù)器端會(huì)向節(jié)點(diǎn)端發(fā)送升級(jí)失敗的錯(cuò)誤信息ERROR,節(jié)點(diǎn)端接收該信息后進(jìn)入升級(jí)失敗狀態(tài)。
3 節(jié)點(diǎn)端軟件升級(jí)協(xié)議的實(shí)現(xiàn)
檢測節(jié)點(diǎn)采用NXP公司的基于Cortex-M4內(nèi)核的微控制器LPC4357作為數(shù)據(jù)采集和控制核心,片上集成了1MB的Flash,分為BankA和BankB兩個(gè)存儲(chǔ)體,每個(gè)存儲(chǔ)體各占512KB。
節(jié)點(diǎn)程序分為兩部分:Bootloader升級(jí)程序和APP應(yīng)用程序。APP應(yīng)用程序分為兩個(gè)區(qū):默認(rèn)應(yīng)用程序區(qū)和升級(jí)應(yīng)用程序區(qū)。片上Flash功能分區(qū)如圖6所示。
Bootloader升級(jí)程序燒錄在片上Flash的BankA扇區(qū)0處,占用8KB空間。系統(tǒng)啟動(dòng)時(shí),最先執(zhí)行該處程序,首先進(jìn)行系統(tǒng)初始化操作,包括CAN總線接口初始化、IAP初始化、讀器件ID號(hào)等。初始化完成后,進(jìn)入等待升級(jí)狀態(tài)。在該狀態(tài)下,如果接收到升級(jí)服務(wù)器發(fā)送的升級(jí)命令,則進(jìn)入升級(jí)狀態(tài)。系統(tǒng)升級(jí)成功后進(jìn)入待跳轉(zhuǎn)狀態(tài),最后系統(tǒng)跳轉(zhuǎn)到升級(jí)后的應(yīng)用程序區(qū)。節(jié)點(diǎn)升級(jí)狀態(tài)轉(zhuǎn)換圖如圖7所示。
當(dāng)Bootloader初始化完成且等待升級(jí)命令超時(shí)后,系統(tǒng)跳轉(zhuǎn)到APP應(yīng)用程序的默認(rèn)應(yīng)用程序區(qū),開始執(zhí)行節(jié)點(diǎn)應(yīng)用程序。應(yīng)用程序除了完成數(shù)據(jù)采集和CAN總線數(shù)據(jù)傳輸功能,還能在接收到升級(jí)服務(wù)器的升級(jí)命令時(shí),中止系統(tǒng)運(yùn)行并跳至Bootloader區(qū),進(jìn)入系統(tǒng)升級(jí)狀態(tài)。
由于系統(tǒng)啟動(dòng)時(shí)不是直接開始執(zhí)行APP應(yīng)用程序,而是從Bootloader程序跳轉(zhuǎn)進(jìn)入該處程序,因此,在APP應(yīng)用程序初始化之前必須將中斷向量表重映射,防止APP應(yīng)用程序發(fā)生中斷時(shí)進(jìn)入Bootloader程序的中斷函數(shù)。
當(dāng)升級(jí)失敗時(shí)跳轉(zhuǎn)到默認(rèn)應(yīng)用程序區(qū),使系統(tǒng)在升級(jí)出錯(cuò)時(shí)依然能夠正常運(yùn)行。系統(tǒng)升級(jí)時(shí),對升級(jí)應(yīng)用程序區(qū)進(jìn)行擦除、編程操作,升級(jí)成功后進(jìn)入該程序區(qū)執(zhí)行升級(jí)后的應(yīng)用程序。Bootloader程序的待跳轉(zhuǎn)狀態(tài)根據(jù)等待超時(shí)、升級(jí)狀態(tài)分別進(jìn)入默認(rèn)應(yīng)用程序區(qū)或升級(jí)應(yīng)用程序區(qū)。
4 升級(jí)服務(wù)器端軟件設(shè)計(jì)
升級(jí)服務(wù)器是普通PC機(jī),通過USB-CAN接口卡實(shí)現(xiàn)與CAN總線的連接。因此,升級(jí)服務(wù)器首先初始化并配置USB—CAN接口卡,通過以下步驟實(shí)現(xiàn):
①打開USB—CAN接口卡對應(yīng)的COM口。
②配置相應(yīng)COM口波特率、校驗(yàn)位等參數(shù)。
③通過向COM口發(fā)送配置信息,對USB—CAN接口卡進(jìn)行參數(shù)配置。
其中,應(yīng)設(shè)置USB-CAN接口卡波特率與外部CAN總線網(wǎng)絡(luò)的波特率相匹配;接著,升級(jí)服務(wù)器將對升級(jí)程序的二進(jìn)制文件進(jìn)行操作,該二進(jìn)制文件在編譯器對節(jié)點(diǎn)升級(jí)程序進(jìn)行編譯時(shí)生成,也可通過對生成的HEX文件進(jìn)行轉(zhuǎn)換得到。首先,升級(jí)服務(wù)器獲取文件大小N KB,將該數(shù)值N傳遞給升級(jí)命令,節(jié)點(diǎn)端接收升級(jí)命令的同時(shí)可獲取文件大小,從而確定IAP編程次數(shù);然后,升級(jí)服務(wù)器將該二進(jìn)制文件讀入內(nèi)存中,在升級(jí)開始后,根據(jù)升級(jí)協(xié)議的相關(guān)格式將數(shù)據(jù)進(jìn)行封裝并發(fā)送到相應(yīng)節(jié)點(diǎn)端。
升級(jí)服務(wù)器也可根據(jù)需要選擇不同的升級(jí)模式??晒┻x擇的升級(jí)模式有:單節(jié)點(diǎn)升級(jí)模式和多節(jié)點(diǎn)同時(shí)升級(jí)模式。單節(jié)點(diǎn)和多節(jié)點(diǎn)同時(shí)升級(jí)的區(qū)別在于,多節(jié)點(diǎn)升級(jí)利用了CAN總線節(jié)點(diǎn)可接收廣播數(shù)據(jù)的特性,通過配置USB—CAN接口卡的ID過濾器,升級(jí)服務(wù)器可接收相應(yīng)節(jié)點(diǎn)發(fā)送的確認(rèn)信息,實(shí)現(xiàn)多個(gè)節(jié)點(diǎn)同時(shí)升級(jí)的操作。升級(jí)服務(wù)器的軟件界面如圖8所示。
結(jié)語
本文結(jié)合特種纖維檢測控制系統(tǒng)現(xiàn)有的CAN總線網(wǎng)絡(luò)和節(jié)點(diǎn)的IAP功能,設(shè)計(jì)了節(jié)點(diǎn)在線升級(jí)系統(tǒng)。參考TFTP協(xié)議,設(shè)計(jì)了一種適用于CAN總線網(wǎng)絡(luò)的系統(tǒng)升級(jí)協(xié)議。通過將節(jié)點(diǎn)端的片上Flash進(jìn)行功能分區(qū),實(shí)現(xiàn)了在升級(jí)出現(xiàn)錯(cuò)誤時(shí)維持節(jié)點(diǎn)穩(wěn)定運(yùn)行。根據(jù)實(shí)際應(yīng)用需要,服務(wù)器端選擇相應(yīng)升級(jí)模式,提高了升級(jí)效率。系統(tǒng)的實(shí)際運(yùn)行結(jié)果表明,升級(jí)操作簡單高效,節(jié)點(diǎn)在升級(jí)后運(yùn)行穩(wěn)定,系統(tǒng)性能良好。CAN總線網(wǎng)絡(luò)和智能節(jié)點(diǎn)廣泛應(yīng)用在工業(yè)控制等領(lǐng)域,該系統(tǒng)為節(jié)點(diǎn)升級(jí)的實(shí)際需求提供了一種可行的解決方案。
評論