1.1 總體設計
整個系統(tǒng)設計采用ATMEL公司8位通用微控制器AT89C51作為主處理器,驅動REALTEK公司的10M以太網控制芯片RTL8019AS,實現串口數據和外部網絡互連。
1.2 網卡接線設計
RTL8019AS為100管腳PQFP封裝,工作電壓5V。其接線原理圖如圖1所示。地址SA0-4接到單片機P2的低五位上;SA8和SA9接電源;其余SA5-7,SA10-19這13個管腳全部接地;IORB和IOWB分別接單片機的讀寫信號端;RSTDRV接到P1.2上;8位數據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)是負責定義基地址位置的,全部懸空,作為0輸入。
?
?
LED0默認表示通信沖突COL,LED1表示接收數據包。發(fā)送對和接收對不能直接接到RJ45插頭上,要通過隔離電壓模塊(選用20F-01)和RJ45相連。網卡有16bit數據線,可以使用16bit或8bit模式傳送數據,使IOCS16B管腳為低,我們選中的是8bit模式。
1.3 串行接口部分
1串口部分采用MAX232和9針串口。單片機P3.0/RXD0和P3.0/RXD0通過MAX232芯片分別接到串口的2針和3針上。串口5針接地。
串行口選擇工作方式1,這時的波特率計算公式為:
?
串口在9600波特率時,晶振選用11.0592M,預設值算得0xFD,smod=0;晶振選用16MHz,預設值為0xF7,smod=1。
2 網卡的初始化和工作過程
2.1 網卡芯片RTL8019AS的控制方法
控制網卡芯片RTL8019AS是通過讀寫芯片上的32個字節(jié)的控制寄存器組實現的。另外該芯片含有16kbyte的RAM,地址為0x400020x7fff。這些RAM不能通過單片機直接尋址,必須通過32個字節(jié)的控制寄存器組,以DMA方式讀寫它們。
32個字節(jié)的控制寄存器組可以由單片機直接尋址,但其基地址是通過管腳BD0-3(IOS0-3)配置的。電路中將四個管腳全部懸空,全0輸入,產品資料說明其基地址為300H。
這32個字節(jié)的控制寄存器組分成4頁,00H寄存器稱為CommandRegister(CR),CR的最高兩位代表目前寄存器處于哪一頁。01H到0FH在不同的頁有不同的意義,同時,即使同一頁,讀和寫代表的意義也可能不同,這一點很值得注意。10H217H是遠程DMA端口,而18H-1FH是網卡復位端口。
2.2 DMA數據通道
RTL8019AS內部劃分為遠程DMA(RemoteDMA)通道和本地DMA(LocalDMA)通道兩個部分。本地DMA完成控制器與網線的數據交換,遠程DMA完成主處理器與網卡數據交換。單片機主處理器收發(fā)數據只需對遠程DMA操作。接收數據時,RTL8019AS接收到的數據通過MAC比較、CRC校驗后,由FIFO存到接收緩沖區(qū),收滿一幀后,以中斷或寄存器標志的方式通知主處理器,主處理器通過遠程DMA通道將其讀出。當主處理器要向以太網發(fā)送數據時,先將一幀數據通過遠程DMA通道送到RTL8019AS中的發(fā)送緩存區(qū),然后發(fā)出傳送命令;RTL8019AS在完成了上一幀的發(fā)送后,再完成此幀的發(fā)送。
所謂的DMA就是直接內存訪問(DirectMem2oryAccess)。普通的尋址方式是給出一個地址,然后取出對應的值。而在DMA方式下,我們指定一個寄存器地址,主機只要反復地讀取或寫入這個地址,就可以取出或寫入大量的數據。網卡指定的遠程DMA端口就是這個用途。設置好起始地址和讀出的byte數后,我們反復讀遠程DMA端口,就可以將網卡里從網線收到的數據包,從0x400020x7fff的RAM區(qū)讀出;反之,同樣設置好起始地址和寫入的byte數后,我們反復寫遠程DMA端口,就可以將數據發(fā)送到網卡的發(fā)送緩沖RAM中,然后發(fā)出發(fā)送的命令,就可以把數據包發(fā)送到網線中。
2.3 網卡的初始化過程
復位,使RSTDRV先高后低,注意每一步都要有100ms的延時,以確保復位成功。然后進行熱復位,就是先后讀、寫網卡復位端口。
使CR=0x21,停止芯片運行,選擇頁面0。
使RBCR1=0;RBCR0=0,將遠程DMA操作的傳輸字節(jié)數清零。
使PSTART=0x46;PSTOP=0x80;BNRY=0x46,設置接收開始頁面、結束頁面和邊界頁面。
使IMR=0x0,清除中斷屏蔽寄存器。
使RCR=0x08+0x04,設置接收配置寄存器,允許接收多址和廣播報文。
使TCR=0,設置發(fā)送配置寄存器,使用默認配置。
使DCR=0x80+0x40+0x00,設置數據配置寄存器,選擇字節(jié)DMA。
使ISR=-1,設置中斷狀態(tài)寄存器,清除所有已有中斷。
使用DMA方式,從0000H2000BH中取得本網卡MAC地址。注意,MAC地址每個byte都是重復一遍存放的,所以只要取單數1、3、5等byte就可以了。
使CR=0x61,選擇頁面1。
將剛才取得的MAC地址放入PAR0-5中。網卡檢查接收到的包是否和PAR里MAC值匹配,然后決定收下或丟棄。所以,也可以任意設置這個PAR值,來偽造自己的MAC值。
將MAR02MAR7全部設為0xFF,允許接收所有的多址數據包。
使CURR=0x47,設置當前接收頁面為0x47。
使CR=0x22,啟動網卡芯片,開始接收和發(fā)送過程。
2.4 網卡工作接收和發(fā)送過程
網卡RAM是以256byte為一頁,是按頁存儲的結構,16bit的RAM地址高8bit又叫頁碼。網卡的16k的RAM地址從0x400020x7fff,從頁0x40到頁0x7f,一共有64頁。64頁被接收和發(fā)送數據包用。接收和發(fā)送都是以頁為最小的單位進行的。接收緩沖區(qū)需要定義,剩下的就可以作為發(fā)送緩沖區(qū)。
接收緩沖區(qū)由兩個寄存器決定:PSTART(PageStartRegister)和PSTOP(PageStopRegister)。設置了接收緩沖區(qū)之后,這個緩沖區(qū)就形成了一個循環(huán)隊列??刂平邮站彌_區(qū)的有兩個寄存器CURR、BNRY。CURR是網卡寫緩沖區(qū)的指針,指向當前要寫的頁;BNRY是讀指針,指向用戶已經讀走的頁。
BNRY不可以超過CURR,否則沒被用戶讀取的數據就被覆蓋了。用戶設置完了CURR以后,就不用管它,網卡接收到新的數據后,會自動修改它。用戶讀出數據后,要修改BNRY的值,以通知網卡該數據已經讀出了。
網卡RAM區(qū)如圖2所示,我們設置PSTART和PSTOP,就決定了接收區(qū)域在46和7F之間,剩下6頁作為發(fā)送緩沖區(qū),可以滿足一次發(fā)送容量為1514byte的最大以太網數據包的要求。CURR初始值設為47,BNRY初始值設為46。當收到新的數據包時(例如3頁),網卡將它們依次放到47、48和49頁,CURR自動指向4A頁。當我們讀完這3頁的數據包后,要將BNRY改為49,以通知網卡數據包已經讀完了。
?
網卡芯片接收到以太網數據包后,存在CURR指向的頁面中。一個數據包可以占據一頁,也可以占據多頁。在接收包的包頭里,保存有該包的信息。包頭格式如表1:
?
讀完這個包頭,我們就能知道本包的接收狀態(tài),包長度,以及下一個包的位置。在接收循環(huán)中,檢查中斷狀態(tài)寄存器ISR狀態(tài),發(fā)現有新包來,先讀取包頭信息,接著按照包頭指示讀取全包,然后改寫B(tài)NRY,再接著讀下一個包,這樣循環(huán),直到達到CURR位置。注意,一個包有可能占據接收緩沖區(qū)的首、尾頁面,此時須小心讀取。
發(fā)送數據包比較簡單,將準備好的數據用DMA傳到發(fā)送緩沖區(qū),然后設置發(fā)送長度到TBCR1和TBCR0中,再設置傳輸開始頁面,即令TPSR=0x40,最后,使CR=0x26,就開始傳送了。
傳送完成后要清掉中斷狀態(tài)寄存器ISR的發(fā)送完成標志。值得注意的是,發(fā)送包的包長度不能小于以太網規(guī)定的60byte,否則網卡不會將其發(fā)出。
3 TCP/IP協(xié)議在單片機上的軟件設計
3.1 TCPIP協(xié)議棧和鏈路層格式
Internet上使用的是TCP/IP協(xié)議簇,由下至上包含四層:數據鏈路層、網絡層(IP)、傳輸層(TCP)和應用層。我們在單片機上能實現的是數據鏈路層的功能,上層協(xié)議鑒于單片機有限的資源,只能實現部分功能。TCP/IP協(xié)議棧如表2:
?
數據鏈路層處于協(xié)議棧的最低層,傳輸以太網的物理傳輸幀,其幀格式如表3:
?
數據鏈路層是所有TCP/IP包的基礎,所有它上層的包都被封裝到鏈路層幀的數據段中。鏈路層就是MAC對MAC的通信。
3.2 PING命令在單片機上的實現
PING是網絡層(IP層)的命令,網絡層就是IP對IP之間的通信。主機對一個目標IP地址發(fā)出狀態(tài)請求,后者發(fā)出回應,這樣,就可以用來檢查兩者之間的線路是否暢通。這里涉及到兩個網絡層協(xié)議:
ARP和ICMP。首先,網絡中要知道目標IP的MAC地址,才能發(fā)送數據。為了獲取該地址,我們向整個網絡發(fā)送一個ARP廣播包,詢問該IP對應的MAC地址,然后目標IP應答,我們就從應答信息中得到MAC地址。其次,發(fā)送一個ICMP包,請求目標IP狀態(tài),目標IP回應,就完成網絡連接測試。在我們的實驗中,發(fā)出PING命令的是網絡中的PC主機,接收信號并產生響應的是我們的單片機系統(tǒng)。我們假定單片機系統(tǒng)控制的網卡的IP為192.168.0.176。
第一步,實現ARP協(xié)議。ARP協(xié)議是"AddressResolutionProtocol"(地址解析協(xié)議)的縮寫,它的作用是將IP地址轉換成物理地址(就是常說的MAC地址)。協(xié)議ARP的分組格式如表4:
?
當單片機主處理器處理網卡收到的ARP廣播請求時,如果發(fā)現是請求“192.168.0.176”的MAC地址,于是按要求打一個ARP應答包,將自己的MAC地址放到應答包中,發(fā)送回網絡就完成了PING的第一步。注意,要在應答包尾加18byte的補丁,否則應答包長度不滿足最小60byte的要求。
第二步,實現ICMP協(xié)議。ICMP是“InternetControlMessageProtocol”(Internet控制消息協(xié)議)的縮寫。用于在IP主機、路由器之間傳遞控制消息??刂葡⑹侵妇W絡通不通、主機是否可達、路由是否可用等網絡本身的消息。這些控制消息雖然并不傳輸用戶數據,但是對于用戶數據的傳遞起著重要的作用。
ICMP是封裝在IP協(xié)議中,所以有IP包頭。
ICMP協(xié)議結構如表5:
?
網絡主機在收到ARP的應答包后,取出其中的MAC地址,然后向該MAC發(fā)出ICMP請求。主處理器處理該請求時,將請求包的標識和序列號對應填入ICMP應答包,其它部分按要求填寫。校驗和的計算有成熟的公式,容易計算,只要先把校驗和部分置0,將包頭的計算結果再填入校驗和就可以了。
最后將該ICMP應答包送入網絡,這樣就完成了PING的全過程。此時,發(fā)出PING命令的網絡主機就會得到“Replyfrom192.168.0.176:bytes=32time<10msTTL=128”的信息。
4 串行數據與網絡的數據交換的討論
網絡層之上,有兩種傳輸層協(xié)議:TCP(Trans2missionControlProtocol)和UDP(UserDatagramProtocol)。對于數據傳輸要求高的場合,需要使用TCP協(xié)議作為雙方通信方式,但此種方式較為復雜。而對于一些實時信號及其反向控制信號的傳遞,實現UDP協(xié)議就可以滿足要求了。表6是UDP協(xié)議結構:
?
當原始數據從串口送到到主處理器后,主處理器將其打包成UDP報文,發(fā)送到網絡中。網絡端監(jiān)控主機接收并處理該UDP報文,然后將控制信息同樣以UDP報文發(fā)出。主處理器把網絡控制信號返回給串口。這樣,我們在Internet中就可以方便地完成對現場串口數據源的監(jiān)視和控制過程。
5 結語
因為單片機對于各種電器設備有良好的接入和控制能力,所以,我們實現了單片機的網絡接入功能后,就在電器的硬件設備和網絡之間建起了一道橋梁。通過它,可以實現對各種實時信號、儀器儀表、家用設施等目標的遠程監(jiān)視,在宏觀上對各種設備統(tǒng)一管理,實現人與系統(tǒng)的和諧的交互。這必將大大提高工作效率,改善工作環(huán)境,提升人們的生產、生活水平。
評論