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

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