劉 貞
(北京全路通信信號(hào)研究設(shè)計(jì)院有限公司,北京 100073)
近年來,以太網(wǎng)作為一種高效、便捷的通信方式逐漸應(yīng)用于鐵路信號(hào)設(shè)備通信領(lǐng)域。通過架設(shè)封閉物理網(wǎng)絡(luò)并配合安全通信協(xié)議,可以構(gòu)建相對(duì)安全的數(shù)據(jù)通信網(wǎng)絡(luò)。
鐵路信號(hào)系統(tǒng)設(shè)備復(fù)雜多樣,涉及不同廠家、不同歷史年代的產(chǎn)品,故數(shù)據(jù)通信總線接口種類繁多,如CAN總線、RS-485/422總線、profibus總線等。當(dāng)不同總線類的設(shè)備需要互聯(lián)互通時(shí),就需要總線接口轉(zhuǎn)換裝置,一般稱之為接口適配器或網(wǎng)關(guān)[1]。本文介紹一種基于嵌入式系統(tǒng)的以太網(wǎng)轉(zhuǎn)CAN總線設(shè)計(jì)方案,盡管目前此類設(shè)備較多且早已上市,但直接應(yīng)用信號(hào)系統(tǒng)還有諸多不足,主要原因可歸結(jié)為以下幾類[2]。
1)通信參數(shù)配置繁瑣,不便于工程施工。
2)沒有監(jiān)測(cè)功能,系統(tǒng)無法獲知其實(shí)時(shí)工作狀態(tài),無法記錄上下行原始數(shù)據(jù),不便于故障分析處理。
3)通信端口不具備防雷功能,遠(yuǎn)距離連接時(shí)需要加額外的防雷保護(hù)器。
因此,有必要開發(fā)一種面向信號(hào)系統(tǒng)應(yīng)用的以太網(wǎng)轉(zhuǎn)CAN設(shè)備,克服上述缺點(diǎn)。
以太網(wǎng)轉(zhuǎn)CAN網(wǎng)關(guān)屬于數(shù)據(jù)轉(zhuǎn)發(fā)類設(shè)備,安全等級(jí)要求為SIL0級(jí),即非安全類設(shè)備,需要在設(shè)計(jì)時(shí)重點(diǎn)考慮其數(shù)據(jù)轉(zhuǎn)發(fā)效率和施工便捷性,但安全性也不容忽視。
系統(tǒng)采用單CPU架構(gòu),處理器選用AMCC公司的P o w e r P C405E P,其運(yùn)算速度達(dá)到608?DMIPS,足以保證雙向數(shù)據(jù)轉(zhuǎn)發(fā)的運(yùn)算要求[3]。如圖1所示,網(wǎng)關(guān)包含3路獨(dú)立CAN通信接口和2路獨(dú)立以太網(wǎng)接口,另外還提供CF卡接口通道,方便更新應(yīng)用程序和網(wǎng)絡(luò)通信配置數(shù)據(jù)。
PPC405EP片內(nèi)集成了EMAC/MDIO模塊,直接外擴(kuò)Intel?LXT971?PHY芯片,即可快速地實(shí)現(xiàn)OSI模型中數(shù)據(jù)鏈路層和物理層的功能。LXT971是快速以太網(wǎng)物理層自適應(yīng)收發(fā)器,支持IEEE?802.3標(biāo)準(zhǔn),提供MII接口,能夠與PPC405EP中的EMAC/MDIO模塊無縫連接。支持10/100?Mbit/s全雙工數(shù)據(jù)傳輸。
CAN總線接口芯片采用PHILIPS公司的SJA1000,該芯片具有64?Byte先進(jìn)先出FIFO,支持CAN2.0B協(xié)議,位速率可達(dá)1Mbit/s。由于其總線為數(shù)據(jù)、地址復(fù)用模式,需要單獨(dú)的ALE信號(hào),而PowerPC405EP的外部總線為數(shù)據(jù)、地址分離的Motorola模式,故要采用一些中間轉(zhuǎn)換環(huán)節(jié)以使兩種總線相互匹配。
如圖2所示,利用CPU的R/W、A27和CS3控制信號(hào)的邏輯組合可以產(chǎn)生ALE信號(hào),A27為低電平時(shí)ALE端可產(chǎn)生高電平鎖存地址信號(hào)。SJA1000的TX和RX信號(hào)經(jīng)過光電隔離后,由TJA1050T轉(zhuǎn)換為符合CAN電氣標(biāo)準(zhǔn)的差分信號(hào)[4]。
3.1.1 驅(qū)動(dòng)程序?qū)哟谓Y(jié)構(gòu)
以太網(wǎng)轉(zhuǎn)CAN網(wǎng)關(guān)采用嵌入式Linux操作系統(tǒng),SJA1000作為非常規(guī)新增外設(shè),需要撰寫新的設(shè)備驅(qū)動(dòng)程序供OS系統(tǒng)內(nèi)核調(diào)用。
如圖3所示,網(wǎng)關(guān)應(yīng)用程序運(yùn)行在OS最頂層;設(shè)備驅(qū)動(dòng)程序運(yùn)行在OS最底層,可直接操作外設(shè)芯片SJA1000的內(nèi)部寄存器。設(shè)備驅(qū)動(dòng)程序向OS內(nèi)核注冊(cè)成功后,應(yīng)用程序通過open、read和write操作指令調(diào)用設(shè)備驅(qū)動(dòng)程序,最終實(shí)現(xiàn)對(duì)SJA1000的寄存器級(jí)操作,完成CAN通信功能。
3.1.2 SJA1000驅(qū)動(dòng)程序軟件工作流程
在本系統(tǒng)中將SJA1000定義為字符型設(shè)備,其驅(qū)動(dòng)流程主要有以下步驟。
1)設(shè)備注冊(cè)及初始化。
2)接收應(yīng)用程序需要發(fā)送的CAN數(shù)據(jù)幀,并傳送至CAN控制器SJA1000。
3)響應(yīng)CAN總線接收中斷,讀取CAN接收數(shù)據(jù)幀并通知應(yīng)用程序。
4)CAN控制器出錯(cuò)處理。
驅(qū)動(dòng)程序?qū)⑸鲜龉δ芊庋b在open、close、write、ioctl等函數(shù)中以便應(yīng)用程序調(diào)用,運(yùn)行流程如圖4所示。Linux操作系統(tǒng)上電之后開始啟動(dòng)應(yīng)用程序,在其調(diào)用open()函數(shù)時(shí),執(zhí)行SJA1000的初始化工作,諸如設(shè)定波特率、驗(yàn)收濾波器、輸出方式等相關(guān)參數(shù)。而ioctl()函數(shù)則負(fù)責(zé)向系統(tǒng)注冊(cè)CAN接收中斷處理服務(wù)函數(shù)。
當(dāng)CAN控制器接收到來自其他設(shè)備的數(shù)據(jù)幀時(shí),SJA1000的中斷引腳會(huì)輸出低電平向PPC申請(qǐng)接收中斷,內(nèi)核的中斷處理程序會(huì)將接收數(shù)據(jù)讀出并寫入接收緩存,同時(shí)通知應(yīng)用程序,由其通過read()函數(shù)將緩存讀出。
CAN數(shù)據(jù)發(fā)送采用主動(dòng)模式,由應(yīng)用程序調(diào)用write()函數(shù)將數(shù)據(jù)直接寫入SJA1000發(fā)送緩沖寄存器,通過查詢狀態(tài)寄存器以確認(rèn)該幀是否成功發(fā)送。
另外,由于應(yīng)用場(chǎng)所不同,總線所處電磁環(huán)境及干擾水平也會(huì)有差異,總線由于受干擾而產(chǎn)生錯(cuò)誤不可避免,驅(qū)動(dòng)程序中會(huì)有專門的錯(cuò)誤中斷處理程序,在CAN控制器報(bào)告總線錯(cuò)誤時(shí)及時(shí)處理,故障嚴(yán)重時(shí)要立即復(fù)位總線。
3.2.1 CF卡總線地址分配
CF卡通過CPLD譯碼,直接掛接在PowerPC的EBC總線,工作在Memory模式,占用片選CS4。CF卡內(nèi)部的8個(gè)控制寄存器通過CPU地址線A31~A29、OE及WBE0組合譯碼后進(jìn)行讀寫訪問。CPU訪問CF卡控制寄存器的基地址為0xF0500000,詳細(xì)地址分配如表1所示。
表1 CPU訪問CF卡控制寄存器地址分配列表
3.2.2 CF卡讀寫操作
CF卡內(nèi)部數(shù)據(jù)以扇區(qū)為單元進(jìn)行存儲(chǔ),每個(gè)扇區(qū)為512?Byte,對(duì)其讀寫操作必須以扇區(qū)為單位。CF卡內(nèi)部集成ATA控制器,對(duì)外提供8個(gè)功能寄存器,CPU對(duì)內(nèi)部扇區(qū)的訪問都要通過讀寫上述功能寄存器。
如圖5所示,寫一個(gè)扇區(qū)的流程如下。
1)寄存器寫入扇區(qū)地址。
2)向命令寄存器寫入命令字“0x30”。
3)讀取狀態(tài)寄存器值為“0x58”,以表明其準(zhǔn)備好。
4)向數(shù)據(jù)寄存器連續(xù)寫入512?Byte,扇區(qū)內(nèi)偏移地址會(huì)自動(dòng)加1。
5)檢查狀態(tài)寄存器是否為“0x50”,確保寫入扇區(qū)成功。
CF卡的讀操作和寫操作類似,在此不再贅述。
3.2.3 FAT32文件系統(tǒng)
為了便于應(yīng)用軟件升級(jí)更新、通信參數(shù)快速配置,將Linux?kernel、文件系統(tǒng)、應(yīng)用程序和配置文件以FAT32格式存儲(chǔ)于CF卡中,這就需要uboot在引導(dǎo)系統(tǒng)啟動(dòng)時(shí)可以直接讀取CF卡中的數(shù)據(jù),并支持FAT32文件系統(tǒng)。
FAT文件系統(tǒng)源于DOS系統(tǒng),早期用于對(duì)大容量磁盤驅(qū)動(dòng)器的數(shù)據(jù)管理,按照柱面、磁頭、扇區(qū)對(duì)存儲(chǔ)區(qū)進(jìn)行尋址操作。CF卡沒有柱面和磁頭的概念,內(nèi)部僅以扇區(qū)的方式管理。
FAT32對(duì)數(shù)據(jù)按簇管理,每個(gè)文件占用整數(shù)倍個(gè)簇空間,MBR中記錄著當(dāng)前分區(qū)的起始扇區(qū)、結(jié)束扇區(qū)、文件系統(tǒng)類型、FAT表個(gè)數(shù)、每簇占用扇區(qū)數(shù)等參數(shù)。讀取FAT32格式的文件數(shù)據(jù)時(shí),需要初始化上述變量,通過查詢文件名找到文件存放的簇地址,讀完一簇后獲得下一簇的地址,直至所有數(shù)據(jù)讀取完畢[5]。
作為以太網(wǎng)轉(zhuǎn)CAN的網(wǎng)關(guān)設(shè)備,應(yīng)用程序的主要任務(wù)就是實(shí)現(xiàn)數(shù)據(jù)的雙向轉(zhuǎn)發(fā),Linux系統(tǒng)提供的多任務(wù)調(diào)度機(jī)制,將總?cè)蝿?wù)按照功能類別劃分為多個(gè)線程,可以獲得相對(duì)最簡(jiǎn)軟件架構(gòu)。不同線程間呈現(xiàn)較低的耦合度,為軟件升級(jí)和多人合作開發(fā)提供最大便利。為此,本系統(tǒng)任務(wù)線程主要包括以下幾種。
1)以太網(wǎng)、CAN通信參數(shù)初始化線程。該線程主要完成Socket參數(shù)的初始化工作,配置當(dāng)前設(shè)備的IP、發(fā)送及接收端口;同時(shí)配置每個(gè)CAN通道的波特率、屏蔽碼、驗(yàn)收濾波器等參數(shù)。配置成功后該線程主動(dòng)掛起,直至有其他線程將其喚醒并重新執(zhí)行配置初始化操作。
2)下行數(shù)據(jù)轉(zhuǎn)發(fā),即以太網(wǎng)通道數(shù)據(jù)接收、CAN通道發(fā)送線程。該線程循環(huán)監(jiān)聽接收以太網(wǎng)端口,當(dāng)收到有效UDP數(shù)據(jù)包后,根據(jù)通信協(xié)議將其拆分為CAN數(shù)據(jù)幀,寫入相應(yīng)CAN通道的發(fā)送緩沖區(qū),觸發(fā)CAN發(fā)送流程。應(yīng)用程序僅負(fù)責(zé)將所要發(fā)送的數(shù)據(jù)一次性填入發(fā)送隊(duì)列,在驅(qū)動(dòng)層通過查詢和中斷配合的方式,依次完成逐幀發(fā)送。
3)上行數(shù)據(jù)轉(zhuǎn)發(fā),即CAN通道數(shù)據(jù)接收、以太網(wǎng)通道數(shù)據(jù)發(fā)送線程。當(dāng)CAN通道有數(shù)據(jù)接收時(shí),驅(qū)動(dòng)層中斷處理程序?qū)JA1000接收緩存中的數(shù)據(jù)讀入內(nèi)存中并通知應(yīng)用程序,應(yīng)用程序響應(yīng)后將多個(gè)CAN幀序列按協(xié)議組成大包數(shù)據(jù),以UDP包的形式發(fā)送至以太網(wǎng)通道。
4)監(jiān)測(cè)數(shù)據(jù)發(fā)送進(jìn)程。根據(jù)設(shè)定周期間隔,系統(tǒng)將設(shè)備當(dāng)前運(yùn)行狀態(tài)發(fā)送至監(jiān)測(cè)機(jī),同時(shí)將上下行的原始數(shù)據(jù)打包后同步發(fā)至監(jiān)測(cè)機(jī)。
在信號(hào)系統(tǒng)中,控制中心指令數(shù)據(jù)和設(shè)備狀態(tài)數(shù)據(jù)都以固定周期循環(huán)發(fā)送,以太網(wǎng)轉(zhuǎn)CAN網(wǎng)關(guān)僅負(fù)責(zé)透明轉(zhuǎn)發(fā)。
對(duì)于上行數(shù)據(jù)(CAN接收,以太網(wǎng)發(fā)送),無論對(duì)端設(shè)備是否存在或以太網(wǎng)通道建立與否,數(shù)據(jù)以UDP包形式單次發(fā)送后立即釋放發(fā)送緩沖區(qū),陳舊歷史數(shù)據(jù)不會(huì)殘留至內(nèi)存,亦不會(huì)再次被發(fā)送。
但對(duì)于下行數(shù)據(jù)(以太網(wǎng)接收、CAN發(fā)送),由于CAN總線錯(cuò)誤或過于繁忙,某一幀堵在隊(duì)列內(nèi)長時(shí)間無法發(fā)送,直到總線恢復(fù)健康或其他節(jié)點(diǎn)釋放總線,該隊(duì)列內(nèi)的幀才會(huì)被逐一發(fā)送。這勢(shì)必會(huì)造成不可預(yù)知的安全隱患,因此,必須將過期數(shù)據(jù)及時(shí)清除。具體實(shí)現(xiàn)方法:設(shè)備接收到以太網(wǎng)數(shù)據(jù)包后記錄一個(gè)本地時(shí)間戳,該數(shù)據(jù)包內(nèi)的數(shù)據(jù)通過CAN總線發(fā)送時(shí)檢查當(dāng)前時(shí)間和該包接收時(shí)刻的時(shí)間差是否在允許范圍內(nèi),超過閾值則直接丟棄。
根據(jù)鐵路信號(hào)系統(tǒng)應(yīng)用的特點(diǎn),設(shè)計(jì)了一種以太網(wǎng)轉(zhuǎn)CAN接口的方案,較既有成熟產(chǎn)品增加了CF卡數(shù)據(jù)配置功能,提供獨(dú)立的監(jiān)測(cè)數(shù)據(jù)發(fā)送以太網(wǎng)專用通道。針對(duì)信號(hào)系統(tǒng)對(duì)傳輸指令數(shù)據(jù)時(shí)效性的要求,對(duì)過期數(shù)據(jù)及時(shí)清除,防止陳舊的歷史數(shù)據(jù)被錯(cuò)誤轉(zhuǎn)發(fā)而造成安全隱患。經(jīng)前期實(shí)驗(yàn)室驗(yàn)證表明,該方案通用性強(qiáng)、便于維護(hù),具有良好地用戶體驗(yàn),在信號(hào)控制系統(tǒng)中應(yīng)該具有良好的應(yīng)用前景。
[1] 王永翔, 王立德.多播交換式CAN總線與以太網(wǎng)互聯(lián)網(wǎng)關(guān)設(shè)計(jì)[J].電子測(cè)量與儀器學(xué)報(bào),2007,21(3):83-87.
[2] 李加升, 李寧, 曾哲.基于CAN總線與以太網(wǎng)的嵌入式網(wǎng)關(guān)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2009, 32(14):69-77.
[3] 葉梅, 趙京偉, 初元萍.嵌入式Linux系統(tǒng)在PowerPC上的實(shí)現(xiàn)[J].核電子學(xué)與探測(cè)技術(shù),2006, 26(5):614-617.
[4] Philips Semiconductors.SJA1000 Stand-alone CAN controller.2000.
[5] Microsoft Corporation.Microsoft Extensible Firmware Initiative FAT32 File System Specification.