嵌入式TCP/IP協(xié)議棧在單片機上的實(shí)現
隨著(zhù)嵌入式設備與網(wǎng)絡(luò )的日益結合,在單片機系統中引入TCP/IP協(xié)議棧,以支持單片機接入網(wǎng)絡(luò ),成為嵌入式領(lǐng)域的一個(gè)重要方向。在此對基于SST89E516RD單片機的TCP/IP協(xié)議棧的實(shí)現方法給予討論。選用SST89E516RD單片機實(shí)現了在線(xiàn)仿真和編程的功能,大大節約了開(kāi)發(fā)成本。采用VB 6.0語(yǔ)言與Window 98/2000/XP等為軟件開(kāi)發(fā)平臺,對系統進(jìn)行了測試。經(jīng)過(guò)幾個(gè)月的軟硬件測試表明:系統設計合理、穩定可靠,已基本實(shí)現了最初的設計目標。對其他類(lèi)似系統移植該項技術(shù)奠定了基礎,有很好的參考價(jià)值。
1 系統硬件實(shí)現
整個(gè)系統以SST89E516RD單片機為核心,通過(guò)RTL8019AS以太網(wǎng)控制芯片實(shí)現遠程通信。串口完成網(wǎng)卡參數的修改、在線(xiàn)仿真,在系統中還使用X5045作為外部擴展的E2PROM,用來(lái)存儲IP地址、物理地址以及網(wǎng)卡的其他配置信息,同時(shí)X5045還具有電壓監控、看門(mén)狗定時(shí)器、上電復位三種功能,使用X5045監控系統的運行過(guò)程,當系統不穩定時(shí)可以進(jìn)行有效地復位。圖1為系統硬件結構圖。
2 系統軟件實(shí)現
系統軟件主要包括客戶(hù)端和服務(wù)器端軟件的設計,主要有以下幾部分內容:
(1)RTL8019AS的初始化和驅動(dòng)程序的設計;
(2)數據幀的發(fā)送和接收子程序;
(3)TCP/IP協(xié)議棧程序的設計;
(4)客戶(hù)端和服務(wù)器端程序的設計;
(5)X5045看門(mén)狗和E2PROM程序的設計。
系統的主程序流程圖如圖2所示。
由圖2可知,系統首先完成對單片機定時(shí)器、串口、網(wǎng)卡芯片和以太網(wǎng)等部分的初始化,然后進(jìn)入以太網(wǎng)處理部分的主程序,通過(guò)定時(shí)器中斷進(jìn)行網(wǎng)口數據的超時(shí)出錯處理,并完成TCP定時(shí)器?;詈虯RP表生存時(shí)間的更新。
2.1 系統初始化
所謂初始化和驅動(dòng)程序是指實(shí)模式下一組硬件芯片的驅動(dòng)子程序,它們屏蔽了底層硬件處理細節,同時(shí)向上層軟件提供與硬件無(wú)關(guān)的接口。主要包括定時(shí)器初始化,初始化PING表、ARP表,初始化TCP,RTL8019AS的初始化等。RTL8019AS的初始化主要包括網(wǎng)卡的復位和網(wǎng)卡寄存器的初始化。RTL8019AS的初始化主要包括網(wǎng)卡的復位和網(wǎng)卡寄存器的初始化。RTL8019AS內部寄存器有4頁(yè),與NE2000兼容的有3頁(yè),第4頁(yè)不用。頁(yè)選擇由CR寄存器的PSl,PS0位確定。在零頁(yè)寄存器中可以設置接收、發(fā)送狀態(tài)配置以及發(fā)送緩存區的起始頁(yè)與接收緩存區起止頁(yè)地址等;在1頁(yè)寄存器中可以設置以太網(wǎng)接口的MAC地址和組播地址。對網(wǎng)卡的初始化就是對相關(guān)寄存器初始化,這些寄存器包括CR,RCR,TC-R,PSTART,PSTOP,BNRY,TPSR,ISR,DCR,IMR,CURR,PAGO~PAG5,MAR0~MAR5等。初始化過(guò)程如下:
(1)CR=0x21,選擇頁(yè)零的寄存器同時(shí)使芯片處于停止模式,不會(huì )發(fā)送和接收數據包;
(2)RCR=OxE0,設置接收結構寄存器,monitor方式,所有數據包都被拒絕;
(3)TCR=OxE2,設置發(fā)送配置寄存器,工作在內部lookback模式;
(4)PSTART=0x4C,接收緩沖區開(kāi)始頁(yè)面地址;
(5)PSTOP=0x80,接收緩沖區中止頁(yè)面地址;
(6)BNRY=0x4C,接收緩沖區最后頁(yè)面指針;
(7)TPSR=0x40,發(fā)送頁(yè)的起始頁(yè)地址,初始化為指向第一個(gè)發(fā)送緩沖區的頁(yè)即0x40;
(8)ISR=0xFF,清除所有中斷標志;
(9)DCR=OxC8,設置數據配置寄存器,使用FIFO緩存,普通模式,8位數據DMA;
(10)IMR=Ox00,設置中斷屏蔽寄存器;屏蔽所有中斷;
(11)CR=Ox61,選擇頁(yè)一的寄存器;
(12)CURR=Ox4D,網(wǎng)卡寫(xiě)內存的指針,指向當前正在寫(xiě)的頁(yè)的下一頁(yè),初始化時(shí)指和0x4C+1=0x4D;
(13)設置多址寄存器MAR0~MAR5,均設置為Ox00;
(14)CR=0x22,使網(wǎng)卡芯片開(kāi)始工作;
(15)設置網(wǎng)卡地址寄存器PAR0~PAR5;
(16)CR=Ox21,選擇頁(yè)零的寄存器;
(17)RCR=OxCC,設置接收結構寄存器,設置為使用接收緩沖區,跟外部網(wǎng)絡(luò )連接;
(18)TCR=0xE0,設置發(fā)送配置寄存器,啟用CRC自動(dòng)生成和自動(dòng)校驗,工作在正常模式;
(19)CR=0x22,使網(wǎng)卡芯片開(kāi)始工作;
(20)ISR=0xFF,清除所有中斷標志;
2.2 TCP/IP協(xié)議棧的移植
以太網(wǎng)幀的發(fā)送與接收屬于協(xié)議層中的最底層。發(fā)送前的協(xié)議封裝和接收時(shí)的協(xié)議分解都非常簡(jiǎn)單。封裝時(shí),只需在上層封裝數據前面添加14B的以太網(wǎng)首部就可以了;接收到數據幀之后,根據頭信息中的幀類(lèi)型字段判斷是否屬于IP包或ARP包,若是就繼續相應的協(xié)議分解,否則將被丟棄,不予處理。幀的接收工作由網(wǎng)卡自動(dòng)完成,只需對相關(guān)的寄存器如PSTART,P8TOP,CURR和BNRY進(jìn)行適當的初始化即可。以太網(wǎng)幀的發(fā)送過(guò)程如下:
(1)初始化命令寄存器CR,啟動(dòng)RTL8019AS;
(2)設置數據配置寄存器DCR,以字節方式通信;
(3)設置發(fā)送配置寄存器TCR,選擇RTL8019AS數據發(fā)送的工作方式;
(4)設置遠程開(kāi)始地址寄存器RSAR0(低位),RSARl(高位),指明遠程DMA操作時(shí)所傳送數據的起始地址;
(5)設置遠程字節計數寄存器RBCR0(低位),RBCRl(高位),指明遠程DMA操作時(shí)所傳送的數據的字節數;
(6)設置命令寄存器CR,開(kāi)始遠程DMA寫(xiě)操作。RTL8019AS自動(dòng)將數據I/O端口的數據寫(xiě)入其緩沖區中;
(7)開(kāi)始向數據I/O端口傳送需要發(fā)送的數據;
(8)數據傳送完畢后,設置發(fā)送頁(yè)起始地址寄存器TBCR,指明待發(fā)送數據的起始地址;
(9)設置發(fā)送字節計數寄存器TBCR0(低位),TBCRl(高位),指明待發(fā)送數據的字節數;
(10)設置命令寄存器CR,啟動(dòng)本地DMA操作。把緩沖區中的數據發(fā)送到網(wǎng)絡(luò )上;
(11)結束。
需要指出的是,數據在發(fā)送前必須先由上到下進(jìn)行層層封裝才能正確地發(fā)送出去,同時(shí),接收到的數據包還必須自下而上層層解包才能為用戶(hù)所識別,即協(xié)議分解。在協(xié)議編程實(shí)現中,數據封裝與協(xié)議分解互為逆過(guò)程。這就是說(shuō),必須在數據采集子系統中實(shí)現嵌入式TCP/IP協(xié)議才能完成數據的TCP/IP處理。
2.3 客戶(hù)端和服務(wù)器端程序的設計
分別設計客戶(hù)端和服務(wù)器端程序。適應于不同的工作場(chǎng)合。在面向連接的TCP協(xié)議中,服務(wù)器和客戶(hù)機開(kāi)始通信之前必須首先建立連接。在連接之前,服務(wù)器程序必須正在運行并處于監聽(tīng)模式,等待客戶(hù)端的連接。TCP的連接是通過(guò)3次握手協(xié)議來(lái)完成的。首先,客戶(hù)端發(fā)送1個(gè)SYN標志位的TCP段給服務(wù)器,其帶有所選擇段的初始序號。服務(wù)器端收到該報文段后,以1個(gè)帶有SYN標志的段作為應答,其中也給出根據本身情況選擇的初始序號,并包含對客戶(hù)端的確認。
而客戶(hù)端收到服務(wù)器端的應答后,再次送回1個(gè)報文段,其中帶有對服務(wù)器端SYN的確認。這樣雙方的連接就建立了,以后就能開(kāi)始傳送數據。同樣終止1條TCP連接實(shí)際上也需3次握手過(guò)程。
3 應用系統實(shí)現
為了驗證系統的可行性,應用VB開(kāi)發(fā)了接口程序,構建了軟硬件測試平臺,用來(lái)設置網(wǎng)卡的配置參數并實(shí)現數據的發(fā)送與接收。所有配置參數包括(本地IP地址、服務(wù)器端IP地址、端口號、網(wǎng)卡物理地址、ping的IP地址、串口號等)都能通過(guò)串口動(dòng)態(tài)地更改。系統能實(shí)現Ping的功能,以方便檢查以太網(wǎng)的狀態(tài)。
3.1 參數設置界面
用串口線(xiàn)將測試板(數據采集和控制系統模塊,下同)與計算機連接起來(lái),選擇好串口號,然后按“連接單片機”按鈕,連接狀態(tài)工具欄里出現“已經(jīng)連接”,說(shuō)明測試板與計算機已經(jīng)連接上,然后就可以修改配置參數了。在參數設置欄中填寫(xiě)正確的參數值后,按“設定”按鈕,接收狀態(tài)欄中會(huì )提示參數設置成功,然后按測試板上的復位鍵,網(wǎng)卡的參數配置就被寫(xiě)到了X5045中。參數設置界面如圖3所示。
3.2 數據收發(fā)測試界面
分別測試客戶(hù)端和服務(wù)器端軟件通信是否正常。
(1)服務(wù)器端程序的測試
打開(kāi)客戶(hù)端測試界面,如圖4所示,設置連接IP地址為192.168.O.44(該地址必須與服務(wù)器端的IP地址一致),設置連接端口號為3330(該端口號必須與服務(wù)器端端口號一致)。將作為服務(wù)器端的程序燒入到測試板的
(2)客戶(hù)端程序的測試
打開(kāi)服務(wù)器端測試界面,如圖5所示。
設置連接IP地址為192.168.0.44(該地址指的是上位機自身的IP,必須與客戶(hù)端設置的“服務(wù)器端IP地址”一致),設置連接端口號為3330(該端口號須與客戶(hù)端設置的“服務(wù)器端口號”一致)。將作為客戶(hù)端的程序燒人到系統的微處理器中,參數配置:“服務(wù)器IP地址”(指的是上位機的IP地址)為192.168.0.44,“單片機IP地址”可以不用設置(因為系統僅作為客戶(hù)端),“服務(wù)器端口號”設為3330(必須與客戶(hù)端一致),網(wǎng)關(guān)設為192.168.0.1(要與上位機保持在同一個(gè)網(wǎng)段內)。設置好所有參數之后,即可進(jìn)行數據收發(fā)。服務(wù)器端的數據可以被發(fā)送到串口,同樣,數據也可以從串口發(fā)送到服務(wù)器端。測試表明:上位機通過(guò)以太網(wǎng)與系統之間的通信正常。
4 結語(yǔ)
在此實(shí)現了TCP/IP協(xié)議棧在單片機上的移植,完成了系統的硬件電路和相關(guān)嵌入式軟件的設計,應用VB開(kāi)發(fā)了上位機修改參數界面,通過(guò)串口完成對網(wǎng)卡等參數的配置和修改,解決了數據包的超時(shí)重發(fā)、定時(shí)?;?、參數配置、硬件看門(mén)狗復位等一系列問(wèn)題。實(shí)驗表明,整套程序比較穩定,收發(fā)數據正常,TCP超時(shí)重傳效果很好。經(jīng)過(guò)近1個(gè)月的測試,沒(méi)有出現任何丟包和堵塞的現象。
tcp/ip相關(guān)文章:tcp/ip是什么
評論