基于ARM處理器的CAN-Ethernet通信模塊實(shí)現(xiàn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
近20 年來工業(yè)測控系統(tǒng)發(fā)展的趨勢是:分散控制和集中管理、標(biāo)準(zhǔn)化和開放性。工業(yè)測控系統(tǒng)從傳統(tǒng)的集中測量控制系統(tǒng)轉(zhuǎn)向網(wǎng)絡(luò)化的集散控制系統(tǒng)。隨著現(xiàn)場總線技術(shù)高速發(fā)展和標(biāo)準(zhǔn)化程度不斷提高,以現(xiàn)場總線技術(shù)為基礎(chǔ)的開放型集散測控系統(tǒng)—現(xiàn)場總線測控系統(tǒng)得到了廣泛的應(yīng)用。同時(shí),以太網(wǎng)的應(yīng)用也迅速向工業(yè)測控系統(tǒng)滲透,在工業(yè)自動(dòng)化應(yīng)用中異軍突起。
這種趨勢的出現(xiàn)與計(jì)算機(jī)技術(shù)、信息技術(shù)、網(wǎng)絡(luò)通信技術(shù)的高速發(fā)展相關(guān)?,F(xiàn)代工業(yè)系統(tǒng)信息交換的需求也已經(jīng)從管理層內(nèi)部迅速覆蓋到控制、現(xiàn)場設(shè)備等各個(gè)層次,連接上層網(wǎng)絡(luò)和現(xiàn)場總線的通信設(shè)備成為工廠自動(dòng)化系統(tǒng)中的關(guān)鍵設(shè)備之一。CAN-Ethernet通信模塊,是一種直接連接以太網(wǎng)和CAN現(xiàn)場總線的設(shè)備,有效解決了控制系統(tǒng)中現(xiàn)場總線和上層信息管理層的互聯(lián)問題,使自動(dòng)化系統(tǒng)中的信息交換可以深入到現(xiàn)場設(shè)備一級(jí)。
1 CAN 總線和以太網(wǎng)的連接
現(xiàn)有的CAN 總線到以太網(wǎng)的通信實(shí)現(xiàn)方案中,采用較多的是使用一臺(tái)連接以太網(wǎng)的計(jì)算機(jī),在計(jì)算機(jī)中安裝一塊內(nèi)置式CAN通信板卡;或者通過計(jì)算機(jī)并行和串行接口外接CAN 的通信模塊。這種方法有一定局限性,例如,使用計(jì)算機(jī)體積大,成本高;計(jì)算機(jī)故障后的重啟速度慢,這可能嚴(yán)重影響系統(tǒng)的工作。采用基于ARM微處理器的單板機(jī)系統(tǒng)建立CAN-Ethernet 通信模塊,可以很好地解決上述問題,降低系統(tǒng)的成本,提高其性能。CAN-Ethernet通信模塊連接以太網(wǎng)和CAN 總線的結(jié)構(gòu)如圖1 所示。在以太網(wǎng)和CAN 總線之間,可以掛接一個(gè)通信模塊連接兩種網(wǎng)絡(luò),也可以使用多個(gè)通信模塊形成多個(gè)通路。對(duì)于第二種情況,以太網(wǎng)上的計(jì)算機(jī)可以通過指定IP地址和上層協(xié)議的端口選擇通路。
圖1 通過通信模塊連接以太網(wǎng)和CAN 總線
2 通信模塊的硬件設(shè)計(jì)
信模塊的硬件核心采用高性能的ARM處理器S3C44B0x。它是一種精簡指令處理器,可以在32位指令字的ARM模式下和16位指令字的 Thumb模式下工作,設(shè)計(jì)者可以根據(jù)需要在性能和代碼大小之間進(jìn)行折衷;片內(nèi)有8KB的高速靜態(tài)RAM,既可以作為高速緩存,也可以作為片內(nèi)存儲(chǔ)器使用;片內(nèi)外設(shè)包括異步和同步串行接口、I2C接口、LCD控制器及接口、實(shí)時(shí)時(shí)鐘等。ARM處理器還具有低能耗和高性價(jià)比,非常適用于構(gòu)建性能較高的嵌入式系統(tǒng)。
通信模塊使用2片39VF040芯片,位擴(kuò)展后組成512K/16bit共1MB的Flash ROM作為程序和配置數(shù)據(jù)的存儲(chǔ)空間,使用1片62LV25616芯片組成256K/16bit 共512B的靜態(tài)隨機(jī)存儲(chǔ)器。CAN總線通信控制芯片選用了Philips公司的SJA1000T,它是一種獨(dú)立的CAN 總線通信控制器,僅需要CPU給出必要的指令,控制器就可以自動(dòng)完成鏈路層以下的收發(fā)工作,并通知CPU總線的工作狀態(tài)。以太網(wǎng)通信控制芯片采用了臺(tái)灣 Realtek公司的RTL8019as,它是一種ISA 接口的10Mb/s以太網(wǎng)卡芯片,內(nèi)部包含了以太網(wǎng)媒體訪問控制和物理層驅(qū)動(dòng),并帶有16KB的片上緩沖RAM。
2. 1 處理器和5 V 系統(tǒng)數(shù)據(jù)線的連接
系統(tǒng)中的處理器S3C44B0x 和存儲(chǔ)器芯片都使用3.3 V 的IO電壓,CAN總線接口、以太網(wǎng)接口則使用5V的工作電壓。 S3C44B0x 的數(shù)據(jù)、地址和控制信號(hào)線可以直接驅(qū)動(dòng)這些外圍電路芯片(參考S3C44B0x、SJA1000、RTL8019as 數(shù)據(jù)手冊) ,但是外圍電路芯片輸出的高電平可能損壞處理器和直接掛接在處理器數(shù)據(jù)線上的其他芯片。因此,數(shù)據(jù)線上應(yīng)該使用總線轉(zhuǎn)換器進(jìn)行3.3/5V電平轉(zhuǎn)換。系統(tǒng)選用了兼容3.3 V和5V的信號(hào)電平的雙向總線收發(fā)器LCX245芯片。LCX245 的控制信號(hào)包括方向控制端DIR(0 :B →A ,1 :A →B) 和使能控制端OE(0 :接通,1 :隔斷) ,這些控制信號(hào)將使用GAL芯片產(chǎn)生。圖2 為系統(tǒng)的硬件連接示意圖。
圖2 系統(tǒng)的硬件連接示意圖
GAL 芯片選用GAL16V8D-15LP ,它的傳播延遲時(shí)間為15ns ,反饋延遲時(shí)間為7ns ,適于較高速度的工作。除了產(chǎn)生總線收發(fā)器芯片的控制信號(hào)外,同一片GAL 還用來產(chǎn)生SJA1000 需要的控制信號(hào)。根據(jù)處理器S3C44B0x 的輸出信號(hào), 包括為SJA1000分配的地址組選通信號(hào)nGCS3和RTL8019分配的地址組選通信號(hào)nGCS4、讀寫信號(hào)線nOE和nWE,可以產(chǎn)生總線收發(fā)器 LCX245所需要的DIR和OE信號(hào),各信號(hào)如圖3 所示。
圖3 LCX245 控制信號(hào)的產(chǎn)生
nGCSx 是處理器的地址組選通信號(hào),S3C44B0x 將外部地址空間從地址0 開始,每32M劃分為一個(gè)組(Bank ) ,外部尋址時(shí)地址線A0 ~ A24 輸出組內(nèi)地址,該地址所在的組的組選通信號(hào)同時(shí)有效。圖中虛線代表寫操作時(shí)的DIR 信號(hào),實(shí)線為讀操作的信號(hào)。從圖中可以得到使用ABEL 語言描寫的的信號(hào)生成邏輯式為:
OE = (nOE &nWE) # (nGCS3 &nGCS4 &nGCS5) ;
DIR = nOE # (nGCS3 &nGCS4 &nGCS5) ;
但是為了使系統(tǒng)更加穩(wěn)定地工作,應(yīng)保證OE 信號(hào)有效時(shí)DIR 信號(hào)不發(fā)生變化,也就是說進(jìn)行讀操作時(shí)圖中OE 低電平脈沖的前沿應(yīng)晚于DIR ,后沿應(yīng)早于DIR ,這樣將出現(xiàn)反饋邏輯,可以使用類似于同步時(shí)序電路的設(shè)計(jì)方法設(shè)計(jì)。圖4 是OE 信號(hào)和DIR 信號(hào)的次態(tài)卡諾圖,次態(tài)符合上述要求,并且在輸入一定的狀態(tài)下,OE 信號(hào)和DIR 信號(hào)總是每次改變一個(gè),逐次進(jìn)入最后的穩(wěn)態(tài)狀態(tài)(粗體字表示) 。圖中“×”表示不會(huì)出現(xiàn)的輸入狀態(tài)。
圖4 OE 和DIR 次態(tài) 卡諾圖
根據(jù)卡諾圖重新寫出的次態(tài)邏輯產(chǎn)生式,消除單獨(dú)輸入(包括OE 和DIR 的當(dāng)前狀態(tài)) 變化可能引起的競爭- 冒險(xiǎn)現(xiàn)象后為:
OEn = (nOE &nWE) # (nOE & ! DIR) # (nWE &DIR) # (nGCS3 &nGCS4 &nGCS5) ; ///
DIRn = ( ! OE &DIR) # (nOE &DIR) # (nOE &OE) # (nGCS3 & nGCS4 &nGCS5) ;
編譯GAL 邏輯時(shí)應(yīng)嚴(yán)格按照邏輯式生成與或邏輯。
2. 2 CAN 總線通信控制芯片SJA1000 的讀寫
CAN總線通信控制芯片SJA1000 沒有提供單獨(dú)的地址線,而使用可以與Intel 和Motorola系列微控制器兼容的分時(shí)復(fù)用地址/ 數(shù)據(jù)線。在一個(gè)讀寫周期內(nèi),微控制器首先輸出操作地址并使地址鎖存信號(hào)ALE 有效,SJA1000 在ALE 信號(hào)的下降沿將操作地址鎖在片內(nèi);之后微處理器發(fā)出讀寫信號(hào)進(jìn)行數(shù)據(jù)傳輸。但S3C44B0x 的數(shù)據(jù)線和地址線是分離的,對(duì)SJA1000 的讀寫操作需要模擬微控制器,先在數(shù)據(jù)線上寫一個(gè)操作地址,并模擬產(chǎn)生一個(gè)ALE 信號(hào)鎖存這個(gè)地址,之后進(jìn)行正常的讀寫操作。系統(tǒng)使用地址線ADDR0 區(qū)分地址傳輸和數(shù)據(jù)傳輸:寫奇地址時(shí),不選通SJA1000 芯片,但給出一個(gè)有效的模擬ALE 信號(hào);讀寫偶地址時(shí),選通SJA1000 讀寫數(shù)據(jù)。另外,系統(tǒng)同時(shí)有兩路CAN 總線接口,讀寫操作根據(jù)地址線ADDR1 區(qū)分兩個(gè)SJA1000 芯片,兩個(gè)片選信號(hào)和ALE 信號(hào)都要通過GAL 芯片產(chǎn)生,各信號(hào)如圖5所示。
圖5 SJA1000 控制信號(hào)的產(chǎn)生
圖中虛線是向SJA1000 傳輸和鎖存地址的過程,實(shí)線是讀寫操作的過程。用ABEL 語言書寫的各信號(hào)產(chǎn)生邏輯式為:
CAN-CS = nGCS4 # ADDR0 ;
ALE = ! nWE &ADDR0 & ! nGCS4 ;
對(duì)SJA1000 的操作地址如下:地址鎖存向0x08000001端口寫地址;數(shù)據(jù)讀寫通過地址0x08000000。
3 通信模塊的軟件設(shè)計(jì)
通信模塊和CAN 總線上的設(shè)備節(jié)點(diǎn)之間直接通過SJA1000收發(fā)CAN 總線報(bào)文進(jìn)行通信,報(bào)文中的數(shù)據(jù)格式可以是基于CAN 總線的上層標(biāo)準(zhǔn)協(xié)議,也可以由用戶定義。為了方便與以太網(wǎng)上計(jì)算機(jī)的通信,CAN-Ethernet 通信模塊在以太網(wǎng)一端使用UDP協(xié)議,這樣,計(jì)算機(jī)上的軟件可以使用操作系統(tǒng)提供的網(wǎng)絡(luò)訪問服務(wù)。
每一個(gè)CAN-Ethernet 通信模塊需要設(shè)定局域網(wǎng)內(nèi)一個(gè)惟一的IP地址,通過固定的UDP端口和計(jì)算機(jī)通信。模塊和計(jì)算機(jī)之間既可以使用對(duì)單點(diǎn)IP的通信,也可以在UDP端口發(fā)送廣播報(bào)文。在以太網(wǎng)一端,通信模塊接收到UDP 報(bào)文后,將其中的信息組織成CAN 總線報(bào)文發(fā)往CAN 總線;在CAN 總線一端,通信模塊接收報(bào)文標(biāo)識(shí)能夠通過本節(jié)點(diǎn)接收碼和接收掩碼設(shè)置的CAN 總線報(bào)文,并封裝為UDP 報(bào)文,轉(zhuǎn)發(fā)到以太網(wǎng)上。各節(jié)點(diǎn)IP 地址、UDP工作端口和CAN報(bào)文接收掩碼等設(shè)置在系統(tǒng)初始化時(shí)進(jìn)行。
3. 1 通信控制芯片的初始化和收發(fā)操作
對(duì)SJA1000T的基本操作如下:
①初始化:硬件復(fù)位,進(jìn)入復(fù)位方式; 設(shè)置為BasicCAN 模式,CDR = 0x08 ;設(shè)置波特率控制字BTR0 ,BTR1 ;設(shè)置接收碼和接收掩碼ACR、AMR;完成設(shè)定,進(jìn)入工作模式,CR = 0x1E。
②發(fā)送:將CAN 總線報(bào)文寫入SJA1000T 發(fā)送緩沖區(qū)TX2IDR1~2 , TXDR1~8 ;寫發(fā)送命令,CMR = 0x01。
③接收:從RXIDR1~2、RXDR1~8 讀出CAN 一幀CAN 總線報(bào)文;將SJA1000T 的接收緩沖區(qū)窗口滑動(dòng)到下一幀,CMR =0x04。
RTL8019AS內(nèi)部有頁地址為0x40~0x79 的256個(gè)緩沖頁,每頁256B。這些緩沖頁的一部分作為接收緩沖區(qū),起始頁地址和結(jié)束頁地址通過PSTART、PSTOP 寄存器配置,剩余可以作為發(fā)送緩沖區(qū)使用。硬件把接收緩沖區(qū)作為環(huán)形緩沖區(qū)使用,CURR寄存器和BNRY寄存器分別指明緩沖區(qū)中未使用部分的起始和結(jié)束頁地址。硬件接收到數(shù)據(jù)后會(huì)自動(dòng)修改CURR 的值,而BNRY需要讀出一幀數(shù)據(jù)后由軟件修改;對(duì)RTL8019AS的基本操作如下:
①初始化:硬件復(fù)位操作,進(jìn)入停止方式;寫入物理地址到PR0~PR5 ,寫入0x00 到多點(diǎn)接收地址寄存器MAR;設(shè)置內(nèi)部發(fā)送緩沖區(qū)器起止頁地址到PSTART、PSTOP;寫入當(dāng)前
頁地址到CURR和頁地址界寄存器BNRY中;進(jìn)入正常工作方式,CR =0x02。
②發(fā)送:將以太網(wǎng)報(bào)文載入在RTL8019AS中設(shè)置的發(fā)送緩沖區(qū)中;寫發(fā)送起始頁地址到TPSR ,寫發(fā)送內(nèi)容長度到TBCR0~1 ;寫發(fā)送命令,CMR = 0x1A。
③接收:從在RTL8019AS中設(shè)置的接收緩存頁中讀出一幀以太網(wǎng)報(bào)文;根據(jù)報(bào)文長度改變頁地址界限BNRY的值。
3. 2 UDP 和CAN 報(bào)文的轉(zhuǎn)換
CAN - Ethernet 通信模塊收到CAN 總線報(bào)文時(shí),將整個(gè)報(bào)文封裝在一幀UDP 報(bào)文中;接收到目的端口與自己的工作端口相符的UDP 報(bào)文時(shí),取出其中的數(shù)據(jù)段作為一幀CAN 總線報(bào)文。以太網(wǎng)報(bào)文到CAN 總線報(bào)文的具體轉(zhuǎn)換過程如下:
①如果接收到的以太網(wǎng)報(bào)文包含IP 報(bào)文,分解出IP 報(bào)文,否則拋棄這幀報(bào)文;
②如果IP 報(bào)文的目的地址匹配,并且包含一幀UDP 報(bào)文,分解出UDP 報(bào)文,否則拋棄;
③如果UDP 報(bào)文的目的端口匹配,分解出其中的CAN 總線報(bào)文,否則拋棄。
CAN 總線報(bào)文到UDP 報(bào)文的轉(zhuǎn)換過程是:
①接收到的CAN 總線報(bào)文裝入U(xiǎn)DP 報(bào)文的數(shù)據(jù)段,計(jì)算校驗(yàn)和,完成UDP報(bào)文封裝;
②加上IP 報(bào)文頭部,計(jì)算校驗(yàn)和,完成IP報(bào)文封裝;
③加上以太網(wǎng)報(bào)文的頭部,報(bào)文尾部的校驗(yàn)和不需要軟件完成,RTL8019AS在發(fā)送時(shí)會(huì)自動(dòng)添加。
為了減少在轉(zhuǎn)換過程中的數(shù)據(jù)拷貝,定義了如下數(shù)據(jù)結(jié)構(gòu)。從CAN總線上收到的報(bào)文直接放在Frame結(jié)構(gòu)體的can[ ]成員中,并記錄長度,封裝為UDP報(bào)文的過程就是填充Frame結(jié)構(gòu)體中其他成員的過程;從以太網(wǎng)上收到的報(bào)文逐字節(jié)放入Frame結(jié)構(gòu)體中,CAN 報(bào)文就包含在can[ ]成員中。
struct EthHead {
unsigned char DstPhyAddr[6 ] ; / / 以太網(wǎng)目的地址
unsigned char SrcPhyAddr[6 ] ; / / 以太網(wǎng)源地址
unsigned short Prt ; / / 協(xié)議標(biāo)識(shí)
} ;
struct IPHead {
unsigned char VerLen ; / / 版本號(hào)和頭長度
unsigned char ServType ; / / 服務(wù)類型
unsigned short Len ; / / 長度
unsigned short ID; / / 報(bào)文ID
unsigned short FlagAndFrag ; / / 標(biāo)記和分段
unsigned char TTL ;
unsigned char Prt ; / / 協(xié)議標(biāo)識(shí)
unsigned short HdChksum; / / 頭校驗(yàn)和
unsigned char srcIP[4 ] ; / / 源IP 地址
unsigned char dstIP[4 ] ; / / 目的IP 地址
} ;
struct UDPHead {
unsigned short srcPort ; / / 源端口號(hào)
unsigned short srcPort ; / / 目的端口號(hào)
unsigned short Len ; / / 長度
unsigned short Chksum; / / 校驗(yàn)和
} ;
struct Frame {
struct EthHead ethhd ;
struct IPHead iphd ;
struct UDPHead udphd ;
unsigned char can [ 10 ] ; / / 放置CAN 報(bào)文
short canlen ; / / 記錄收到的CAN 報(bào)文長度
} ;
3. 3 通信程序的實(shí)現(xiàn)
處理器對(duì)SJA1000T和RTL8019AS 的操作都使用了中斷方式,通信模塊的軟件程序可以分成SJA1000T 中斷服務(wù)程序、RTL8019AS中斷服務(wù)程序和主程序3 個(gè)部分,是典型的前、后臺(tái)處理結(jié)構(gòu)。在中斷服務(wù)程序中,將收到的CAN 總線報(bào)文和以太網(wǎng)報(bào)文讀入內(nèi)存中的緩沖區(qū),并累加緩沖區(qū)內(nèi)還未處理的報(bào)文計(jì)數(shù)。在主程序循環(huán)中,輪流處理兩個(gè)緩沖區(qū)中的報(bào)文,并減小報(bào)文計(jì)數(shù)值。圖6 是SJA1000T的中斷服務(wù)流程、RTL8019AS中斷服務(wù)流程、主程序的流程。由于SJA1000T內(nèi)部的接收緩沖區(qū)只有64B ,所以在程序中定義了容納32個(gè)Frame結(jié)構(gòu)體數(shù)組can- rbuf [ ]并組成環(huán)形緩沖區(qū)。同時(shí)也定義了相同大小的數(shù)組eth- rbuf [ ]組成以太網(wǎng)接收的環(huán)形緩沖區(qū)。
圖6 通信模塊軟件流程圖
在調(diào)試過程中發(fā)現(xiàn),如果轉(zhuǎn)發(fā)過程被特定的中斷程序打斷,可能發(fā)生報(bào)文計(jì)數(shù)錯(cuò)誤;如果向RTL8019AS寫入待發(fā)送報(bào)文的過程被以太網(wǎng)接收中斷打斷,就無法恢復(fù)寫入過程了。因此在轉(zhuǎn)發(fā)過程中應(yīng)屏蔽相應(yīng)的中斷。
4 結(jié)束語
采用上述方法實(shí)現(xiàn)的CAN-Ethernet 通信模塊,解決了以太網(wǎng)和現(xiàn)場總線CAN 總線之間互聯(lián)問題,可以根據(jù)應(yīng)用的需求,進(jìn)行靈活的配置和改進(jìn),提高系統(tǒng)的性能和可靠性。實(shí)際證明,在局域網(wǎng)環(huán)境下模塊工作可靠,在以太網(wǎng)負(fù)載適中時(shí),只有很小的通信延遲。它為CAN-Ethernet 的互聯(lián)提供了低成本、高性能及靈活的解決方案。