基于CAN的遠程下載技術(shù)開(kāi)發(fā)及應用
1.2 系統功能設計
在整個(gè)設計開(kāi)發(fā)中,關(guān)鍵之處是目標端 Bootloader 自舉程序的開(kāi)發(fā)。結合到VRV 空調系統的實(shí)際應用,整個(gè)系統應該至少具有以下功能:
(1)多種下載方式的提供。VRV 空調系統運行當中,可能需要根據實(shí)際情況采用不同的方式來(lái)進(jìn)行遠程下載。因而需要實(shí)現對單點(diǎn)、多點(diǎn)及廣播等通訊方式的支持。
(2)軟件復位功能。即便是目標端設備已經(jīng)具備利用Bootloader 自舉程序來(lái)實(shí)現遠程下載的能力,但由于Bootloader 機制需要目標端先復位,才能重新再執行Bootloader 自舉程序。
然而現場(chǎng)環(huán)境往往不能實(shí)施掉電或其他硬件方式復位目標端設備,這便需要有軟件實(shí)現復位的手段。在此,將軟件復位作為自定義的通訊協(xié)議中一個(gè)命令,由主機端發(fā)送給目標端,目標端的用戶(hù)應用程序內接收到這一命令,經(jīng)過(guò)解析、確認后進(jìn)行復位。
(3)加/解密功能。鑒于多聯(lián)機空調系統的商用價(jià)值,Bootloader 程序應當具備加密的功能,保護知識產(chǎn)權。這可以通過(guò)主機端和目標端之間采用一種密鑰或加、解密算法,融合到通訊數據中實(shí)現。
(4)異常處理功能。在通訊過(guò)程中,很有可能出現如主機端出現故障,造成當前的數據不能繼續成功發(fā)給目標端。目標端運行自舉程序時(shí),只有等到主機端數據全部通訊完畢,才可以跳轉到用戶(hù)應用程序,繼續執行。此會(huì )造成目標端一直處于等待狀態(tài),效率低下或者接收錯誤數據并執行,以致出現嚴重后果。在系統設計開(kāi)發(fā)時(shí)需要預留一個(gè)能夠實(shí)現異常處理的命令以便主機端恢復后,將這個(gè)命令下發(fā),目標段根據這個(gè)命令,重新接收正確的數據。
2 協(xié)議設計
要將系統的目標端和主機端之間,設計成支持單點(diǎn)、多點(diǎn)以及廣播等多種遠程下載方式,并且支持、軟件復位和異常處理、加解密等功能,可以充分利用 CAN 總線(xiàn)數據幀的29 位(遵循CAN2.0B 協(xié)議)標識符來(lái)實(shí)現。定制的通訊協(xié)議中CAN 的幀格式如表1 所示,將CAN 的29 位標示符分為五段:優(yōu)先級、控制域、通訊方式、節點(diǎn)編號、命令編號。
表 1 數據幀29 位標識符分配表

數據幀29 位標識符分配表
優(yōu)先級:00->01->10->11 優(yōu)先級別依次降低,默認優(yōu)先級別為11,故障報警優(yōu)先級最高為00,數據傳輸優(yōu)先級為01,命令下傳優(yōu)先級為10,應答返回優(yōu)先級為11。
控制域:ID26/ID22,用以表示當前的數據幀屬于哪一種類(lèi)型:故障為00、數據為01、命令10、應答11。
通訊方式:ID24/ID15,指定當前的數據幀是廣播傳輸或者單點(diǎn)傳輸,全為0 是單點(diǎn)而全為1 是廣播。
節點(diǎn)編號:ID14/ID8,共7 位,足夠標識CAN 總線(xiàn)支持的多達112 個(gè)節點(diǎn)的最大負載。
命令編號:這里存放的是根據實(shí)際需要定制的一些命令,如軟件復位命令、異常處理命令。主機端將定制的命令編號下發(fā),目標端接收到命令后,解析后執行相應動(dòng)作。仿照上表,配置各個(gè)目標端的接收過(guò)濾碼和接收屏蔽碼,便可以實(shí)現單點(diǎn)、多點(diǎn)以及廣播通訊。另外,對于單點(diǎn)通訊方式下的遠程下載,為保證主機端和目標端的通訊數據的正確和可靠傳輸,采用應答機制來(lái)實(shí)現,并定制了一套圖3 所示的通訊鏈路機制。
主機端和目標端應答鏈路機制圖

圖 3 主機端和目標端應答鏈路機制圖
遠程下載的通訊只能由主機端開(kāi)啟。主機端先發(fā)送讀取器件型號命令,讀取目標端器件芯片型號,目標端收到這個(gè)命令,回復本身的型號數據作為一個(gè)應答,主機端根據這個(gè)型號,再開(kāi)辟動(dòng)態(tài)內存和組織要下傳的數據。主機端接著(zhù)下發(fā)一個(gè)讀取器件PROM 命令,以獲取目標端器件位于地址0x00 處的數據,將和從主機端讀取并解析、組織后的HEX 文件一起下傳。主機端收到這一步的應答后,開(kāi)始發(fā)送寫(xiě)PROM 命令和PROM 數據,目標端將接收到的數據寫(xiě)入相應的地址段,每完成一頁(yè)寫(xiě)操作,返回一個(gè)應答,接著(zhù)接收主機端下傳的下一頁(yè)數據。PROM 寫(xiě)數據發(fā)送完后,主機端接著(zhù)發(fā)送寫(xiě)CM 數據命令和寫(xiě)CM 數據,過(guò)程和寫(xiě)PROM 是一樣的。最后,主機端下發(fā)一個(gè)跳轉命令,目標端收到這個(gè)命令后,跳轉到程序存儲器的0x00 地址處。然后,目標端根據地址0x00 處存放的數據,跳轉到用戶(hù)應用程序。
而對于多點(diǎn)或廣播,通常都是對數百甚至上千目標端進(jìn)行下載。如果目標端都應答,會(huì )造成總線(xiàn)上數據的堵塞,浪費大量的總線(xiàn)時(shí)間。所以采用非應答機制,直接燒寫(xiě)程序存儲器。
此時(shí)主機端數據的下傳,采用定時(shí)器觸發(fā)方式。每當定時(shí)時(shí)間到達時(shí),觸發(fā)一次數據的發(fā)送。
直至最后,發(fā)送一個(gè)跳轉命令。如果目標端沒(méi)有執行跳轉,那么認為當前目標端沒(méi)能正確接收主機端發(fā)送的數據,主機端重新對當前目標端進(jìn)行一次單點(diǎn)方式下的遠程下載。
3 目標端設計方案
目標端Bootloader 自舉程序一般只是一個(gè)簡(jiǎn)單的通訊程序,負責接收和發(fā)送數據,通常只需極少的存儲空間,可以位于單片機程序存儲器特定的Boot Segment 區域。程序存儲器還有一段稱(chēng)為General Segment 區域可用于存儲用戶(hù)應用程序。單片機的程序存儲器大多都是FLASH 閃存,數據是以一個(gè)個(gè)數據頁(yè)的形式存儲,必須先對當前存儲頁(yè)擦除,然后才能寫(xiě)入數據。自舉程序還需使用dsPIC33 單片機器件中斷向量表 (IVT) 中的復位向量實(shí)現程序的跳轉、以及器件上的CAN 通信模塊。單片機的程序存儲器的地址映射如下圖4 所示。
dsPIC33F 程序存儲器地址映射圖

圖 4 dsPIC33F 程序存儲器地址映射圖
評論