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