??? 摘? 要: 用8位單片機8031和ISA總線網(wǎng)卡,實現(xiàn)RS485串行設備與以太網(wǎng)的連接,以傳送控制信令和數(shù)據(jù)文件。程序設計采用C51語言,便于移植和調(diào)試。?
??? 關鍵詞: 以太網(wǎng)? 串行通訊? 單片機? C51
?
??? 單片機或微控制器(MCU)(也稱為嵌入式系統(tǒng))已經(jīng)在各個領域得到了廣泛的應用。目前絕大多數(shù)系統(tǒng)都是以MCU為核心,與監(jiān)測、伺服、指示設備配合實現(xiàn)一定的功能。以太網(wǎng)是當今最受歡迎的局域網(wǎng)之一,現(xiàn)已成為社會重要的基礎信息設施, 是信息流通的重要渠道。如果嵌入式系統(tǒng)能夠連接到Internet,則可以方便、低廉地將信息傳送到世界上的任何一個地方。?
??? 將嵌入式系統(tǒng)與Internet相連的主要困難在于:Internet的各種通信協(xié)議對存儲器、運算速度等的要求比較高;而嵌入式系統(tǒng)中除部分32位處理器外,大量存在的是8位和16位MCU,支持TCP/IP等Internet協(xié)議將占用大量系統(tǒng)資源,影響本來的功能或根本不可能實現(xiàn)。?
??? 本文用8031單片機和RTL8019AS網(wǎng)卡實現(xiàn)了RS485串口設備數(shù)據(jù)文件通過以太網(wǎng)傳輸?shù)竭h端計算機的功能。?
1 串行通訊?
??? 串行通訊在通訊領域被廣泛應用。RS232接口已成為計算機、計算機外設、交換機和許多通訊設備的標準接口。在我國工業(yè)總線的應用中,RS485、RS422使用最為普遍。?
??? 在串行接口連接中,按連接方式可分為:面向連接和無連接。無連接原理比較簡單,通訊雙方無握手過程。一方如有數(shù)據(jù)需要發(fā)送,則立即通過串行接口發(fā)送出去,另一方被動接收。該方式能夠達到較高的通訊速率,但不能保證數(shù)據(jù)傳輸?shù)目煽啃?可用于對數(shù)據(jù)可靠性要求不高的場合,如語音、圖像等。而面向連接方式則不同。甲方有數(shù)據(jù)發(fā)送請求時,向乙方發(fā)送“請求發(fā)送數(shù)據(jù)”命令;乙方收到后,如準備就緒,則回送確認信息;甲方得到乙方的確認后方可發(fā)送數(shù)據(jù)。大多數(shù)情況下,乙方要對收到的數(shù)據(jù)進行校驗,校驗正確發(fā)送“通訊終止”命令;否則發(fā)送“重發(fā)”命令。面向連接的串行通訊過程實現(xiàn)起來要復雜得多,通常用于數(shù)據(jù)文件的傳輸。?
2 以太網(wǎng)的物理傳輸幀?
??? 標準IEEE802.3幀結構由七部分組成,如表1所示。除了數(shù)據(jù)域的長度不固定外,其他部分的長度都是固定不變的。在發(fā)送數(shù)據(jù)時,幀頭、起始位和校驗位都是網(wǎng)卡自動添加;在接收數(shù)據(jù)時,幀頭和起始位將被網(wǎng)卡自動跳過,即網(wǎng)卡一旦檢測到有效幀頭和幀起始位,就認為有效數(shù)據(jù)開始,并將有效數(shù)據(jù)存入接收緩沖環(huán)。?
?
?
3 以太網(wǎng)卡?
??? RTL8019AS網(wǎng)卡是8/16位ISA總線的網(wǎng)卡,遵循IEEE802.3協(xié)議。按功能可將其劃分為:接收功能模塊、CRC產(chǎn)生模塊、發(fā)送功能模塊、地址識別模塊、FIFO控制模塊、協(xié)議邏輯陣列模塊及DMA和緩沖控制模塊。對網(wǎng)卡進行編程可以實現(xiàn)局域網(wǎng)內(nèi)任意站點之間的通信而不需要網(wǎng)絡操作系統(tǒng)的支持。?
??? 熟悉網(wǎng)卡接口電路是對網(wǎng)卡編程的首要條件。網(wǎng)卡接口電路可分為兩部分:一是與計算機ISA總線相連,包括數(shù)據(jù)總線讀寫、地址總線驅動、中斷控制信號的產(chǎn)生、存儲器讀寫信號以及I/O端口讀寫信號的引入等;二是對網(wǎng)卡內(nèi)部的操作,包括對緩沖RAM的讀寫、對RTL8019AS的控制、讀站地址PROM以及讀自舉ROM等。ISA總線共有98個信號,通過對網(wǎng)卡工作原理的分析,可以將接口信號線減至最少。表2是驅動RTL8019AS網(wǎng)卡所需的信號線。?
?
?
4 硬件框圖?
??? 系統(tǒng)采用8031為CPU主芯片,使用32K字節(jié)的外部存儲器62256來存放以太網(wǎng)包(最大可以有1500字節(jié))和串行數(shù)據(jù),8K字節(jié)的2764存放程序,用75176與485總線通訊。系統(tǒng)的數(shù)據(jù)和地址總線分別與網(wǎng)卡的數(shù)據(jù)和地址總線相連。硬件框圖如圖1所示。?
?
?
5 軟件設計?
??? 對網(wǎng)卡編程就是對網(wǎng)絡接口控制器(NIC)RTL8019AS中各種寄存器進行編程控制,從而完成數(shù)據(jù)分組的正確發(fā)送和接收。所有程序采用Franclin C51語言編制,具有可讀性強、移植性好、開發(fā)周期短的特點。在代碼的使用效率上,也完全可以和匯編語言相比。?
5.1 主程序?
??? 主程序可分為網(wǎng)絡通訊和串行通訊兩部分。網(wǎng)絡通訊過程又可分為網(wǎng)卡初始化、發(fā)送控制和接收控制三部分。主程序框圖如圖2所示。?
5.2 網(wǎng)卡初始化過程?
??? 對網(wǎng)卡的初始化就是對相關寄存器進行初始化。這些寄存器包括CR、DCR、RBCR、PSTART、PSTOP、ISR、IMR、PAR0~PAR5、MAR0~MAR5、CURR、TCR和RCR等。初始化過程如下:?
??? (1)CR=0x21:選擇頁0寄存器,將NIC處于離線狀態(tài);?
??? (2)DCR=0x88:8位內(nèi)存訪問,正常工作方式;?
??? (3)RBCR0=0,RBCR1=0:遠程DMA操作時傳遞字節(jié)數(shù)清零;?
??? (4)RCR=0xc0:接收到的幀存入緩沖環(huán);?
??? (5)TCR=0xe2:環(huán)路測試狀態(tài);?
??? (6)PSTART=0x4c,PSTOP=0x80:構造緩沖環(huán);?
??? (7)ISR=0xff:中斷寄存器清零;?
??? (8)IMR=0x00:屏蔽所有的中斷;?
??? (9)CR=0x61:選擇頁1;?
??? (10)設置網(wǎng)卡地址PAR0~PAR5;?
??? (11)設置多址寄存器MAR0~MAR5;?
??? (12)CURR=0x4d:初始化當前頁寄存器;?
??? (13)CR=0x22:選擇頁1,正常工作狀態(tài);?
??? (14)TCR=0XE0:發(fā)送器正常工作狀態(tài)。?
5.3 發(fā)送控制過程?
??? 在網(wǎng)絡中,幀傳輸?shù)倪^程就是發(fā)送方將待發(fā)送的數(shù)據(jù)按幀格式要求封裝成幀,然后通過網(wǎng)卡發(fā)送到網(wǎng)絡的傳輸線上。發(fā)送程序框圖如圖3所示。?
?
?
5.4 接收控制過程?
??? 幀的接收過程分為兩步:第一步由本地DMA將幀存入接收緩沖環(huán)中;第二步由遠程DMA將接收緩沖環(huán)中的幀讀入內(nèi)存。即將網(wǎng)絡上的數(shù)據(jù)幀接收并緩存在網(wǎng)卡的接收緩沖環(huán)中,然后由主機程序將緩存在緩沖環(huán)中的幀讀走并存入內(nèi)存中。?
??? 幀的接收工作由網(wǎng)卡自動完成,只需對相關的寄存器如PSTART、PSTOP、CURR和BNRY進行適當?shù)某跏蓟纯伞?
??? 幀讀入較幀接收要復雜一些。首先必須初始化相應的寄存器RSAR、RBCR,然后再啟動遠程DMA讀操作和主機程序的讀端口操作。?
??? 以下是接收數(shù)據(jù)幀的子程序。為了獲得數(shù)據(jù)長度,先讀入18個字節(jié)的數(shù)據(jù),然后根據(jù)有效數(shù)據(jù)的長度將幀完整讀入。為了啟動遠程DMA讀操作,應該令CR=0AH,遠程DMA將從接收緩沖環(huán)的DMA地址處讀入1字節(jié)并送往I/O數(shù)據(jù)端口,由主機程序讀入內(nèi)存。這一過程將一直持續(xù)到RBCR寄存器為0。?
??? void Receive_Data()?
??? {?
??? ? unsigned char data value,temp;?
??? ? unsigned int data datalength,i;?
??? ? RSAR1=Next_PKT;?
??? ? RSAR0=0;?
??? ? RBCR0=18;?
??? ? RBCR1=0;?
??? ? CR=0x0a;?
??? ? for(i=0;i<18;i++){?
??? ??? value=Data_Port;?
??? ??? recv_buf[i]=value;?
??? ? }?
??? ? datalength=(recv_buf[16]<<8)+recv_buf[17]+18;?
??? ? value=datalength&0x00ff;?
??? ? RBCR0=value;?
??? ? value=(datalength&0xff00)>>8;?
??? ? RBCR1=value;?
??? ? RSAR1=Next_PKT;?
??? ? RSAR0=0;?
??? ? CR=0x0a;?
??? ? for(i=0;i ??? ??? value=Data_Port;? ??? ??? recv_buf[i]=value;? ??? ? }? ??? }? 5.5 串口通訊子程序? ??? 為實現(xiàn)數(shù)據(jù)文件的串口傳輸編制了一個串口通訊協(xié)議。該協(xié)議由引導幀、長度幀、數(shù)據(jù)幀和確認幀等組成。其中引導幀用于同步每一包數(shù)據(jù)的引導頭,長度幀是這一包數(shù)據(jù)的總長度,數(shù)據(jù)幀是其中的數(shù)據(jù)信息,確認幀是接收方對發(fā)送方的回應。每幀數(shù)據(jù)由16個字節(jié)組成,每幀的第14個字節(jié)為標志位,第15字節(jié)為校驗位。標志位中有2位幀標志位,3位序號位。校驗采用和校驗,只計算0~13字節(jié),溢出值舍去。在發(fā)送方有數(shù)據(jù)發(fā)送時,先檢測線路是否空閑,如線路空閑則向接收方發(fā)送“請求發(fā)送數(shù)據(jù)”命令幀。接收機收到后,如準備就緒,則回送“可以發(fā)送”的確認命令。發(fā)送方得到確認后開始發(fā)送數(shù)據(jù)。接收方對收到的每一幀數(shù)據(jù)進行和校驗,校驗正確發(fā)送“和校驗正確”命令,發(fā)送方發(fā)送下一幀;否則發(fā)送“重發(fā)”命令,發(fā)送方重發(fā)此幀。協(xié)議中還具有等待超時處理、幀不同步處理和線路沖突檢測功能。? ??? 利用8位單片機8031驅動ISA總線網(wǎng)卡,實現(xiàn)串口設備通過以太網(wǎng)進行通訊,可以方便、可靠、低廉地將數(shù)據(jù)傳輸?shù)竭h端設備。而且,通過串口設備與以太網(wǎng)的相連,可以很好地解決多種工業(yè)總線的系統(tǒng)集成問題,同時也大大豐富了工業(yè)總線的體系,促使其向更高層次發(fā)展??梢灶A計,小型串口設備與以太網(wǎng)相連將帶來一場新的技術浪潮。? 參考文獻? 1 劉彥明,李 鵬.實用網(wǎng)絡編程技術.西安:西安電子科技大學出版社,1998? 2 李 鵬.計算機通信技術及其程序設計.西安:西安電子科技大學出版社,1998