劉 貞
(北京全路通信信號研究設計院有限公司,北京 100073)
近年來,以太網(wǎng)作為一種高效、便捷的通信方式逐漸應用于鐵路信號設備通信領域。通過架設封閉物理網(wǎng)絡并配合安全通信協(xié)議,可以構建相對安全的數(shù)據(jù)通信網(wǎng)絡。
鐵路信號系統(tǒng)設備復雜多樣,涉及不同廠家、不同歷史年代的產品,故數(shù)據(jù)通信總線接口種類繁多,如CAN總線、RS-485/422總線、profibus總線等。當不同總線類的設備需要互聯(lián)互通時,就需要總線接口轉換裝置,一般稱之為接口適配器或網(wǎng)關[1]。本文介紹一種基于嵌入式系統(tǒng)的以太網(wǎng)轉CAN總線設計方案,盡管目前此類設備較多且早已上市,但直接應用信號系統(tǒng)還有諸多不足,主要原因可歸結為以下幾類[2]。
1)通信參數(shù)配置繁瑣,不便于工程施工。
2)沒有監(jiān)測功能,系統(tǒng)無法獲知其實時工作狀態(tài),無法記錄上下行原始數(shù)據(jù),不便于故障分析處理。
3)通信端口不具備防雷功能,遠距離連接時需要加額外的防雷保護器。
因此,有必要開發(fā)一種面向信號系統(tǒng)應用的以太網(wǎng)轉CAN設備,克服上述缺點。
以太網(wǎng)轉CAN網(wǎng)關屬于數(shù)據(jù)轉發(fā)類設備,安全等級要求為SIL0級,即非安全類設備,需要在設計時重點考慮其數(shù)據(jù)轉發(fā)效率和施工便捷性,但安全性也不容忽視。
系統(tǒng)采用單CPU架構,處理器選用AMCC公司的P o w e r P C405E P,其運算速度達到608?DMIPS,足以保證雙向數(shù)據(jù)轉發(fā)的運算要求[3]。如圖1所示,網(wǎng)關包含3路獨立CAN通信接口和2路獨立以太網(wǎng)接口,另外還提供CF卡接口通道,方便更新應用程序和網(wǎng)絡通信配置數(shù)據(jù)。

PPC405EP片內集成了EMAC/MDIO模塊,直接外擴Intel?LXT971?PHY芯片,即可快速地實現(xiàn)OSI模型中數(shù)據(jù)鏈路層和物理層的功能。LXT971是快速以太網(wǎng)物理層自適應收發(fā)器,支持IEEE?802.3標準,提供MII接口,能夠與PPC405EP中的EMAC/MDIO模塊無縫連接。支持10/100?Mbit/s全雙工數(shù)據(jù)傳輸。
CAN總線接口芯片采用PHILIPS公司的SJA1000,該芯片具有64?Byte先進先出FIFO,支持CAN2.0B協(xié)議,位速率可達1Mbit/s。由于其總線為數(shù)據(jù)、地址復用模式,需要單獨的ALE信號,而PowerPC405EP的外部總線為數(shù)據(jù)、地址分離的Motorola模式,故要采用一些中間轉換環(huán)節(jié)以使兩種總線相互匹配。
如圖2所示,利用CPU的R/W、A27和CS3控制信號的邏輯組合可以產生ALE信號,A27為低電平時ALE端可產生高電平鎖存地址信號。SJA1000的TX和RX信號經(jīng)過光電隔離后,由TJA1050T轉換為符合CAN電氣標準的差分信號[4]。

3.1.1 驅動程序層次結構
以太網(wǎng)轉CAN網(wǎng)關采用嵌入式Linux操作系統(tǒng),SJA1000作為非常規(guī)新增外設,需要撰寫新的設備驅動程序供OS系統(tǒng)內核調用。
如圖3所示,網(wǎng)關應用程序運行在OS最頂層;設備驅動程序運行在OS最底層,可直接操作外設芯片SJA1000的內部寄存器。設備驅動程序向OS內核注冊成功后,應用程序通過open、read和write操作指令調用設備驅動程序,最終實現(xiàn)對SJA1000的寄存器級操作,完成CAN通信功能。

