基于ARM LPC2292 的CAN總線和以太網(wǎng)間的網(wǎng)關(guān)設(shè)計(jì)
0 引言
CAN 總線是一種設(shè)備互連的總線型控制網(wǎng)絡(luò),與其它的現(xiàn)場(chǎng)總線相比,CAN 總線的數(shù)據(jù)通信具有突出的可靠性、實(shí)時(shí)性和靈活性。這些特點(diǎn)使得其能同時(shí)滿足過程控制和制造業(yè)自動(dòng)化的需求,因此被認(rèn)為是最具有發(fā)展前途的現(xiàn)場(chǎng)總線之一。但是,由于其收發(fā)器驅(qū)動(dòng)能力的限制,約束了CAN 總線的最遠(yuǎn)直接傳輸距離和總線上可以掛接的最大節(jié)點(diǎn)數(shù),給系統(tǒng)組網(wǎng)帶來了一定的困難。而另一方面,由于以太網(wǎng)的低成本、開放性、應(yīng)用軟硬件的支持以及強(qiáng)大的組網(wǎng)能力,目前已經(jīng)是應(yīng)用最廣泛的局域網(wǎng)絡(luò)技術(shù),越來越多的工程師們開始采用CAN 總線與以太網(wǎng)結(jié)合的技術(shù)。針對(duì)這樣一種情況,本文提出一種CAN 總線和以太網(wǎng)互連系統(tǒng)的設(shè)計(jì)方案,實(shí)現(xiàn)CAN 總線網(wǎng)和以太網(wǎng)的數(shù)據(jù)互連。
1 系統(tǒng)結(jié)構(gòu)
用網(wǎng)關(guān)連接CAN 現(xiàn)場(chǎng)總線和以太網(wǎng)的網(wǎng)絡(luò)架構(gòu)圖如圖1 所示。
圖1 系統(tǒng)網(wǎng)絡(luò)結(jié)構(gòu)示意圖
網(wǎng)關(guān)的嵌入不僅使管理深入到控制現(xiàn)場(chǎng),同時(shí)給系統(tǒng)組網(wǎng)帶來了很大的方便。
1.1 網(wǎng)關(guān)嵌入的益處
?、?增大了系統(tǒng)的最大CAN節(jié)點(diǎn)數(shù)
在不接中繼器的條件下,一個(gè)CAN 子網(wǎng)內(nèi)最多可以掛接110 個(gè)節(jié)點(diǎn),而每個(gè)網(wǎng)關(guān)下可以連接一個(gè)子網(wǎng),通過多個(gè)網(wǎng)關(guān)可以把多個(gè)子網(wǎng)聯(lián)系在一起,從而增加了系統(tǒng)的節(jié)點(diǎn)數(shù)。
?、?擴(kuò)大了系統(tǒng)的組網(wǎng)范圍
CAN 的直接通信距離大概只有10km 左右,系統(tǒng)按照現(xiàn)場(chǎng)區(qū)域和節(jié)點(diǎn)數(shù)構(gòu)建子網(wǎng),子網(wǎng)與子網(wǎng)通過以太網(wǎng)連接,從而突破了區(qū)域和距離的限制。
③ 實(shí)現(xiàn)了具有不同傳輸速度的現(xiàn)場(chǎng)總線子網(wǎng)的相互通信網(wǎng)關(guān)提供一個(gè)友好的人機(jī)接口,用戶可以根據(jù)需要設(shè)置IP 地址和CAN 控制器的波特率。
1.2 網(wǎng)關(guān)嵌入的問題
網(wǎng)關(guān)的應(yīng)用給系統(tǒng)帶來方便的同時(shí),也付出了一定的代價(jià),在設(shè)計(jì)中必須考慮這些問題,以提高系統(tǒng)的整體效率。這些問題表現(xiàn)在:
?、賹?shí)時(shí)性
由于使用網(wǎng)關(guān),對(duì)數(shù)據(jù)的處理必須經(jīng)歷先存儲(chǔ),再轉(zhuǎn)換,最后再發(fā)送的過程,增加了一些存儲(chǔ)轉(zhuǎn)發(fā)延時(shí)。因此在設(shè)計(jì)中必須考慮系統(tǒng)的實(shí)時(shí)性,要求系統(tǒng)能在存儲(chǔ)新接收到的數(shù)據(jù)后立即啟動(dòng)協(xié)議轉(zhuǎn)換和數(shù)據(jù)轉(zhuǎn)發(fā)任務(wù),盡量減小系統(tǒng)延時(shí)。
?、?安全性
若網(wǎng)關(guān)出現(xiàn)故障,會(huì)對(duì)CAN 子網(wǎng)和以太網(wǎng)間的通信產(chǎn)生影響,甚至?xí)c瘓這個(gè)子網(wǎng)與整個(gè)系統(tǒng)的通信。因此在硬件設(shè)計(jì)中,要盡量避免干擾等問題的出現(xiàn);軟件設(shè)計(jì)必須能對(duì)一些可糾正錯(cuò)誤及時(shí)作出反應(yīng),并把錯(cuò)誤信息返回給用戶。
2 網(wǎng)關(guān)硬件設(shè)計(jì)
網(wǎng)關(guān)硬件設(shè)計(jì)分為CAN 接口、以太網(wǎng)網(wǎng)絡(luò)接口和人機(jī)接口等3 個(gè)部分。
2.1 主控制器的選擇
主控制器采用Philips 的ARM 控制器LPC2292。LPC2292 基于一個(gè)支持實(shí)時(shí)仿真和跟蹤TM 的16/32 位ARM7TDMI-SCPU。CPU 內(nèi)核工作電壓為1.8V,引腳工作電壓為3.3V。
LPC2292 帶有256 k 字節(jié)(kB)嵌入的高速Flash 存儲(chǔ)器,完全可以滿足系統(tǒng)代碼的容量要求,無需外擴(kuò)存儲(chǔ)器;獨(dú)特的加速結(jié)構(gòu)使32 位代碼能夠在最大時(shí)鐘速率下運(yùn)行,可實(shí)現(xiàn)TCP/IP 協(xié)議棧中的ARP、TCP、UDP、ICMP 等網(wǎng)絡(luò)協(xié)議。
LPC2292 內(nèi)部集成兩個(gè)CAN 控制器,方便系統(tǒng)采用冗余設(shè)計(jì)。CAN控制器主要特性有:?jiǎn)蝹€(gè)總線上的數(shù)據(jù)傳輸速率高達(dá)1Mb/s;32 位寄存器和RAM 訪問;兼容CAN2.0B,ISO11898-1規(guī)范;全局驗(yàn)收濾波器可以識(shí)別所有的11 位和29 位Rx 標(biāo)識(shí)符;驗(yàn)收濾波器為選擇的標(biāo)準(zhǔn)標(biāo)識(shí)符提供了FullCAN-style 自動(dòng)接收。
CPU 外部靜態(tài)存儲(chǔ)器控制器為CPU 內(nèi)部系統(tǒng)總線和外部存儲(chǔ)器或外部I/O 器件提供了一個(gè)接口。利用這種外部總線可以方便與以太網(wǎng)網(wǎng)卡控制器進(jìn)行連接。
2.2 CAN 接口
考慮系統(tǒng)的安全性,CAN 接口部分采用冗余設(shè)計(jì)。當(dāng)正常通道發(fā)生故障時(shí)自動(dòng)調(diào)用冗余通道進(jìn)行傳輸;如果冗余通道也發(fā)生故障,則進(jìn)入故障處理。其硬件接口示意圖如圖2 所示。LPC2292 兩路通道分別通過高速總線驅(qū)動(dòng)器TJA1050 與總線相連。總線驅(qū)動(dòng)器采用帶隔離的DC/DC 單獨(dú)供電,不僅實(shí)現(xiàn)了兩路通道之間的電氣隔離,也實(shí)現(xiàn)了網(wǎng)關(guān)與總線之間的電氣隔離。
2.3 網(wǎng)絡(luò)接口
網(wǎng)卡控制器采用臺(tái)灣RETACK 公司的10M 以太網(wǎng)控制芯片RTL8019 ,支持全雙工工作模式,軟件兼容8 位或16 位的NE2000 模式;內(nèi)部集成DMA 控制器、ISA 總線控制器以及16kRAM 、網(wǎng)絡(luò)PHY 收發(fā)器等。RTL8019 使用LPC2292 外部存儲(chǔ)控制的BANK3 部分,它的數(shù)據(jù)地址范圍為0x83400000~0x8340001F 。RTL8019 的工作電壓為+5V,而LPC2292 的引腳工作電壓為3.3V ,所以還應(yīng)在連接線上串聯(lián)470 Ω 的保護(hù)電阻。網(wǎng)絡(luò)采用雙絞線傳輸。
圖2 網(wǎng)絡(luò)硬件結(jié)構(gòu)示意圖
2.4 人機(jī)接口
除了上面的主要部分外,還有LED 數(shù)碼管顯示和鍵盤部分,LED 用來顯示工作狀態(tài),鍵盤根據(jù)具體實(shí)際情況修正總線波特率和網(wǎng)關(guān)的IP 地址。
3 軟件設(shè)計(jì)
3.1 引入RTOS
網(wǎng)關(guān)設(shè)計(jì)對(duì)系統(tǒng)的實(shí)時(shí)性要求比較高,而采用傳統(tǒng)的前后臺(tái)設(shè)計(jì)方法又會(huì)顯得過于復(fù)雜,實(shí)時(shí)性得不到保證。解決這個(gè)問題的最好方法就是采用實(shí)時(shí)操作系統(tǒng)RTOS 。目前世界上已有一大批成熟的嵌入式操作系統(tǒng),其中μC/OS-II 操作系統(tǒng)是一種源代碼公開的嵌入式操作系統(tǒng),具有代碼短小精悍、簡(jiǎn)單易學(xué)的特點(diǎn),針對(duì)網(wǎng)關(guān)的設(shè)計(jì),這是一個(gè)理想的選擇。
μC/OS-II 完全是占先式的實(shí)時(shí)內(nèi)核,是基于優(yōu)先級(jí)的,即總是讓就緒態(tài)中優(yōu)先級(jí)最高的任務(wù)先運(yùn)行,因此實(shí)時(shí)性比非占先的內(nèi)核要好。它的絕大部分代碼是用C 語言編寫的,可移植性強(qiáng)。
圖3 嵌入式計(jì)算機(jī)系統(tǒng) [!--empirenews.page--]
3.2 系統(tǒng)構(gòu)成
嵌入式網(wǎng)關(guān)的功能主要是進(jìn)行以太網(wǎng)數(shù)據(jù)報(bào)文和CAN 數(shù)據(jù)幀之間的協(xié)議轉(zhuǎn)換,實(shí)現(xiàn)以太網(wǎng)和CAN 總線的互連;其次是根據(jù)應(yīng)用環(huán)境,通過人機(jī)交互接口改變網(wǎng)關(guān)的IP 地址和CAN 總線的波特率。整個(gè)嵌入式系統(tǒng)的構(gòu)成如圖3 所示。在進(jìn)行任務(wù)設(shè)計(jì)之前的前期工作有:
?、?實(shí)時(shí)操作系統(tǒng)的移植。μC/OS-II 可以在絕大多數(shù)8 位、16 位、32 位、以至64 位微處理器、微控制器、數(shù)字信號(hào)處理器(DSP)上運(yùn)行。μC/OS-II 在LPC2292 上的移植可參考文獻(xiàn)[1]。
?、?TCP/IP 協(xié)議和CAN 協(xié)議的嵌入。由于μC/OS-II 操作系統(tǒng)只包含了實(shí)時(shí)內(nèi)核、任務(wù)管理、時(shí)間管理、任務(wù)間的通信同步(信號(hào)量、郵箱、消息隊(duì)列)和內(nèi)存管理等功能,所以用戶必須根據(jù)自己的需要添加一些功能模塊。網(wǎng)關(guān)的設(shè)計(jì)將TCP/IP 和CAN 協(xié)議嵌入到操作系統(tǒng)中,并提供一些API 接口函數(shù)供用戶調(diào)用。
3.3 系統(tǒng)實(shí)現(xiàn)
采用RTOS 使整個(gè)設(shè)計(jì)簡(jiǎn)單且易調(diào)試,各個(gè)任務(wù)相互獨(dú)立,而且各個(gè)任務(wù)具有不同的優(yōu)先級(jí)可以保證緊急任務(wù)及時(shí)響應(yīng),從而能有效地對(duì)任務(wù)進(jìn)行調(diào)度。系統(tǒng)軟件設(shè)計(jì)由操作系統(tǒng)和一系列用戶應(yīng)用程序構(gòu)成。 主函數(shù)是程序首先執(zhí)行的一個(gè)函數(shù)。該函數(shù)永遠(yuǎn)不返回,主要實(shí)現(xiàn)系統(tǒng)的硬件(包括中斷、鍵盤、顯示等)和操作系統(tǒng)(包括任務(wù)控制塊、事件控制塊)的初始化,而且在啟動(dòng)多任務(wù)調(diào)度之前,必須至少創(chuàng)建一個(gè)任務(wù)。在本系統(tǒng)中創(chuàng)建了一個(gè)啟動(dòng)任務(wù),主要負(fù)責(zé)時(shí)鐘的初始化和啟動(dòng)、中斷的啟動(dòng)、CAN 控制器的初始化與啟動(dòng)、端口與IP 地址的初始化和RTL8019 的初始化與啟動(dòng),并且對(duì)各個(gè)應(yīng)用任務(wù)進(jìn)行了劃分。在交出CPU 的使用權(quán)之后自做一些空閑處理。
3.3.1 任務(wù)的劃分
要完成多任務(wù)系統(tǒng)的各種功能必須對(duì)任務(wù)進(jìn)行劃分。本程序根據(jù)各個(gè)任務(wù)的重要性和實(shí)時(shí)性,把整個(gè)模塊分成7 個(gè)具有不同優(yōu)先級(jí)的應(yīng)用任務(wù):系統(tǒng)監(jiān)控、CAN 數(shù)據(jù)發(fā)送、鍵盤掃描、以太網(wǎng)數(shù)據(jù)發(fā)送、協(xié)議轉(zhuǎn)換、LED顯示、系統(tǒng)配置等。表1 所示為任務(wù)劃分表。
表1 任物劃分表
除了7 個(gè)主要應(yīng)用任務(wù)之外,還有兩個(gè)中斷服務(wù)子程序:一個(gè)時(shí)鐘節(jié)拍中斷,提供周期性信號(hào)源;另一個(gè)接收中斷,把接收到的數(shù)據(jù)寫入緩沖區(qū)。
3.1.2 任務(wù)的具體實(shí)現(xiàn)任務(wù)劃分后,各任務(wù)具有獨(dú)立的堆??臻g,彼此爭(zhēng)奪CPU 的使用權(quán)。一旦獲得CPU 的使用權(quán),就會(huì)獨(dú)立運(yùn)行而完成特定的功能。
CAN 總線通信模塊包括數(shù)據(jù)傳輸和總線管理兩個(gè)部分。數(shù)據(jù)傳輸實(shí)現(xiàn)的功能有CAN 初始化、CAN 報(bào)文發(fā)送和CAN 報(bào)文接收。CAN 初始化及報(bào)文的接收在啟動(dòng)任務(wù)與中斷服務(wù)程序中實(shí)現(xiàn),CAN 報(bào)文發(fā)送和總線管理作為一個(gè)單獨(dú)的任務(wù)獨(dú)立運(yùn)行。總線管理功能塊實(shí)現(xiàn)的主要是總線檢測(cè),判斷一路總線是否良好。如果不是,就進(jìn)入另一路總線檢測(cè);如果冗余總線良好,就采用冗余總線通信。CAN 數(shù)據(jù)發(fā)送任務(wù)需要系統(tǒng)調(diào)度器通知是否有待發(fā)送數(shù)據(jù)進(jìn)入發(fā)送隊(duì)列,任務(wù)的實(shí)現(xiàn)如圖4 所示。
圖4 數(shù)據(jù)發(fā)送任務(wù)實(shí)現(xiàn)圖
以太網(wǎng)通信模塊由以太網(wǎng)數(shù)據(jù)收發(fā)功能塊和數(shù)據(jù)協(xié)議管理功能塊構(gòu)成。數(shù)據(jù)的收發(fā)功能塊主要實(shí)現(xiàn)RTL8019 的初始化、數(shù)據(jù)報(bào)文的發(fā)送與接收。同理,RTL8019 的初始化在系統(tǒng)的啟動(dòng)任務(wù)中實(shí)現(xiàn)。數(shù)據(jù)的接收在RTL8019 的中斷服務(wù)程序中實(shí)現(xiàn)。數(shù)據(jù)協(xié)議管理主要實(shí)現(xiàn)對(duì)接收數(shù)據(jù)報(bào)文的解析,以及給待發(fā)送數(shù)據(jù)添加協(xié)議報(bào)頭。以太網(wǎng)數(shù)據(jù)發(fā)送與協(xié)議管理分別作為獨(dú)立任務(wù)運(yùn)行。
以太網(wǎng)數(shù)據(jù)發(fā)送任務(wù)同樣需要系統(tǒng)調(diào)度器通知發(fā)送隊(duì)列中是否有待發(fā)送的數(shù)據(jù)。若沒有數(shù)據(jù)發(fā)送,則將 該任務(wù)掛起,系統(tǒng)運(yùn)行其他任務(wù)。以太網(wǎng)數(shù)據(jù)發(fā)送任務(wù)通過對(duì)RTL8019 的操作完成,根據(jù)RTL8019 的狀態(tài),將發(fā)送隊(duì)列中數(shù)據(jù)通過DMA 傳送到8019 的發(fā)送緩沖區(qū)啟動(dòng)發(fā)送,并根據(jù)發(fā)送結(jié)果,對(duì)發(fā)送隊(duì)列指針進(jìn)行調(diào)整。
以太網(wǎng)協(xié)議管理即協(xié)議轉(zhuǎn)換任務(wù)在用戶數(shù)據(jù)與8019 驅(qū)動(dòng)需要的數(shù)據(jù)報(bào)文之間進(jìn)行協(xié)議轉(zhuǎn)換。TCP/IP 協(xié)議為應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層等4 層模型,每層具有不同的功能,并對(duì)應(yīng)相應(yīng)的子協(xié)議,而且層與層之間在邏輯上是相互獨(dú)立的。在編程時(shí),可以直接調(diào)用嵌入的TCP/IP 協(xié)議的API 函數(shù)對(duì)數(shù)據(jù)報(bào)文進(jìn)行分層。該任務(wù)對(duì)從8019 傳過來的數(shù)據(jù)處理示意圖如圖5 所示。不同的子協(xié)議具有不同的功能號(hào),任務(wù)根據(jù)功能號(hào)對(duì)協(xié)議進(jìn)行區(qū)別。把用戶數(shù)據(jù)傳遞給8019 驅(qū)動(dòng)的示意圖是圖5 的逆序表示。
圖5 協(xié)議轉(zhuǎn)換任務(wù)的數(shù)據(jù)處理的示意圖
3.3.3 任務(wù)間的同步與調(diào)度
通常多任務(wù)操作系統(tǒng)的任務(wù)不同于一般的函數(shù),它是一個(gè)無限循環(huán),而且沒有返回值。如果沒有更高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài),當(dāng)前任務(wù)是不會(huì)放棄對(duì)CPU 的使用權(quán)的。為了實(shí)現(xiàn)操作系統(tǒng)的正常運(yùn)行和有關(guān)事件的同步,必須正確處理任務(wù)間的通信和事件標(biāo)志的設(shè)置。整個(gè)系統(tǒng)的功能結(jié)構(gòu)如圖6 所示。
圖6 系統(tǒng)運(yùn)行示意圖
各個(gè)任務(wù)具有不同的優(yōu)先級(jí),通過調(diào)用系統(tǒng)掛起函數(shù)或延時(shí)函數(shù)可以啟動(dòng)具有更高優(yōu)先級(jí)的進(jìn)入就緒態(tài)的任務(wù)。高優(yōu)先級(jí)的任務(wù),例如1、2、3、4 號(hào)任務(wù),往往由于申請(qǐng)某個(gè)資源而發(fā)生阻塞,進(jìn)入掛起態(tài)。系統(tǒng)調(diào)度器啟動(dòng)低優(yōu)先級(jí)的任務(wù),通過對(duì)延時(shí)參數(shù)的設(shè)置,每隔一定時(shí)鐘節(jié)拍就啟動(dòng)鍵盤掃描或LED 顯示任務(wù)。如果其中有任何一事件發(fā)生就啟動(dòng)相關(guān)的任務(wù),這個(gè)過程通過信號(hào)量的通信機(jī)制來實(shí)現(xiàn)。對(duì)每一個(gè)事件分配一個(gè)信號(hào)量,一旦事件發(fā)生就啟動(dòng)信號(hào)量的等待任務(wù)列表中進(jìn)入就緒態(tài)的任務(wù),從而保證任務(wù)與事件的同步。
4 結(jié)束語
在嵌入式硬件平臺(tái)的基礎(chǔ)上,用μC/OS-II 實(shí)時(shí)操作系統(tǒng)開發(fā)應(yīng)用程序有其獨(dú)到之處,用戶可以直接利用系統(tǒng)的接口函數(shù)編寫自己的應(yīng)用程序,毋需另行開發(fā),大大方便了用戶編程,縮短了軟件的開發(fā)周期,提高了開發(fā)效率;基于ARM LPC2292 CAN 總線和以太網(wǎng)間的網(wǎng)關(guān),在實(shí)驗(yàn)調(diào)試過程中運(yùn)行狀況良好,工作穩(wěn)定。