摘 要:為了解決CAN與以太網(wǎng)兩種不同網(wǎng)絡(luò)之間的數(shù)據(jù)交換,本文介紹了CAN現(xiàn)場(chǎng)總線和以太網(wǎng)數(shù)據(jù)通訊嵌入式網(wǎng)關(guān)的設(shè)計(jì)方法,實(shí)現(xiàn)了數(shù)據(jù)交換,并給出相應(yīng)的硬件和軟件原理。
關(guān)鍵詞:CAN總線; 以太網(wǎng);TCP/IP協(xié)議
0 應(yīng)用背景:
在企業(yè)網(wǎng)絡(luò)集成系統(tǒng)中,車(chē)間內(nèi)部一般采用現(xiàn)場(chǎng)總線,而上層生產(chǎn)管理層采用以太網(wǎng),兩者采用工控機(jī)連接?,F(xiàn)場(chǎng)總線通過(guò)PCI板卡連接到工控機(jī),然后由工控機(jī)通過(guò)網(wǎng)卡連接到企業(yè)的管理層。這種連接方式成本高,開(kāi)發(fā)周期長(zhǎng)。針對(duì)這些情況,本文提出了一種基于微處理器的嵌入式CAN-以太網(wǎng)網(wǎng)關(guān)互連系統(tǒng)的設(shè)計(jì)方案,成功地實(shí)現(xiàn)以太網(wǎng)和CAN現(xiàn)場(chǎng)總線網(wǎng)絡(luò)的直接數(shù)據(jù)傳輸。
1 硬件設(shè)計(jì):
硬件的實(shí)現(xiàn)方案有多種,對(duì)于TCP/IP協(xié)議,可以用軟件來(lái)實(shí)現(xiàn)TCP/IP協(xié)議棧,也可以直接利用集成TCP/IP協(xié)議棧芯片,如W3100A。對(duì)于CAN協(xié)議,可以使用集成有CAN協(xié)議的微處理器如PIC18f258,也可以使用單獨(dú)的協(xié)議芯片如SJA1000。本文采用的是微處理器P89C51RD2,外加CAN控制器SJA1000、CAN收發(fā)器P82c250以及網(wǎng)絡(luò)芯片RTL8019AS,組成協(xié)議網(wǎng)關(guān)。
CAN網(wǎng)絡(luò)采用SJA1000獨(dú)立控制器,它是PHLIPS公司的PCA82C200控制器的替代產(chǎn)品。
以太網(wǎng)協(xié)議芯片采用臺(tái)灣的Realtek公司生產(chǎn)的RTL8019AS,它是以太網(wǎng)控制器芯片,集成了介質(zhì)訪問(wèn)控制子層(MAC)和物理層的性能,可以方便地設(shè)計(jì)基于ISA總線的系統(tǒng),簡(jiǎn)單的與通用單片機(jī)進(jìn)行接口。另外,它還具有與NE2000兼容、軟件移植性好,以及低價(jià)格廉等優(yōu)點(diǎn) 。它提供給微控制器控制以太網(wǎng)的簡(jiǎn)單接口,使微控制器只需要對(duì)其進(jìn)行相應(yīng)讀寫(xiě)即可完成對(duì)以太網(wǎng)的操作。電路中擴(kuò)展一片62256,用于存儲(chǔ)中轉(zhuǎn)的數(shù)據(jù),擴(kuò)展x5045,用于芯片復(fù)位及存儲(chǔ)網(wǎng)絡(luò)地址,CAN節(jié)點(diǎn)地址等信息。這里僅給出RTL8019AS的硬件連線圖。
圖1 RTL8019連線圖
2 軟件設(shè)計(jì):
軟件設(shè)計(jì)分為CAN網(wǎng)絡(luò)的軟件設(shè)計(jì)和TCP/IP的軟件設(shè)計(jì),以及CAN到以太網(wǎng)通訊的程序設(shè)計(jì)。
2.1 CAN協(xié)議:
CAN協(xié)議編程相對(duì)簡(jiǎn)單,只需要對(duì)SJA1000相應(yīng)的寄存器進(jìn)行讀寫(xiě)操作即可。在該模式下,報(bào)文識(shí)別碼為11位,在經(jīng)過(guò)驗(yàn)收濾波器的篩選后,符合條件的報(bào)文才能被接收,并存入SJA1000接收緩沖區(qū)。識(shí)別碼值越小,優(yōu)先級(jí)越高。如果總線上出現(xiàn)報(bào)文沖突,優(yōu)先級(jí)高的報(bào)文選占據(jù)總線。CAN節(jié)點(diǎn)間每次最多傳送的數(shù)據(jù)為10個(gè)字節(jié),以下是SJA1000的接收數(shù)據(jù)流程圖:
圖2 CAN總線接收數(shù)據(jù)流程圖
2.2 以太網(wǎng)的驅(qū)動(dòng)編寫(xiě):
RTL8019的操作是比較簡(jiǎn)單的,驅(qū)動(dòng)程序只需要將要發(fā)送的數(shù)據(jù)按一定的格式寫(xiě)入芯片并啟動(dòng)發(fā)送命令,RTL8019會(huì)自動(dòng)把數(shù)據(jù)包轉(zhuǎn)換成物理幀格式在物理信道上傳輸。反之,8019收到物理信號(hào)后將其還原成數(shù)據(jù),按指定格式存放在芯片RAM中以便主機(jī)程序取用。簡(jiǎn)言之就是8019完成數(shù)據(jù)包和電信號(hào)之間的相互轉(zhuǎn)換。以太網(wǎng)協(xié)議由芯片硬件自動(dòng)完成,對(duì)程序員透明。驅(qū)動(dòng)程序有3種功能:芯片初始化、收包、發(fā)包。
RTL8019AS負(fù)責(zé)網(wǎng)絡(luò)上數(shù)據(jù)的接收和發(fā)送,為了能夠使其啟動(dòng)并處于準(zhǔn)備接收或準(zhǔn)備發(fā)送數(shù)據(jù)的狀態(tài),必須對(duì)相應(yīng)的寄存器進(jìn)行初始化,這些寄存器包括CR、DCR、 RBCR、 PSTART、 PSTOP 、ISR、IMR 、PAR0-PAR5、 MAR0-MAR7、 CURR、TCR、RCR等。
Void Intnet()
{
Reg00=0x21; //使芯片處于停止模式,這時(shí)進(jìn)行寄存器設(shè)置
Delay_MS(10); //延時(shí)10毫秒,確保芯片進(jìn)入停止模式
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ā)送起始頁(yè)寄存器
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; //這時(shí)讓芯片開(kāi)始工作
SetMacID(); //將芯片物理地址寫(xiě)入到MAR寄存器
page(0);
Reg0c=0xcc; //將芯片設(shè)置成正常模式,跟外部網(wǎng)絡(luò)連接
Reg0d=0xe0;
Reg00=0x22; //啟動(dòng)芯片開(kāi)始工作
Reg07=0xff; //清除所有中斷標(biāo)志位
?。?
發(fā)送數(shù)據(jù)程序,先將數(shù)據(jù)按照一定的格式,放入ram中,設(shè)定發(fā)送數(shù)據(jù)的起始頁(yè)地址和發(fā)送的長(zhǎng)度,然后填寫(xiě)發(fā)送命令,芯片會(huì)自動(dòng)的將數(shù)據(jù)轉(zhuǎn)化為物理幀格式在物理信道上傳輸。同時(shí)發(fā)送的結(jié)果會(huì)寫(xiě)入狀態(tài)寄存器,可以通過(guò)查詢(xún)?cè)摷拇嫫髋袛鄶?shù)據(jù)是否成功發(fā)送出去,以便進(jìn)行后續(xù)處理。主程序通過(guò)查詢(xún)或是接收中斷的方式得知有新的數(shù)據(jù)到來(lái),數(shù)據(jù)接收到之后,會(huì)放到有pstart和pstop兩個(gè)寄存器所限定的循環(huán)列隊(duì)中。
2.3 TCP/IP協(xié)議:
TCP/IP是一個(gè)分層的協(xié)議,每一層實(shí)現(xiàn)一個(gè)明確的功能,對(duì)應(yīng)一個(gè)或是幾個(gè)傳輸協(xié)議,每層相對(duì)它的下層都作為一個(gè)相對(duì)獨(dú)立的數(shù)據(jù)包來(lái)實(shí)現(xiàn)。 協(xié)議分層結(jié)構(gòu),如圖所示:
[align=center]
圖3 以太網(wǎng)數(shù)據(jù)分用示意圖[/align]
圖是按照TCP/IP協(xié)議的四層參考模型而設(shè)計(jì)的,實(shí)際上也是以太網(wǎng)接收數(shù)據(jù)的流程,同時(shí)也體現(xiàn)了一種以太網(wǎng)數(shù)據(jù)分用的思想。
主機(jī)收到以太網(wǎng)的數(shù)據(jù)幀后,就開(kāi)始從協(xié)議中由數(shù)據(jù)鏈路層向上升,同時(shí)會(huì)被剝離其中各層協(xié)議所加的首部,最后只留下用戶(hù)數(shù)據(jù),這部分工作由用戶(hù)程序來(lái)完成。Rtl8019AS僅負(fù)責(zé)把數(shù)據(jù)接收進(jìn)其內(nèi)部的數(shù)據(jù)緩沖區(qū)。
在編程的時(shí)候,使用如下的程序框架
if(以太網(wǎng)數(shù)據(jù)報(bào)到達(dá))
?。?if( 以太網(wǎng)首部幀類(lèi)型==0x0806 )
?。?ARP處理程序 }
if( 以太網(wǎng)首部幀類(lèi)型==0x0805 )
?。?RARP處理程序 }
if( 以太網(wǎng)首部幀類(lèi)型==0x0800 )
?。?根據(jù)IP包的協(xié)議類(lèi)型分別區(qū)分是TCP包還是UDP包}
?。?
發(fā)送數(shù)據(jù)時(shí)要對(duì)數(shù)據(jù)進(jìn)行逐層封裝,即加上相應(yīng)的首部,作為所經(jīng)過(guò)每層的標(biāo)識(shí)。具體原理是將用戶(hù)數(shù)據(jù)加上本層的標(biāo)志,然后發(fā)往協(xié)議的下一層,然后加上下一層的協(xié)議標(biāo)志,繼續(xù)向下傳,這樣依次向下傳,到最后可以得到所傳送的真正數(shù)據(jù)。
根據(jù)以上的介紹,在接收的過(guò)程中體現(xiàn)數(shù)據(jù)分用的思想,自以太網(wǎng)數(shù)據(jù)發(fā)送的過(guò)程中體現(xiàn)數(shù)據(jù)封裝的思想。
2.4 CAN與以太網(wǎng)的數(shù)據(jù)交換:
數(shù)據(jù)交換原理簡(jiǎn)單說(shuō)就是對(duì)以太網(wǎng)收到的數(shù)據(jù)進(jìn)行分層。取出TCP中的數(shù)據(jù),校驗(yàn)分析,然后按照CAN模式進(jìn)行發(fā)送。反過(guò)來(lái),當(dāng)接收到CAN網(wǎng)絡(luò)的數(shù)據(jù)后,除去地址和個(gè)數(shù)等信息,將其余數(shù)據(jù)按照TCP/IP協(xié)議進(jìn)行封裝發(fā)送。進(jìn)入由CAN接收數(shù)據(jù)引起外部中斷后,將數(shù)據(jù)存入緩沖區(qū),并根據(jù)自己定義的協(xié)議判斷是否是最后一幀,如果不是,則保存數(shù)據(jù),退出中斷,否則,關(guān)閉其他中斷,調(diào)用以太網(wǎng)發(fā)送子程序,將數(shù)據(jù)發(fā)向以太網(wǎng)。進(jìn)入由以太網(wǎng)引起得中斷后,取出其中TCP中的有效數(shù)據(jù),并分析,如果需要發(fā)送,關(guān)閉其他的中斷,將數(shù)據(jù)打包,調(diào)用CAN發(fā)送子程序。同時(shí)也可以通過(guò)命令,重新設(shè)置該模塊的IP地址,或是該模塊CAN節(jié)點(diǎn)號(hào)等。
3 結(jié)論:
由于CAN總線每次只能傳輸8個(gè)有效地字節(jié),為了有效的和以太網(wǎng)通訊,我們?cè)贑AN網(wǎng)絡(luò)使用了自己定義的協(xié)議。同時(shí),為了實(shí)現(xiàn)設(shè)定IP或是更改節(jié)點(diǎn)號(hào)等功能,我們?cè)诨赥CP協(xié)議的應(yīng)用層,也定義了自己的協(xié)議。通過(guò)該模塊實(shí)現(xiàn)了CAN與以太網(wǎng)的基本的數(shù)據(jù)交換。經(jīng)過(guò)測(cè)試,取得的良好的效果。隨著分布式測(cè)控系統(tǒng)的優(yōu)勢(shì)凸現(xiàn),CAN/TCP嵌入式網(wǎng)關(guān)在實(shí)際中的應(yīng)用也會(huì)越來(lái)越廣泛。
參考文獻(xiàn):
[1] 基于嵌入式web服務(wù)器的UPS監(jiān)測(cè)系統(tǒng) 微計(jì)算機(jī)信息 2005年13期
[2]RTL8019AS datasheet , http://www.realtek.com.cn