3.1.2 SJA1000驅動程序軟件工作流程
在本系統(tǒng)中將SJA1000定義為字符型設備,其驅動流程主要有以下步驟。
1)設備注冊及初始化。
2)接收應用程序需要發(fā)送的CAN數(shù)據(jù)幀,并傳送至CAN控制器SJA1000。
3)響應CAN總線接收中斷,讀取CAN接收數(shù)據(jù)幀并通知應用程序。
4)CAN控制器出錯處理。
驅動程序將上述功能封裝在open、close、write、ioctl等函數(shù)中以便應用程序調用,運行流程如圖4所示。Linux操作系統(tǒng)上電之后開始啟動應用程序,在其調用open()函數(shù)時,執(zhí)行SJA1000的初始化工作,諸如設定波特率、驗收濾波器、輸出方式等相關參數(shù)。而ioctl()函數(shù)則負責向系統(tǒng)注冊CAN接收中斷處理服務函數(shù)。
當CAN控制器接收到來自其他設備的數(shù)據(jù)幀時,SJA1000的中斷引腳會輸出低電平向PPC申請接收中斷,內核的中斷處理程序會將接收數(shù)據(jù)讀出并寫入接收緩存,同時通知應用程序,由其通過read()函數(shù)將緩存讀出。
CAN數(shù)據(jù)發(fā)送采用主動模式,由應用程序調用write()函數(shù)將數(shù)據(jù)直接寫入SJA1000發(fā)送緩沖寄存器,通過查詢狀態(tài)寄存器以確認該幀是否成功發(fā)送。

另外,由于應用場所不同,總線所處電磁環(huán)境及干擾水平也會有差異,總線由于受干擾而產生錯誤不可避免,驅動程序中會有專門的錯誤中斷處理程序,在CAN控制器報告總線錯誤時及時處理,故障嚴重時要立即復位總線。
3.2.1 CF卡總線地址分配
CF卡通過CPLD譯碼,直接掛接在PowerPC的EBC總線,工作在Memory模式,占用片選CS4。CF卡內部的8個控制寄存器通過CPU地址線A31~A29、OE及WBE0組合譯碼后進行讀寫訪問。CPU訪問CF卡控制寄存器的基地址為0xF0500000,詳細地址分配如表1所示。

表1 CPU訪問CF卡控制寄存器地址分配列表
3.2.2 CF卡讀寫操作
CF卡內部數(shù)據(jù)以扇區(qū)為單元進行存儲,每個扇區(qū)為512?Byte,對其讀寫操作必須以扇區(qū)為單位。CF卡內部集成ATA控制器,對外提供8個功能寄存器,CPU對內部扇區(qū)的訪問都要通過讀寫上述功能寄存器。
如圖5所示,寫一個扇區(qū)的流程如下。

