摘 要:為了解決CAN與以太網(wǎng)兩種不同網(wǎng)絡(luò)之間的數(shù)據(jù)交換,本文介紹了CAN現(xiàn)場總線和以太網(wǎng)數(shù)據(jù)通訊嵌入式網(wǎng)關(guān)的設(shè)計方法,實現(xiàn)了數(shù)據(jù)交換,并給出相應(yīng)的硬件和軟件原理。
關(guān)鍵詞:CAN總線; 以太網(wǎng);TCP/IP協(xié)議
0 應(yīng)用背景:
在企業(yè)網(wǎng)絡(luò)集成系統(tǒng)中,車間內(nèi)部一般采用現(xiàn)場總線,而上層生產(chǎn)管理層采用以太網(wǎng),兩者采用工控機連接。現(xiàn)場總線通過PCI板卡連接到工控機,然后由工控機通過網(wǎng)卡連接到企業(yè)的管理層。這種連接方式成本高,開發(fā)周期長。針對這些情況,本文提出了一種基于微處理器的嵌入式CAN-以太網(wǎng)網(wǎng)關(guān)互連系統(tǒng)的設(shè)計方案,成功地實現(xiàn)以太網(wǎng)和CAN現(xiàn)場總線網(wǎng)絡(luò)的直接數(shù)據(jù)傳輸。
1 硬件設(shè)計:
硬件的實現(xiàn)方案有多種,對于TCP/IP協(xié)議,可以用軟件來實現(xiàn)TCP/IP協(xié)議棧,也可以直接利用集成TCP/IP協(xié)議棧芯片,如W3100A。對于CAN協(xié)議,可以使用集成有CAN協(xié)議的微處理器如PIC18f258,也可以使用單獨的協(xié)議芯片如SJA1000。本文采用的是微處理器P89C51RD2,外加CAN控制器SJA1000、CAN收發(fā)器P82c250以及網(wǎng)絡(luò)芯片RTL8019AS,組成協(xié)議網(wǎng)關(guān)。
CAN網(wǎng)絡(luò)采用SJA1000獨立控制器,它是PHLIPS公司的PCA82C200控制器的替代產(chǎn)品。
以太網(wǎng)協(xié)議芯片采用臺灣的Realtek公司生產(chǎn)的RTL8019AS,它是以太網(wǎng)控制器芯片,集成了介質(zhì)訪問控制子層(MAC)和物理層的性能,可以方便地設(shè)計基于ISA總線的系統(tǒng),簡單的與通用單片機進行接口。另外,它還具有與NE2000兼容、軟件移植性好,以及低價格廉等優(yōu)點 。它提供給微控制器控制以太網(wǎng)的簡單接口,使微控制器只需要對其進行相應(yīng)讀寫即可完成對以太網(wǎng)的操作。電路中擴展一片62256,用于存儲中轉(zhuǎn)的數(shù)據(jù),擴展x5045,用于芯片復(fù)位及存儲網(wǎng)絡(luò)地址,CAN節(jié)點地址等信息。這里僅給出RTL8019AS的硬件連線圖。
圖1 RTL8019連線圖
2 軟件設(shè)計:
軟件設(shè)計分為CAN網(wǎng)絡(luò)的軟件設(shè)計和TCP/IP的軟件設(shè)計,以及CAN到以太網(wǎng)通訊的程序設(shè)計。
2.1 CAN協(xié)議:
CAN協(xié)議編程相對簡單,只需要對SJA1000相應(yīng)的寄存器進行讀寫操作即可。在該模式下,報文識別碼為11位,在經(jīng)過驗收濾波器的篩選后,符合條件的報文才能被接收,并存入SJA1000接收緩沖區(qū)。識別碼值越小,優(yōu)先級越高。如果總線上出現(xiàn)報文沖突,優(yōu)先級高的報文選占據(jù)總線。CAN節(jié)點間每次最多傳送的數(shù)據(jù)為10個字節(jié),以下是SJA1000的接收數(shù)據(jù)流程圖:
圖2 CAN總線接收數(shù)據(jù)流程圖
2.2 以太網(wǎng)的驅(qū)動編寫:
RTL8019的操作是比較簡單的,驅(qū)動程序只需要將要發(fā)送的數(shù)據(jù)按一定的格式寫入芯片并啟動發(fā)送命令,RTL8019會自動把數(shù)據(jù)包轉(zhuǎn)換成物理幀格式在物理信道上傳輸。反之,8019收到物理信號后將其還原成數(shù)據(jù),按指定格式存放在芯片RAM中以便主機程序取用。簡言之就是8019完成數(shù)據(jù)包和電信號之間的相互轉(zhuǎn)換。以太網(wǎng)協(xié)議由芯片硬件自動完成,對程序員透明。驅(qū)動程序有3種功能:芯片初始化、收包、發(fā)包。
RTL8019AS負責(zé)網(wǎng)絡(luò)上數(shù)據(jù)的接收和發(fā)送,為了能夠使其啟動并處于準(zhǔn)備接收或準(zhǔn)備發(fā)送數(shù)據(jù)的狀態(tài),必須對相應(yīng)的寄存器進行初始化,這些寄存器包括CR、DCR、 RBCR、 PSTART、 PSTOP 、ISR、IMR 、PAR0-PAR5、 MAR0-MAR7、 CURR、TCR、RCR等。
Void Intnet()
?。?
Reg00=0x21; //使芯片處于停止模式,這時進行寄存器設(shè)置
Delay_MS(10); //延時10毫秒,確保芯片進入停止模式
page(0);
Reg0a=0x00; //清rbcr0
Reg0b=0x00; //清rbcr1
Reg0c= 0xe0; //RCR,監(jiān)視模式,不接收數(shù)據(jù)包
Reg0d= 0xe2; //TCR,loop back模式
Reg01=0x4c;
Reg02=0x80;
Reg03=0x4c;
Reg04=0x40; //TPSR,發(fā)送起始頁寄存器
Reg07=0xff; //清除所有中斷標(biāo)志位,中斷狀態(tài)寄存器
Reg0f=0x00; //中斷屏蔽寄存器清0,禁止中斷
Reg0e=0xc8; // 數(shù)據(jù)配置寄存器,8位dma方式
page(1);
Reg07=0x4d;
Reg08=0x00;
Reg09=0x00;
Reg0a=0x00;
Reg0b=0x00;
Reg0c=0x00;
Reg0d=0x00;
Reg0e=0x00;
Reg0f=0x00;
Reg00=0x22; //這時讓芯片開始工作
SetMacID(); //將芯片物理地址寫入到MAR寄存器
page(0);
Reg0c=0xcc; //將芯片設(shè)置成正常模式,跟外部網(wǎng)絡(luò)連接
Reg0d=0xe0;
Reg00=0x22; //啟動芯片開始工作
Reg07=0xff; //清除所有中斷標(biāo)志位
?。?
發(fā)送數(shù)據(jù)程序,先將數(shù)據(jù)按照一定的格式,放入ram中,設(shè)定發(fā)送數(shù)據(jù)的起始頁地址和發(fā)送的長度,然后填寫發(fā)送命令,芯片會自動的將數(shù)據(jù)轉(zhuǎn)化為物理幀格式在物理信道上傳輸。同時發(fā)送的結(jié)果會寫入狀態(tài)寄存器,可以通過查詢該寄存器判斷數(shù)據(jù)是否成功發(fā)送出去,以便進行后續(xù)處理。主程序通過查詢或是接收中斷的方式得知有新的數(shù)據(jù)到來,數(shù)據(jù)接收到之后,會放到有pstart和pstop兩個寄存器所限定的循環(huán)列隊中。
2.3 TCP/IP協(xié)議:
TCP/IP是一個分層的協(xié)議,每一層實現(xiàn)一個明確的功能,對應(yīng)一個或是幾個傳輸協(xié)議,每層相對它的下層都作為一個相對獨立的數(shù)據(jù)包來實現(xiàn)。 協(xié)議分層結(jié)構(gòu),如圖所示:
[align=center]

