徐 敏
摘 要:針對以太網(wǎng)與CAN現(xiàn)場總線之間互連的需求,提出一種基于ARM的嵌入式網(wǎng)關(guān)系統(tǒng)設計與實現(xiàn),分別從網(wǎng)關(guān)硬件系統(tǒng)組成、協(xié)議轉(zhuǎn)換流程以及嵌入式Linux下CAN設備驅(qū)動程序的開發(fā)方法進行分析與設計。通過軟、硬件平臺的搭建與測試,實現(xiàn)了以太網(wǎng)與CAN現(xiàn)場總線之間的協(xié)議轉(zhuǎn)換,為CAN/Ethernet的互連提供了一種傳輸速度快、成本低、穩(wěn)定性高的網(wǎng)關(guān)解決方案。
關(guān)鍵詞:網(wǎng)關(guān)設計;CAN總線;協(xié)議轉(zhuǎn)換;驅(qū)動程序
中圖分類號:TP393文獻標識碼:B
文章編號:1004-373X(2009)12-131-03
Design and Realization of Embedded Gateway System Based on ARM
XU Min
(Xiamen University of Technology,Xiamen,361024,China)
Abstract:For the demands of interconnection between Ethernet and CAN fieldbus,ARM-based embedded gateway system is designed and implemented.Analysis and design are carried on respectively from the structure of gateway hardware systems,the processes of protocol transitions and development method of CAN device drivers under the embedded Linux.The protocol conversion between Ethernet and CAN fieldbus is achieved through the build and test of the hardware and software platform.In this paper,a gateway solution for the interconnection of CAN/Ethernet is provided with rapid-transmission,low- cost and high-stability.
Keywords:gateway design;CAN Bus;protocol conversion;driver program
0 引 言
CAN (Controller Area Network)為控制器局域網(wǎng)絡,CAN總線規(guī)范已經(jīng)被國際標準化組織制訂為國際標準ISO11898,并得到眾多半導體器件廠商的支持,推出各種集成有CAN協(xié)議的產(chǎn)品。CAN屬于總線式串行通信網(wǎng)絡,由于其采用了許多新技術(shù)和獨特的設計,低成本、高可靠性、實時性、靈活性、抗干擾能力強等特點,已被廣泛應用于各個自動化控制系統(tǒng)中。在汽車電子、自動控制、電力系統(tǒng)等領(lǐng)域,CAN總線具有無可比擬的優(yōu)越性[1]。
以太網(wǎng)以其通信數(shù)據(jù)量大、傳輸速度快、開放性好、成本低等優(yōu)點,彌補了現(xiàn)場總線通信速率低的缺陷,成為現(xiàn)階段信息網(wǎng)絡應用最廣的局域網(wǎng)技術(shù)。用以太網(wǎng)直接進入工業(yè)控制領(lǐng)域,目前還存在一些問題,以太網(wǎng)的媒體訪問方式CSDA/CD不能保證網(wǎng)絡傳輸?shù)拇_定性和實時性,不能滿足工業(yè)現(xiàn)場惡劣環(huán)境的要求。將以太網(wǎng)引入工業(yè)測控領(lǐng)域,通過與現(xiàn)場總線(CAN BUS)分工合作,構(gòu)成兩種異構(gòu)網(wǎng)絡結(jié)構(gòu),將高效的以太網(wǎng)和低速的現(xiàn)場總線相結(jié)合,解決大規(guī)模測控系統(tǒng)實時性和可靠性矛盾,提高整個系統(tǒng)的工作效率。兩種異構(gòu)網(wǎng)絡的互連,需要用嵌入式網(wǎng)關(guān)實現(xiàn)。
CAN/Ethernet網(wǎng)關(guān)設計的主要任務是協(xié)議轉(zhuǎn)換,要求數(shù)據(jù)解析正確完整,同時響應迅速、耗時低、實時性和安全性好?;赗ISC架構(gòu)的ARM微處理器指令執(zhí)行效率高,軟件操作平臺易于建設,同時具備豐富的外圍擴展電路,能滿足實時多任務要求。使用ARM技術(shù)構(gòu)造以太網(wǎng)與CAN現(xiàn)場總線協(xié)議轉(zhuǎn)換網(wǎng)關(guān)是一種高效可行的方案。
1 網(wǎng)關(guān)硬件系統(tǒng)組成
網(wǎng)關(guān)的主要功能是進行以太網(wǎng)數(shù)據(jù)報文與CAN數(shù)據(jù)幀之間的協(xié)議轉(zhuǎn)換,實現(xiàn)以太網(wǎng)與CAN總線的互聯(lián)。系統(tǒng)的硬件組成包括CAN總線接口設計和以太網(wǎng)接口設計,如圖1所示。
S3C2410 是Samsung公司推出的一款低價位、低功耗、高性能的32 位RISC 嵌入式處理器。該芯片采用ARM920T內(nèi)核,5級流水線和哈佛結(jié)構(gòu),工作頻率高達266 MHz,運行速度可達1.1 MIPS。S3C2410 提供了豐富的內(nèi)部資源,如:SDRAM控制器、LCD 控制器、3 通道的UART、4 通道的DMA、2 個SPI 模塊,支持輪詢、中斷與DMA三種數(shù)據(jù)發(fā)送模式。雖然內(nèi)部沒有CAN 控制器,但可以通過SPI 接口進行擴展,接口電路簡單,易于實現(xiàn)[2]。
圖1 網(wǎng)關(guān)硬件接口原理圖
CAN總線接口電路主要采用帶SPI接口的獨立CAN控制器MCP2510、CAN總線收發(fā)器TJA1050、高速光隔6N137和DC/DC電源隔離模塊DCR010505等設備組成。獨立CAN控制器MCP2510完全支持CAN總線的V 2.0A和V 2.0B 的技術(shù)規(guī)范。系統(tǒng)設計時,將MCP2510 作為從設備連接到S3C2410 的SPI0 口[3]。TJA1050總線收發(fā)器是CAN控制器和物理總線之間的接口芯片,增強了總線的驅(qū)動能力。為增強CAN總線節(jié)點的抗干擾能力,MCP2510的TXCAN 和RXCON并不直接與TJA1050的TXD和RXD相連,而是通過兩片光電耦合器6N137與TJA1050相連,同時光隔芯片的兩端電源采用DC/DC模塊進行隔離。這樣就實現(xiàn)了系統(tǒng)外總線CAN節(jié)點間的完全電氣隔離,增強了節(jié)點的穩(wěn)定性和安全性??偩€兩端都接有1個終端電阻(120 Ω)和1個TVS管,以消除反射信號,有效提高系統(tǒng)的抗干擾能力。
以太網(wǎng)接口電路是在S3C2410片上擴展網(wǎng)絡接口芯片RTL8019AS,RTL8019AS是臺灣REALTEK公司生產(chǎn)的一種基于ISA總線的高度集成的以太網(wǎng)控制器。它實現(xiàn)了以太網(wǎng)媒介訪問層(MAC)和物理層(PHY)的全部功能,包括MAC數(shù)據(jù)幀的收發(fā)、地址識別、循環(huán)冗余檢驗(Cyclic Redundancy Check,CRC)編碼/校驗、曼徹斯特編解碼、超時重傳、鏈路完整性測試、信號極性檢測與糾正等。RTL8019AS與主處理器有3種接口模式,跳線模式(Jumper),即插即用模式(PnP)和免跳線模式(Jumperless)。系統(tǒng)采用常見的跳線模式來選擇I/O端口和中斷[4]。
2 協(xié)議轉(zhuǎn)換流程
當CAN總線上的設備向Ethernet網(wǎng)發(fā)送數(shù)據(jù)時,嵌入式網(wǎng)關(guān)將接收到的CAN數(shù)據(jù)包解析,提取數(shù)據(jù)域中的內(nèi)容;然后按照TCP/IP協(xié)議進行封裝,嵌入式網(wǎng)關(guān)將經(jīng)過封裝的數(shù)據(jù)發(fā)送給以太網(wǎng)控制芯片RTL8019AS。由RTL8019AS自動給這些數(shù)據(jù)添加以太網(wǎng)物理層和邏輯鏈路層所需的相關(guān)信息,通過物理接口傳送到以太網(wǎng)。反之,當以太網(wǎng)向CAN總線上設備發(fā)送TCP/IP 數(shù)據(jù)包時,它首先將數(shù)據(jù)發(fā)送到RTL8019AS,嵌入式網(wǎng)關(guān)從RTL8019AS中接收到數(shù)據(jù)后,提取實際要傳送的數(shù)據(jù),然后封裝成CAN總線數(shù)據(jù)格式,通過CAN總線將數(shù)據(jù)發(fā)送到網(wǎng)絡中的現(xiàn)場設備。
嵌入式網(wǎng)關(guān)硬件必須具有以太網(wǎng)接口和CAN 總線接口,而軟件要有TCP/IP 協(xié)議棧和CAN 總線驅(qū)動程序;通常嵌入式Linux 內(nèi)核中有完整的TCP/IP協(xié)議棧。由于REALTEK公司支持Linux的開發(fā),Linux系統(tǒng)中已含有RTL8019AS芯片的通用驅(qū)動程序,CAN 總線協(xié)議驅(qū)動并不是標準配置。因此,設計CAN 總線接口及其編制驅(qū)動程序是實現(xiàn)嵌入式網(wǎng)關(guān)最主要的工作[5]。
3 CAN驅(qū)動程序設計
Linux 驅(qū)動程序?qū)儆贚inux 內(nèi)核的一部分,是嵌入式系統(tǒng)控制硬件的接口,它為用戶屏蔽設備的工作細節(jié),并向用戶提供透明訪問硬件設備的機制。驅(qū)動程序的開發(fā)在嵌入式系統(tǒng)開發(fā)中具有舉足輕重的地位。開發(fā)出穩(wěn)定、完備的驅(qū)動程序可提高整個系統(tǒng)的性能。
3.1 CAN驅(qū)動程序流程
MCP2510 的內(nèi)部結(jié)構(gòu)框圖如圖2所示。MCP2510內(nèi)含3個發(fā)送緩沖器和2個接收緩沖器,同時還具有靈活的中斷管理能力。CAN協(xié)議機負責與CAN總線的接口,SPI接口邏輯用于實現(xiàn)同MCU 的通信,而寄存、緩沖器組與控制邏輯則用來完成各種方式的設定和操作控制[6]。
圖2 MCP2510 內(nèi)部結(jié)構(gòu)框圖
在Linux多任務操作系統(tǒng)中,CAN總線通信程序的設計可分為發(fā)送數(shù)據(jù)模塊、接收等待模塊和中斷處理模塊實現(xiàn)。系統(tǒng)中CAN總線的數(shù)據(jù)發(fā)送和接收是兩個不同的線程。在驅(qū)動程序中建立數(shù)據(jù)發(fā)送和接收緩沖區(qū)。中斷處理程序只負責填充(或讀取)緩沖區(qū)中的數(shù)據(jù),然后喚醒等待接收(或發(fā)送)數(shù)據(jù)的任務。數(shù)據(jù)的發(fā)送與接收都通過獨立的緩沖區(qū),并由中斷來實現(xiàn)。操作系統(tǒng)的中斷響應時間在軟件上決定了CAN總線數(shù)據(jù)的最快收發(fā)速度。
3.2 CAN設備驅(qū)動程序的實現(xiàn)要點
3.2.1 CAN設備驅(qū)動操作函數(shù)
CAN 設備驅(qū)動程序最終提供給應用程序的是一個流控制接口,主要包括:open,realse,read,write,ioctl 等操作。添加設備驅(qū)動程序,實際上就是給上述操作編寫相應的程序代碼[7-9]。驅(qū)動程序加載到內(nèi)核時,會首先運行驅(qū)動程序的初始化函數(shù),然后等待系統(tǒng)調(diào)用在file_operations 數(shù)據(jù)結(jié)構(gòu)中定義的相關(guān)函數(shù),實現(xiàn)對設備的操作。系統(tǒng)使用Linux 2.4.18版本,其文件系統(tǒng)接口被寫義為:
static struct file_operations s3c2410_fops = {
owner: THIS_MODULE,
open: s3c2410_mcp2510_open,
read:s3c2410_mcp2510_read,
write: s3c2410_mcp2510_write,
ioctl: s3c2410_mcp2510_ioctl,
release: s3c2410_mcp2510_release,
};
s3c2410_mcp2510_open 負責對將要進行的I/O操作做好必要的準備工作,主要包括限制CAN打開次數(shù)、清空3個發(fā)送緩沖區(qū)和2個接收緩沖區(qū)等。
s3c2410_mcp2510_write 將要發(fā)送的數(shù)據(jù)通過SPI 總線將數(shù)據(jù)傳送MCP2510 的發(fā)送緩沖器,再通過MCP2510 將數(shù)據(jù)發(fā)送到CAN總線。
s3c2410_mcp2510_read 用于將MCP2510 從CAN 總線上接收到接收緩沖器的數(shù)據(jù),通過SPI 總線讀到用戶區(qū),并返回所讀出的字節(jié)數(shù)。
s3c2410_mcp2510_ioctl 用于控制CAN總線通信的波特率、設置幀ID、設置工作模式、設置設備濾波器等工作。
s3c2410_mcp2510_release 用于釋放所占用的內(nèi)存、中斷等資源。
3.2.2 CAN 設備的初始化函數(shù)
CAN 設備的初始化函數(shù)主要負責創(chuàng)建CAN 設備的節(jié)點設備文件、注冊CAN 設備的中斷處理函數(shù)、初始化MCP2510 等工作。
static int _init s3c2410_mcp2510_init(void)
{ …
init_MCP2510(BandRate_250kbps);
ret=register_chrdev(0,DEVICE_NAME,&s3c2410;_fops);
tsMajor=ret;
…
ret=request_irq(IRQ_MCP2510,s3c2410_isr_mcp2510,SA_INTERRUPT,DEVICE_NAME,s3c2410_isr_mcp2510);
#ifdef CONFIG_DEVFS_FS
devfs_can_dir=devfs_mk_dir(NULL,"can",NULL);
devfs_canraw =devfs_register ( devfs_can_dir,"0",DEVFS_FL_DEFAULT,tsMajor,SPIRAW_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,&s3c2410;_fops,NULL);
#endif
…
return 0;
}
在Linux系統(tǒng)中,初始化函數(shù)從s3c2410_mcp2510_init( )開始。通過調(diào)用register_chrdev 向系統(tǒng)注冊字符型設備驅(qū)動程序;通過devfs_register( )函數(shù)創(chuàng)建設備文件系統(tǒng)的CAN設備節(jié)點。同時,CAN設備驅(qū)動程序通過調(diào)用request_irq 函數(shù)來申請中斷,向系統(tǒng)注冊CAN設備的CAN中斷處理函數(shù)s3c2410_isr_mcp2510( )。在實現(xiàn)了MCP2510的各個接口函數(shù)后,還需要編寫MCP2510 的模塊加載函數(shù)module_init( )和模塊卸載函數(shù)module_exit( ),用于向內(nèi)核注冊設備及注銷設備[10]。
3.2.3 驅(qū)動程序的加載與使用
Linux設備驅(qū)動會以內(nèi)核模塊的形式出現(xiàn)。Ethernet/CAN 網(wǎng)關(guān)設備驅(qū)動程序作為內(nèi)核的一部分,應在編譯時把設備驅(qū)動程序編譯成可加載的模塊。當使用insmod命令加載內(nèi)核模塊時,模塊的加載函數(shù)module_init(初始化函數(shù)名)會自動被內(nèi)核執(zhí)行,將初始化函數(shù)加入內(nèi)核全局初始化函數(shù)列表中,在內(nèi)核初始化時執(zhí)行驅(qū)動的初始化函數(shù),從而完成驅(qū)動的初始化和注冊,之后驅(qū)動便停止等待,被應用程序調(diào)用。當用rmmod 命令卸載某內(nèi)核模塊時,模塊的卸載函數(shù)module_exit(退出處理函數(shù)名)也會自動被內(nèi)核執(zhí)行,完成與模塊加載函數(shù)相反的功能。當驅(qū)動程序加載到內(nèi)核中后,就可將CAN設備文件進行open,read,write,release等操作。
4 結(jié) 語
隨著工業(yè)控制系統(tǒng)性能的提高,以太網(wǎng)在工業(yè)上的應用也會越來越廣泛。在此詳細介紹了一種嵌入式網(wǎng)關(guān)的設計與實現(xiàn)。作為連接以太網(wǎng)和現(xiàn)場總線的紐帶,實現(xiàn)以太網(wǎng)與CAN現(xiàn)場總線之間的協(xié)議轉(zhuǎn)換,為CAN/Ethernet的互聯(lián)提供了一種傳輸速度快、成本低,穩(wěn)定性和安全性高的解決方案。同時,利用嵌入式ARM處理器,接口資源豐富,設計通用性強,便于擴展其他現(xiàn)場總線與以太網(wǎng)的互聯(lián),具有較好的應用推廣價值。
參考文獻
[1]李正軍.現(xiàn)場總線及其應用技術(shù)[M].北京:機械工業(yè)出版社,2008.
[2]Samsung Electronics Limited.User′s Manual of S3C2410[Z].2002.
[3]MicroChip Technology Inc.MCP2510 data sheet.2002.
[4]符意德,陸陽.嵌入式系統(tǒng)原理及接口技術(shù)[M].北京:清華大學出版社,2007.
[5]羅苑棠,楊宗德.嵌入式Linux應用系統(tǒng)開發(fā)實例精講[M].北京:電子工業(yè)出版社,2007.
[6]楊慶華,張景元.單片機和MCP2510 的CAN 總線通信模塊設計[J].單片機與嵌入式系統(tǒng)應用,2007(3):35-37.
[7]邵如峰,宋益青.基于ARM9和嵌入式Linux的CAN網(wǎng)關(guān)設計[J].微計算機信息,2008(24):15-16.
[8]陳祖爵,周明.嵌入式Linux 下CAN 控制器的驅(qū)動程序設計[J].計算機工程與設計,2006(11):4 097-4 100.
[9]劉淼.嵌入式系統(tǒng)接口設計與Linux驅(qū)動程序開發(fā)[M].北京:北京航空航天大學出版社,2006.
[10]宋寶華.Linux設備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2008.
作者簡介 徐 敏 男,1963年出生,福建龍巖人,副教授。主要研究方向為嵌入式技術(shù)與智能控制。