1)寄存器寫入扇區(qū)地址。
2)向命令寄存器寫入命令字“0x30”。
3)讀取狀態(tài)寄存器值為“0x58”,以表明其準備好。
4)向數(shù)據(jù)寄存器連續(xù)寫入512?Byte,扇區(qū)內偏移地址會自動加1。
5)檢查狀態(tài)寄存器是否為“0x50”,確保寫入扇區(qū)成功。
CF卡的讀操作和寫操作類似,在此不再贅述。
3.2.3 FAT32文件系統(tǒng)
為了便于應用軟件升級更新、通信參數(shù)快速配置,將Linux?kernel、文件系統(tǒng)、應用程序和配置文件以FAT32格式存儲于CF卡中,這就需要uboot在引導系統(tǒng)啟動時可以直接讀取CF卡中的數(shù)據(jù),并支持FAT32文件系統(tǒng)。
FAT文件系統(tǒng)源于DOS系統(tǒng),早期用于對大容量磁盤驅動器的數(shù)據(jù)管理,按照柱面、磁頭、扇區(qū)對存儲區(qū)進行尋址操作。CF卡沒有柱面和磁頭的概念,內部僅以扇區(qū)的方式管理。
FAT32對數(shù)據(jù)按簇管理,每個文件占用整數(shù)倍個簇空間,MBR中記錄著當前分區(qū)的起始扇區(qū)、結束扇區(qū)、文件系統(tǒng)類型、FAT表個數(shù)、每簇占用扇區(qū)數(shù)等參數(shù)。讀取FAT32格式的文件數(shù)據(jù)時,需要初始化上述變量,通過查詢文件名找到文件存放的簇地址,讀完一簇后獲得下一簇的地址,直至所有數(shù)據(jù)讀取完畢[5]。
作為以太網(wǎng)轉CAN的網(wǎng)關設備,應用程序的主要任務就是實現(xiàn)數(shù)據(jù)的雙向轉發(fā),Linux系統(tǒng)提供的多任務調度機制,將總任務按照功能類別劃分為多個線程,可以獲得相對最簡軟件架構。不同線程間呈現(xiàn)較低的耦合度,為軟件升級和多人合作開發(fā)提供最大便利。為此,本系統(tǒng)任務線程主要包括以下幾種。
1)以太網(wǎng)、CAN通信參數(shù)初始化線程。該線程主要完成Socket參數(shù)的初始化工作,配置當前設備的IP、發(fā)送及接收端口;同時配置每個CAN通道的波特率、屏蔽碼、驗收濾波器等參數(shù)。配置成功后該線程主動掛起,直至有其他線程將其喚醒并重新執(zhí)行配置初始化操作。
2)下行數(shù)據(jù)轉發(fā),即以太網(wǎng)通道數(shù)據(jù)接收、CAN通道發(fā)送線程。該線程循環(huán)監(jiān)聽接收以太網(wǎng)端口,當收到有效UDP數(shù)據(jù)包后,根據(jù)通信協(xié)議將其拆分為CAN數(shù)據(jù)幀,寫入相應CAN通道的發(fā)送緩沖區(qū),觸發(fā)CAN發(fā)送流程。應用程序僅負責將所要發(fā)送的數(shù)據(jù)一次性填入發(fā)送隊列,在驅動層通過查詢和中斷配合的方式,依次完成逐幀發(fā)送。
3)上行數(shù)據(jù)轉發(fā),即CAN通道數(shù)據(jù)接收、以太網(wǎng)通道數(shù)據(jù)發(fā)送線程。當CAN通道有數(shù)據(jù)接收時,驅動層中斷處理程序將SJA1000接收緩存中的數(shù)據(jù)讀入內存中并通知應用程序,應用程序響應后將多個CAN幀序列按協(xié)議組成大包數(shù)據(jù),以UDP包的形式發(fā)送至以太網(wǎng)通道。
4)監(jiān)測數(shù)據(jù)發(fā)送進程。根據(jù)設定周期間隔,系統(tǒng)將設備當前運行狀態(tài)發(fā)送至監(jiān)測機,同時將上下行的原始數(shù)據(jù)打包后同步發(fā)至監(jiān)測機。
在信號系統(tǒng)中,控制中心指令數(shù)據(jù)和設備狀態(tài)數(shù)據(jù)都以固定周期循環(huán)發(fā)送,以太網(wǎng)轉CAN網(wǎng)關僅負責透明轉發(fā)。
對于上行數(shù)據(jù)(CAN接收,以太網(wǎng)發(fā)送),無論對端設備是否存在或以太網(wǎng)通道建立與否,數(shù)據(jù)以UDP包形式單次發(fā)送后立即釋放發(fā)送緩沖區(qū),陳舊歷史數(shù)據(jù)不會殘留至內存,亦不會再次被發(fā)送。
但對于下行數(shù)據(jù)(以太網(wǎng)接收、CAN發(fā)送),由于CAN總線錯誤或過于繁忙,某一幀堵在隊列內長時間無法發(fā)送,直到總線恢復健康或其他節(jié)點釋放總線,該隊列內的幀才會被逐一發(fā)送。這勢必會造成不可預知的安全隱患,因此,必須將過期數(shù)據(jù)及時清除。具體實現(xiàn)方法:設備接收到以太網(wǎng)數(shù)據(jù)包后記錄一個本地時間戳,該數(shù)據(jù)包內的數(shù)據(jù)通過CAN總線發(fā)送時檢查當前時間和該包接收時刻的時間差是否在允許范圍內,超過閾值則直接丟棄。
根據(jù)鐵路信號系統(tǒng)應用的特點,設計了一種以太網(wǎng)轉CAN接口的方案,較既有成熟產品增加了CF卡數(shù)據(jù)配置功能,提供獨立的監(jiān)測數(shù)據(jù)發(fā)送以太網(wǎng)專用通道。針對信號系統(tǒng)對傳輸指令數(shù)據(jù)時效性的要求,對過期數(shù)據(jù)及時清除,防止陳舊的歷史數(shù)據(jù)被錯誤轉發(fā)而造成安全隱患。經(jīng)前期實驗室驗證表明,該方案通用性強、便于維護,具有良好地用戶體驗,在信號控制系統(tǒng)中應該具有良好的應用前景。
[1] 王永翔, 王立德.多播交換式CAN總線與以太網(wǎng)互聯(lián)網(wǎng)關設計[J].電子測量與儀器學報,2007,21(3):83-87.
[2] 李加升, 李寧, 曾哲.基于CAN總線與以太網(wǎng)的嵌入式網(wǎng)關設計[J].現(xiàn)代電子技術,2009, 32(14):69-77.
[3] 葉梅, 趙京偉, 初元萍.嵌入式Linux系統(tǒng)在PowerPC上的實現(xiàn)[J].核電子學與探測技術,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.