圖3 以太網(wǎng)數(shù)據(jù)分用示意圖[/align]
圖是按照TCP/IP協(xié)議的四層參考模型而設(shè)計的,實際上也是以太網(wǎng)接收數(shù)據(jù)的流程,同時也體現(xiàn)了一種以太網(wǎng)數(shù)據(jù)分用的思想。
主機收到以太網(wǎng)的數(shù)據(jù)幀后,就開始從協(xié)議中由數(shù)據(jù)鏈路層向上升,同時會被剝離其中各層協(xié)議所加的首部,最后只留下用戶數(shù)據(jù),這部分工作由用戶程序來完成。Rtl8019AS僅負責(zé)把數(shù)據(jù)接收進其內(nèi)部的數(shù)據(jù)緩沖區(qū)。
在編程的時候,使用如下的程序框架
if(以太網(wǎng)數(shù)據(jù)報到達)
?。?if( 以太網(wǎng)首部幀類型==0x0806 )
{ ARP處理程序 }
if( 以太網(wǎng)首部幀類型==0x0805 )
?。?RARP處理程序 }
if( 以太網(wǎng)首部幀類型==0x0800 )
{ 根據(jù)IP包的協(xié)議類型分別區(qū)分是TCP包還是UDP包}
?。?
發(fā)送數(shù)據(jù)時要對數(shù)據(jù)進行逐層封裝,即加上相應(yīng)的首部,作為所經(jīng)過每層的標(biāo)識。具體原理是將用戶數(shù)據(jù)加上本層的標(biāo)志,然后發(fā)往協(xié)議的下一層,然后加上下一層的協(xié)議標(biāo)志,繼續(xù)向下傳,這樣依次向下傳,到最后可以得到所傳送的真正數(shù)據(jù)。
根據(jù)以上的介紹,在接收的過程中體現(xiàn)數(shù)據(jù)分用的思想,自以太網(wǎng)數(shù)據(jù)發(fā)送的過程中體現(xiàn)數(shù)據(jù)封裝的思想。
2.4 CAN與以太網(wǎng)的數(shù)據(jù)交換:
數(shù)據(jù)交換原理簡單說就是對以太網(wǎng)收到的數(shù)據(jù)進行分層。取出TCP中的數(shù)據(jù),校驗分析,然后按照CAN模式進行發(fā)送。反過來,當(dāng)接收到CAN網(wǎng)絡(luò)的數(shù)據(jù)后,除去地址和個數(shù)等信息,將其余數(shù)據(jù)按照TCP/IP協(xié)議進行封裝發(fā)送。進入由CAN接收數(shù)據(jù)引起外部中斷后,將數(shù)據(jù)存入緩沖區(qū),并根據(jù)自己定義的協(xié)議判斷是否是最后一幀,如果不是,則保存數(shù)據(jù),退出中斷,否則,關(guān)閉其他中斷,調(diào)用以太網(wǎng)發(fā)送子程序,將數(shù)據(jù)發(fā)向以太網(wǎng)。進入由以太網(wǎng)引起得中斷后,取出其中TCP中的有效數(shù)據(jù),并分析,如果需要發(fā)送,關(guān)閉其他的中斷,將數(shù)據(jù)打包,調(diào)用CAN發(fā)送子程序。同時也可以通過命令,重新設(shè)置該模塊的IP地址,或是該模塊CAN節(jié)點號等。
3 結(jié)論:
由于CAN總線每次只能傳輸8個有效地字節(jié),為了有效的和以太網(wǎng)通訊,我們在CAN網(wǎng)絡(luò)使用了自己定義的協(xié)議。同時,為了實現(xiàn)設(shè)定IP或是更改節(jié)點號等功能,我們在基于TCP協(xié)議的應(yīng)用層,也定義了自己的協(xié)議。通過該模塊實現(xiàn)了CAN與以太網(wǎng)的基本的數(shù)據(jù)交換。經(jīng)過測試,取得的良好的效果。隨著分布式測控系統(tǒng)的優(yōu)勢凸現(xiàn),CAN/TCP嵌入式網(wǎng)關(guān)在實際中的應(yīng)用也會越來越廣泛。
參考文獻:
[1] 基于嵌入式web服務(wù)器的UPS監(jiān)測系統(tǒng) 微計算機信息 2005年13期
[2]RTL8019AS datasheet , http://www.realtek.com.cn