徐 敏
摘 要:針對以太網與CAN現場總線之間互連的需求,提出一種基于ARM的嵌入式網關系統設計與實現,分別從網關硬件系統組成、協議轉換流程以及嵌入式Linux下CAN設備驅動程序的開發方法進行分析與設計。通過軟、硬件平臺的搭建與測試,實現了以太網與CAN現場總線之間的協議轉換,為CAN/Ethernet的互連提供了一種傳輸速度快、成本低、穩定性高的網關解決方案。
關鍵詞:網關設計;CAN總線;協議轉換;驅動程序
中圖分類號: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)為控制器局域網絡,CAN總線規范已經被國際標準化組織制訂為國際標準ISO11898,并得到眾多半導體器件廠商的支持,推出各種集成有CAN協議的產品。CAN屬于總線式串行通信網絡,由于其采用了許多新技術和獨特的設計,低成本、高可靠性、實時性、靈活性、抗干擾能力強等特點,已被廣泛應用于各個自動化控制系統中。在汽車電子、自動控制、電力系統等領域,CAN總線具有無可比擬的優越性[1]。
以太網以其通信數據量大、傳輸速度快、開放性好、成本低等優點,彌補了現場總線通信速率低的缺陷,成為現階段信息網絡應用最廣的局域網技術。用以太網直接進入工業控制領域,目前還存在一些問題,以太網的媒體訪問方式CSDA/CD不能保證網絡傳輸的確定性和實時性,不能滿足工業現場惡劣環境的要求。將以太網引入工業測控領域,通過與現場總線(CAN BUS)分工合作,構成兩種異構網絡結構,將高效的以太網和低速的現場總線相結合,解決大規模測控系統實時性和可靠性矛盾,提高整個系統的工作效率。兩種異構網絡的互連,需要用嵌入式網關實現。
CAN/Ethernet網關設計的主要任務是協議轉換,要求數據解析正確完整,同時響應迅速、耗時低、實時性和安全性好。基于RISC架構的ARM微處理器指令執行效率高,軟件操作平臺易于建設,同時具備豐富的外圍擴展電路,能滿足實時多任務要求。使用ARM技術構造以太網與CAN現場總線協議轉換網關是一種高效可行的方案。
1 網關硬件系統組成
網關的主要功能是進行以太網數據報文與CAN數據幀之間的協議轉換,實現以太網與CAN總線的互聯。系統的硬件組成包括CAN總線接口設計和以太網接口設計,如圖1所示。
S3C2410 是Samsung公司推出的一款低價位、低功耗、高性能的32 位RISC 嵌入式處理器。該芯片采用ARM920T內核,5級流水線和哈佛結構,工作頻率高達266 MHz,運行速度可達1.1 MIPS。S3C2410 提供了豐富的內部資源,如:SDRAM控制器、LCD 控制器、3 通道的UART、4 通道的DMA、2 個SPI 模塊,支持輪詢、中斷與DMA三種數據發送模式。雖然內部沒有CAN 控制器,但可以通過SPI 接口進行擴展,接口電路簡單,易于實現[2]。
圖1 網關硬件接口原理圖
CAN總線接口電路主要采用帶SPI接口的獨立CAN控制器MCP2510、CAN總線收發器TJA1050、高速光隔6N137和DC/DC電源隔離模塊DCR010505等設備組成。獨立CAN控制器MCP2510完全支持CAN總線的V 2.0A和V 2.0B 的技術規范。系統設計時,將MCP2510 作為從設備連接到S3C2410 的SPI0 口[3]。TJA1050總線收發器是CAN控制器和物理總線之間的接口芯片,增強了總線的驅動能力。為增強CAN總線節點的抗干擾能力,MCP2510的TXCAN 和RXCON并不直接與TJA1050的TXD和RXD相連,而是通過兩片光電耦合器6N137與TJA1050相連,同時光隔芯片的兩端電源采用DC/DC模塊進行隔離。這樣就實現了系統外總線CAN節點間的完全電氣隔離,增強了節點的穩定性和安全性。總線兩端都接有1個終端電阻(120 Ω)和1個TVS管,以消除反射信號,有效提高系統的抗干擾能力。
以太網接口電路是在S3C2410片上擴展網絡接口芯片RTL8019AS,RTL8019AS是臺灣REALTEK公司生產的一種基于ISA總線的高度集成的以太網控制器。它實現了以太網媒介訪問層(MAC)和物理層(PHY)的全部功能,包括MAC數據幀的收發、地址識別、循環冗余檢驗(Cyclic Redundancy Check,CRC)編碼/校驗、曼徹斯特編解碼、超時重傳、鏈路完整性測試、信號極性檢測與糾正等。RTL8019AS與主處理器有3種接口模式,跳線模式(Jumper),即插即用模式(PnP)和免跳線模式(Jumperless)。系統采用常見的跳線模式來選擇I/O端口和中斷[4]。
2 協議轉換流程
當CAN總線上的設備向Ethernet網發送數據時,嵌入式網關將接收到的CAN數據包解析,提取數據域中的內容;然后按照TCP/IP協議進行封裝,嵌入式網關將經過封裝的數據發送給以太網控制芯片RTL8019AS。由RTL8019AS自動給這些數據添加以太網物理層和邏輯鏈路層所需的相關信息,通過物理接口傳送到以太網。反之,當以太網向CAN總線上設備發送TCP/IP 數據包時,它首先將數據發送到RTL8019AS,嵌入式網關從RTL8019AS中接收到數據后,提取實際要傳送的數據,然后封裝成CAN總線數據格式,通過CAN總線將數據發送到網絡中的現場設備。
嵌入式網關硬件必須具有以太網接口和CAN 總線接口,而軟件要有TCP/IP 協議棧和CAN 總線驅動程序;通常嵌入式Linux 內核中有完整的TCP/IP協議棧。由于REALTEK公司支持Linux的開發,Linux系統中已含有RTL8019AS芯片的通用驅動程序,CAN 總線協議驅動并不是標準配置。因此,設計CAN 總線接口及其編制驅動程序是實現嵌入式網關最主要的工作[5]。
3 CAN驅動程序設計
Linux 驅動程序屬于Linux 內核的一部分,是嵌入式系統控制硬件的接口,它為用戶屏蔽設備的工作細節,并向用戶提供透明訪問硬件設備的機制。驅動程序的開發在嵌入式系統開發中具有舉足輕重的地位。開發出穩定、完備的驅動程序可提高整個系統的性能。
3.1 CAN驅動程序流程
MCP2510 的內部結構框圖如圖2所示。MCP2510內含3個發送緩沖器和2個接收緩沖器,同時還具有靈活的中斷管理能力。CAN協議機負責與CAN總線的接口,SPI接口邏輯用于實現同MCU 的通信,而寄存、緩沖器組與控制邏輯則用來完成各種方式的設定和操作控制[6]。
圖2 MCP2510 內部結構框圖
在Linux多任務操作系統中,CAN總線通信程序的設計可分為發送數據模塊、接收等待模塊和中斷處理模塊實現。系統中CAN總線的數據發送和接收是兩個不同的線程。在驅動程序中建立數據發送和接收緩沖區。中斷處理程序只負責填充(或讀取)緩沖區中的數據,然后喚醒等待接收(或發送)數據的任務。數據的發送與接收都通過獨立的緩沖區,并由中斷來實現。操作系統的中斷響應時間在軟件上決定了CAN總線數據的最快收發速度。
3.2 CAN設備驅動程序的實現要點
3.2.1 CAN設備驅動操作函數
CAN 設備驅動程序最終提供給應用程序的是一個流控制接口,主要包括:open,realse,read,write,ioctl 等操作。添加設備驅動程序,實際上就是給上述操作編寫相應的程序代碼[7-9]。驅動程序加載到內核時,會首先運行驅動程序的初始化函數,然后等待系統調用在file_operations 數據結構中定義的相關函數,實現對設備的操作。系統使用Linux 2.4.18版本,其文件系統接口被寫義為:
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打開次數、清空3個發送緩沖區和2個接收緩沖區等。
s3c2410_mcp2510_write 將要發送的數據通過SPI 總線將數據傳送MCP2510 的發送緩沖器,再通過MCP2510 將數據發送到CAN總線。
s3c2410_mcp2510_read 用于將MCP2510 從CAN 總線上接收到接收緩沖器的數據,通過SPI 總線讀到用戶區,并返回所讀出的字節數。
s3c2410_mcp2510_ioctl 用于控制CAN總線通信的波特率、設置幀ID、設置工作模式、設置設備濾波器等工作。
s3c2410_mcp2510_release 用于釋放所占用的內存、中斷等資源。
3.2.2 CAN 設備的初始化函數
CAN 設備的初始化函數主要負責創建CAN 設備的節點設備文件、注冊CAN 設備的中斷處理函數、初始化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系統中,初始化函數從s3c2410_mcp2510_init( )開始。通過調用register_chrdev 向系統注冊字符型設備驅動程序;通過devfs_register( )函數創建設備文件系統的CAN設備節點。同時,CAN設備驅動程序通過調用request_irq 函數來申請中斷,向系統注冊CAN設備的CAN中斷處理函數s3c2410_isr_mcp2510( )。在實現了MCP2510的各個接口函數后,還需要編寫MCP2510 的模塊加載函數module_init( )和模塊卸載函數module_exit( ),用于向內核注冊設備及注銷設備[10]。
3.2.3 驅動程序的加載與使用
Linux設備驅動會以內核模塊的形式出現。Ethernet/CAN 網關設備驅動程序作為內核的一部分,應在編譯時把設備驅動程序編譯成可加載的模塊。當使用insmod命令加載內核模塊時,模塊的加載函數module_init(初始化函數名)會自動被內核執行,將初始化函數加入內核全局初始化函數列表中,在內核初始化時執行驅動的初始化函數,從而完成驅動的初始化和注冊,之后驅動便停止等待,被應用程序調用。當用rmmod 命令卸載某內核模塊時,模塊的卸載函數module_exit(退出處理函數名)也會自動被內核執行,完成與模塊加載函數相反的功能。當驅動程序加載到內核中后,就可將CAN設備文件進行open,read,write,release等操作。
4 結 語
隨著工業控制系統性能的提高,以太網在工業上的應用也會越來越廣泛。在此詳細介紹了一種嵌入式網關的設計與實現。作為連接以太網和現場總線的紐帶,實現以太網與CAN現場總線之間的協議轉換,為CAN/Ethernet的互聯提供了一種傳輸速度快、成本低,穩定性和安全性高的解決方案。同時,利用嵌入式ARM處理器,接口資源豐富,設計通用性強,便于擴展其他現場總線與以太網的互聯,具有較好的應用推廣價值。
參考文獻
[1]李正軍.現場總線及其應用技術[M].北京:機械工業出版社,2008.
[2]Samsung Electronics Limited.User′s Manual of S3C2410[Z].2002.
[3]MicroChip Technology Inc.MCP2510 data sheet.2002.
[4]符意德,陸陽.嵌入式系統原理及接口技術[M].北京:清華大學出版社,2007.
[5]羅苑棠,楊宗德.嵌入式Linux應用系統開發實例精講[M].北京:電子工業出版社,2007.
[6]楊慶華,張景元.單片機和MCP2510 的CAN 總線通信模塊設計[J].單片機與嵌入式系統應用,2007(3):35-37.
[7]邵如峰,宋益青.基于ARM9和嵌入式Linux的CAN網關設計[J].微計算機信息,2008(24):15-16.
[8]陳祖爵,周明.嵌入式Linux 下CAN 控制器的驅動程序設計[J].計算機工程與設計,2006(11):4 097-4 100.
[9]劉淼.嵌入式系統接口設計與Linux驅動程序開發[M].北京:北京航空航天大學出版社,2006.
[10]宋寶華.Linux設備驅動開發詳解[M].北京:人民郵電出版社,2008.
作者簡介 徐 敏 男,1963年出生,福建龍巖人,副教授。主要研究方向為嵌入式技術與智能控制。