《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 單片機實現(xiàn)串口協(xié)議的網(wǎng)絡(luò)化
單片機實現(xiàn)串口協(xié)議的網(wǎng)絡(luò)化
維庫
摘要: 網(wǎng)卡RAM區(qū)如圖2所示,,我們設(shè)置PSTART和PSTOP,就決定了接收區(qū)域在46和7F之間,剩下6頁作為發(fā)送緩沖區(qū),,可以滿足一次發(fā)送容量為1514byte的最大以太網(wǎng)數(shù)據(jù)包的要求,。CURR初始值設(shè)為47,BNRY初始值設(shè)為46。當(dāng)收到新的數(shù)
Abstract:
Key words :

  網(wǎng)卡RAM區(qū)如圖2所示,,我們設(shè)置PSTART和PSTOP,就決定了接收區(qū)域在46和7F之間,,剩下6頁作為發(fā)送緩沖區(qū),,可以滿足一次發(fā)送容量為1514byte的最大以太網(wǎng)數(shù)據(jù)包的要求,。CURR初始值設(shè)為47,BNRY初始值設(shè)為46。當(dāng)收到新的數(shù)據(jù)包時(例如3頁),,網(wǎng)卡將它們依次放到47,、48和49頁,CURR自動指向4A頁。當(dāng)我們讀完這3頁的數(shù)據(jù)包后,,要將BNRY改為49,以通知網(wǎng)卡數(shù)據(jù)包已經(jīng)讀完了,。

 

  網(wǎng)卡芯片接收到以太網(wǎng)數(shù)據(jù)包后,存在CURR指向的頁面中,。一個數(shù)據(jù)包可以占據(jù)一頁,,也可以占據(jù)多頁。在接收包的包頭里,,保存有該包的信息,。包頭格式如表1:

  讀完這個包頭,我們就能知道本包的接收狀態(tài),,包長度,,以及下一個包的位置。在接收循環(huán)中,,檢查中斷狀態(tài)寄存器ISR狀態(tài),,發(fā)現(xiàn)有新包來,先讀取包頭信息,,接著按照包頭指示讀取全包,,然后改寫B(tài)NRY,再接著讀下一個包,這樣循環(huán),,直到達到CURR位置,。注意,一個包有可能占據(jù)接收緩沖區(qū)的首,、尾頁面,,此時須小心讀取。

  發(fā)送數(shù)據(jù)包比較簡單,,將準備好的數(shù)據(jù)用DMA傳到發(fā)送緩沖區(qū),,然后設(shè)置發(fā)送長度到TBCR1和TBCR0中,再設(shè)置傳輸開始頁面,,即令TPSR=0x40,最后,,使CR=0x26,就開始傳送了。

  傳送完成后要清掉中斷狀態(tài)寄存器ISR的發(fā)送完成標志,。值得注意的是,,發(fā)送包的包長度不能小于以太網(wǎng)規(guī)定的60byte,否則網(wǎng)卡不會將其發(fā)出。

  3 TCP/IP協(xié)議在單片機上的軟件設(shè)計

  3.1 TCPIP協(xié)議棧和鏈路層格式

  Internet上使用的是TCP/IP協(xié)議簇,,由下至上包含四層:數(shù)據(jù)鏈路層,、網(wǎng)絡(luò)層(IP)、傳輸層(TCP)和應(yīng)用層,。我們在單片機上能實現(xiàn)的是數(shù)據(jù)鏈路層的功能,,上層協(xié)議鑒于單片機有限的資源,只能實現(xiàn)部分功能。TCP/IP協(xié)議棧如表2:

  數(shù)據(jù)鏈路層處于協(xié)議棧的最低層,,傳輸以太網(wǎng)的物理傳輸幀,,其幀格式如表3:

  數(shù)據(jù)鏈路層是所有TCP/IP包的基礎(chǔ),所有它上層的包都被封裝到鏈路層幀的數(shù)據(jù)段中,。鏈路層就是MAC對MAC的通信,。

  3.2 PING命令在單片機上的實現(xiàn)

  PING是網(wǎng)絡(luò)層(IP層)的命令,網(wǎng)絡(luò)層就是IP對IP之間的通信,。主機對一個目標IP地址發(fā)出狀態(tài)請求,,后者發(fā)出回應(yīng),這樣,,就可以用來檢查兩者之間的線路是否暢通,。這里涉及到兩個網(wǎng)絡(luò)層協(xié)議:

  ARP和ICMP。首先,,網(wǎng)絡(luò)中要知道目標IP的MAC地址,,才能發(fā)送數(shù)據(jù)。為了獲取該地址,,我們向整個網(wǎng)絡(luò)發(fā)送一個ARP廣播包,,詢問該IP對應(yīng)的MAC地址,然后目標IP應(yīng)答,,我們就從應(yīng)答信息中得到MAC地址,。其次,發(fā)送一個ICMP包,,請求目標IP狀態(tài),,目標IP回應(yīng),就完成網(wǎng)絡(luò)連接測試,。在我們的實驗中,,發(fā)出PING命令的是網(wǎng)絡(luò)中的PC主機,接收信號并產(chǎn)生響應(yīng)的是我們的單片機系統(tǒng),。我們假定單片機系統(tǒng)控制的網(wǎng)卡的IP為192.168.0.176,。

  第一步,實現(xiàn)ARP協(xié)議,。ARP協(xié)議是"AddressResolutionProtocol"(地址解析協(xié)議)的縮寫,,它的作用是將IP地址轉(zhuǎn)換成物理地址(就是常說的MAC地址)。協(xié)議ARP的分組格式如表4:

  當(dāng)單片機主處理器處理網(wǎng)卡收到的ARP廣播請求時,,如果發(fā)現(xiàn)是請求“192.168.0.176”的MAC地址,,于是按要求打一個ARP應(yīng)答包,將自己的MAC地址放到應(yīng)答包中,,發(fā)送回網(wǎng)絡(luò)就完成了PING的第一步,。注意,要在應(yīng)答包尾加18byte的補丁,,否則應(yīng)答包長度不滿足最小60byte的要求,。

  第二步,實現(xiàn)ICMP協(xié)議,。ICMP是“InternetControlMessageProtocol”(Internet控制消息協(xié)議)的縮寫,。用于在IP主機、路由器之間傳遞控制消息,??刂葡⑹侵妇W(wǎng)絡(luò)通不通、主機是否可達,、路由是否可用等網(wǎng)絡(luò)本身的消息,。這些控制消息雖然并不傳輸用戶數(shù)據(jù),但是對于用戶數(shù)據(jù)的傳遞起著重要的作用,。

  ICMP是封裝在IP協(xié)議中,,所以有IP包頭。

  ICMP協(xié)議結(jié)構(gòu)如表5:

  網(wǎng)絡(luò)主機在收到ARP的應(yīng)答包后,,取出其中的MAC地址,,然后向該MAC發(fā)出ICMP請求。主處理器處理該請求時,,將請求包的標識和序列號對應(yīng)填入ICMP應(yīng)答包,,其它部分按要求填寫。校驗和的計算有成熟的公式,,容易計算,,只要先把校驗和部分置0,將包頭的計算結(jié)果再填入校驗和就可以了。

  最后將該ICMP應(yīng)答包送入網(wǎng)絡(luò),,這樣就完成了PING的全過程,。此時,發(fā)出PING命令的網(wǎng)絡(luò)主機就會得到“Replyfrom192.168.0.176:bytes=32time<10msTTL=128”的信息,。

  4 串行數(shù)據(jù)與網(wǎng)絡(luò)的數(shù)據(jù)交換的討論

  網(wǎng)絡(luò)層之上,,有兩種傳輸層協(xié)議:TCP(Trans2missionControlProtocol)和UDP(UserDatagramProtocol)。對于數(shù)據(jù)傳輸要求高的場合,,需要使用TCP協(xié)議作為雙方通信方式,,但此種方式較為復(fù)雜。而對于一些實時信號及其反向控制信號的傳遞,,實現(xiàn)UDP協(xié)議就可以滿足要求了,。表6是UDP協(xié)議結(jié)構(gòu):

  當(dāng)原始數(shù)據(jù)從串口送到到主處理器后,主處理器將其打包成UDP報文,,發(fā)送到網(wǎng)絡(luò)中,。網(wǎng)絡(luò)端監(jiān)控主機接收并處理該UDP報文,,然后將控制信息同樣以UDP報文發(fā)出。主處理器把網(wǎng)絡(luò)控制信號返回給串口,。這樣,,我們在Internet中就可以方便地完成對現(xiàn)場串口數(shù)據(jù)源的監(jiān)視和控制過程。

  5 結(jié)語

  因為單片機對于各種電器設(shè)備有良好的接入和控制能力,,所以,,我們實現(xiàn)了單片機的網(wǎng)絡(luò)接入功能后,就在電器的硬件設(shè)備和網(wǎng)絡(luò)之間建起了一道橋梁,。通過它,,可以實現(xiàn)對各種實時信號、儀器儀表,、家用設(shè)施等目標的遠程監(jiān)視,,在宏觀上對各種設(shè)備統(tǒng)一管理,實現(xiàn)人與系統(tǒng)的和諧的交互,。這必將大大提高工作效率,,改善工作環(huán)境,提升人們的生產(chǎn),、生活水平,。

 

 

 本文深入研究了使用單片機控制網(wǎng)卡,接入以太網(wǎng)Ethernet,即IEEE802.3協(xié)議網(wǎng)絡(luò),,實現(xiàn)串口儀器的網(wǎng)絡(luò)化,。

  1 硬件結(jié)構(gòu)和電路設(shè)計

  1.1 總體設(shè)計

  整個系統(tǒng)設(shè)計采用ATMEL公司8位通用微控制器AT89C51作為主處理器,驅(qū)動REALTEK公司的10M以太網(wǎng)控制芯片RTL8019AS,實現(xiàn)串口數(shù)據(jù)和外部網(wǎng)絡(luò)互連,。

  1.2 網(wǎng)卡接線設(shè)計

  RTL8019AS為100管腳PQFP封裝,,工作電壓5V。其接線原理圖如圖1所示,。地址SA0-4接到單片機P2的低五位上,;SA8和SA9接電源;其余SA5-7,SA10-19這13個管腳全部接地,;IORB和IOWB分別接單片機的讀寫信號端,;RSTDRV接到P1.2上;8位數(shù)據(jù)SD0-7按順序接到單片機P0.020.7腳,;TPOUT+和PTOUT-是發(fā)送管腳對,,連接到RJ45口的發(fā)送腳1和2;而TPIN+和TPIN-則是接收管腳對,連接到RJ45口的接收腳3和6;管腳X1和X2之間接20M的晶振及接地電容,;LED0和LED1分別串接發(fā)光二極管和1k8電阻,,連到5V電源上;IOCS16B管腳串接27k8電阻接地,;管腳BD0-3(IOS0-3)是負責(zé)定義基地址位置的,,全部懸空,,作為0輸入。

  LED0默認表示通信沖突COL,LED1表示接收數(shù)據(jù)包,。發(fā)送對和接收對不能直接接到RJ45插頭上,,要通過隔離電壓模塊(選用20F-01)和RJ45相連。網(wǎng)卡有16bit數(shù)據(jù)線,,可以使用16bit或8bit模式傳送數(shù)據(jù),,使IOCS16B管腳為低,,我們選中的是8bit模式,。

  1.3 串行接口部分

  1串口部分采用MAX232和9針串口。單片機P3.0/RXD0和P3.0/RXD0通過MAX232芯片分別接到串口的2針和3針上,。串口5針接地,。

  串行口選擇工作方式1,這時的波特率計算公式為:

  串口在9600波特率時,晶振選用11.0592M,預(yù)設(shè)值算得0xFD,smod=0;晶振選用16MHz,預(yù)設(shè)值為0xF7,smod=1,。

  2 網(wǎng)卡的初始化和工作過程

  2.1 網(wǎng)卡芯片RTL8019AS的控制方法

  控制網(wǎng)卡芯片RTL8019AS是通過讀寫芯片上的32個字節(jié)的控制寄存器組實現(xiàn)的,。另外該芯片含有16kbyte的RAM,地址為0x400020x7fff。這些RAM不能通過單片機直接尋址,,必須通過32個字節(jié)的控制寄存器組,,以DMA方式讀寫它們。

  32個字節(jié)的控制寄存器組可以由單片機直接尋址,,但其基地址是通過管腳BD0-3(IOS0-3)配置的,。電路中將四個管腳全部懸空,全0輸入,,產(chǎn)品資料說明其基地址為300H,。

  這32個字節(jié)的控制寄存器組分成4頁,00H寄存器稱為CommandRegister(CR),,CR的最高兩位代表目前寄存器處于哪一頁,。01H到0FH在不同的頁有不同的意義,同時,,即使同一頁,,讀和寫代表的意義也可能不同,這一點很值得注意,。10H217H是遠程DMA端口,,而18H-1FH是網(wǎng)卡復(fù)位端口。

  2.2 DMA數(shù)據(jù)通道

  RTL8019AS內(nèi)部劃分為遠程DMA(RemoteDMA)通道和本地DMA(LocalDMA)通道兩個部分,。本地DMA完成控制器與網(wǎng)線的數(shù)據(jù)交換,,遠程DMA完成主處理器與網(wǎng)卡數(shù)據(jù)交換。單片機主處理器收發(fā)數(shù)據(jù)只需對遠程DMA操作,。接收數(shù)據(jù)時,,RTL8019AS接收到的數(shù)據(jù)通過MAC比較,、CRC校驗后,由FIFO存到接收緩沖區(qū),,收滿一幀后,,以中斷或寄存器標志的方式通知主處理器,主處理器通過遠程DMA通道將其讀出,。當(dāng)主處理器要向以太網(wǎng)發(fā)送數(shù)據(jù)時,,先將一幀數(shù)據(jù)通過遠程DMA通道送到RTL8019AS中的發(fā)送緩存區(qū),然后發(fā)出傳送命令,;RTL8019AS在完成了上一幀的發(fā)送后,,再完成此幀的發(fā)送。

  所謂的DMA就是直接內(nèi)存訪問(DirectMem2oryAccess),。普通的尋址方式是給出一個地址,,然后取出對應(yīng)的值。而在DMA方式下,,我們指定一個寄存器地址,,主機只要反復(fù)地讀取或?qū)懭脒@個地址,就可以取出或?qū)懭氪罅康臄?shù)據(jù),。網(wǎng)卡指定的遠程DMA端口就是這個用途,。設(shè)置好起始地址和讀出的byte數(shù)后,我們反復(fù)讀遠程DMA端口,,就可以將網(wǎng)卡里從網(wǎng)線收到的數(shù)據(jù)包,,從0x400020x7fff的RAM區(qū)讀出;反之,,同樣設(shè)置好起始地址和寫入的byte數(shù)后,,我們反復(fù)寫遠程DMA端口,就可以將數(shù)據(jù)發(fā)送到網(wǎng)卡的發(fā)送緩沖RAM中,,然后發(fā)出發(fā)送的命令,,就可以把數(shù)據(jù)包發(fā)送到網(wǎng)線中。

  2.3 網(wǎng)卡的初始化過程

  復(fù)位,,使RSTDRV先高后低,,注意每一步都要有100ms的延時,以確保復(fù)位成功,。然后進行熱復(fù)位,,就是先后讀、寫網(wǎng)卡復(fù)位端口,。

  使CR=0x21,停止芯片運行,,選擇頁面0。

  使RBCR1=0;RBCR0=0,將遠程DMA操作的傳輸字節(jié)數(shù)清零,。

  使PSTART=0x46;PSTOP=0x80;BNRY=0x46,設(shè)置接收開始頁面,、結(jié)束頁面和邊界頁面,。

  使IMR=0x0,清除中斷屏蔽寄存器。

  使RCR=0x08+0x04,設(shè)置接收配置寄存器,,允許接收多址和廣播報文,。

  使TCR=0,設(shè)置發(fā)送配置寄存器,使用默認配置,。

  使DCR=0x80+0x40+0x00,設(shè)置數(shù)據(jù)配置寄存器,,選擇字節(jié)DMA。

  使ISR=-1,設(shè)置中斷狀態(tài)寄存器,,清除所有已有中斷,。

  使用DMA方式,從0000H2000BH中取得本網(wǎng)卡MAC地址,。注意,,MAC地址每個byte都是重復(fù)一遍存放的,,所以只要取單數(shù)1,、3、5等byte就可以了,。

  使CR=0x61,選擇頁面1,。

  將剛才取得的MAC地址放入PAR0-5中。網(wǎng)卡檢查接收到的包是否和PAR里MAC值匹配,,然后決定收下或丟棄,。所以,也可以任意設(shè)置這個PAR值,,來偽造自己的MAC值,。

  將MAR02MAR7全部設(shè)為0xFF,允許接收所有的多址數(shù)據(jù)包。

  使CURR=0x47,設(shè)置當(dāng)前接收頁面為0x47,。

  使CR=0x22,啟動網(wǎng)卡芯片,,開始接收和發(fā)送過程。

  2.4 網(wǎng)卡工作接收和發(fā)送過程

  網(wǎng)卡RAM是以256byte為一頁,,是按頁存儲的結(jié)構(gòu),,16bit的RAM地址高8bit又叫頁碼。網(wǎng)卡的16k的RAM地址從0x400020x7fff,從頁0x40到頁0x7f,一共有64頁,。64頁被接收和發(fā)送數(shù)據(jù)包用,。接收和發(fā)送都是以頁為最小的單位進行的。接收緩沖區(qū)需要定義,,剩下的就可以作為發(fā)送緩沖區(qū),。

  接收緩沖區(qū)由兩個寄存器決定:PSTART(PageStartRegister)和PSTOP(PageStopRegister)。設(shè)置了接收緩沖區(qū)之后,,這個緩沖區(qū)就形成了一個循環(huán)隊列,??刂平邮站彌_區(qū)的有兩個寄存器CURR、BNRY,。CURR是網(wǎng)卡寫緩沖區(qū)的指針,,指向當(dāng)前要寫的頁;BNRY是讀指針,,指向用戶已經(jīng)讀走的頁,。

  BNRY不可以超過CURR,否則沒被用戶讀取的數(shù)據(jù)就被覆蓋了。用戶設(shè)置完了CURR以后,,就不用管它,,網(wǎng)卡接收到新的數(shù)據(jù)后,會自動修改它,。用戶讀出數(shù)據(jù)后,,要修改BNRY的值,以通知網(wǎng)卡該數(shù)據(jù)已經(jīng)讀出了,。

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。