在網絡技術應用日益廣泛的今天,網絡傳輸是最經濟有效的數據傳輸方式。如何利用廉價的 51 單片機來控制網卡芯片進行數據傳輸,加載 TCP/IP 協議連接到互聯網,實現網絡通信成了眾多設計者的目標。但由于指令及資源的限制,實施過程會有許多困難。我們在設計方案中舍棄了耗費資源的高級協議,采用發送小數據包的方式以避免分段,來簡化 TCP 協議和 UDP 協議,實現互聯接入。
 
硬件設計與實現
系統的硬件結構框圖如圖 1 所示。本系統的微控制器是 Winbond 公司的 78E58,網絡接口芯片是與 NE2000 系列兼容的 ReaLTEk 公司的 RTL8019AS。RTL8019AS 內置了 10BASE-T 收發器,外接一個隔離 LPF 濾波器,經 RJ-45 接口輸出。外部 RAM 是 62256,24C02 是 I2C 總線的 EEPROM。
 
圖 1 嵌入式協議轉換硬件框圖
 
系統的軟件設計與實現
為適應上網的需求,系統軟件設計主要包括兩部分內容:一是要執行對 RTL8019AS 等的控制功能,二是要執行與連接 Internet 相關的功能,實現 TCP/IP 協議。本文著重介紹第二部分,主程序采用 C51 語言編寫。
 
RTL8019AS 初始化
要將嵌入式系統接入以太網,首先要設置 RTL8019AS 的工作方式和工作狀態,分配收發數據的緩沖區,通過對地址及數據口的讀寫來完成以太網幀的接收與發送。然后設置 RTL8019AS 的工作參數,亦即設置內部控制寄存器。對 RTL8019AS 的工作參數進行設置完畢后,進入正常工作狀態,接下來就讀寫 RTL8019AS 的 RAM 以完成數據包的接收和發送。由于篇幅有限,這里就不再詳述。
 
TCP/IP 模型
TCP/IP 協議是一套把 Internet 上的各種系統互連起來的協議族,保證 Internet 上數據的準確快速傳輸。TCP/IP 通常采用一種簡化的四層模型:應用層、傳輸層、網絡層、鏈路層。
 
本系統中,應用層傳遞來自以太網和數據終端的數據,并對數據報作打包拆包處理。傳輸層采用傳輸控制協議 TCP 或用戶數據協議 UDP。網絡層實現 IP 協議,還要實現能報告數據傳輸差錯等情況的 ICMP 協議。鏈路層部分由 RTL8019AS 完成,鏈路層由控制同一物理網絡上的不同機器間數據傳送的底層協議組成。
 
在單片機里只實現與需要有關的部分,而不使用的協議則一概不支持。單片機應用的 TCP/IP 協議大多是為了完成數據采集和數據傳輸,而不需要網頁瀏覽、文件傳輸這些功能。
 
ARP 協議(地址解析協議)
以太網是 TCP/IP 協議主要采用的局域網技術,是系統接入 Internet 的基礎。ARP 本質是完成網絡地址到以太網物理地址的動態映射。UNIX 系統的 ARP 協議支持以太網、令牌環等網絡,但我們的單片機系統里只支持以太網。
 
IP 協議(網際協議)
IP 是 TCP/IP 協議族中最為核心的協議。所有的 TCP、UDP、ICMP 及 IGMP 數據都以 IP 數據報格式傳輸。就對某些協議而言,IP 包最大可以為 65K,可以分段傳輸,而在單片機里根本無法容納如此大的數據包,因此一般是不支持分段的。我們的設計中采用發送小數據包的方式,以避免分段。
 
TCP 協議(傳輸控制協議)
TCP 數據封裝在一個 IP 數據報中,并具有自己的 TCP 首部, TCP 協議定義十分復雜,鑒于 51 單片機的片內資源十分有限,本系統對 TCP 協議進行了一定的簡化處理。標準的 TCP 協議使用慢啟動的滑動窗口機制,如果只使用單個窗口,就變成了一種簡單確認的處理方法。即只需對單個數據報發送和確認,節約了系統資源,也使維護更加方便。
 
編程實現 TCP 協議的另一個難點在于 TCP 建立連接和終止連接的具體過程的實現。TCP 協議是一個面向連接的協議,連接的雙方無論是哪一方向另一方發送數據,都必須先通過“三次握手”過程在雙方之間建立一條連接,和通過“四次握手”終止連接。
 
連接建立后,TCP 就可以發送數據塊,稱為數據段。當 TCP 發出一個段后,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。另外,TCP 將保持它首部和數據的檢驗和。
 
系統主應用程序的實現
系統初始化后,進入主程序循環的兩部分:一是對接收到的以太網數據幀進行解包,供應用程序使用,一是對發送的數據進行封裝并發送,使采用 TCP/IP 協議的以太網內的所有計算機都能收到此數據幀。圖 2 是系統的主應用程序的流程圖。
 
圖 3 系統的主應用程序的流程圖
 
單片機實現 TCP/IP 協議的難點
51 單片機的程序空間、可用的內存 RAM、運算速度、指令集等原因,在 UNIX 或 Windows 上實現的 TCP/IP 協議的源代碼并不能夠直接移植到 8 位的單片機上。在 51 單片機上編寫代碼會受許多限制,特別是實現 TCP/IP 協議這樣關系復雜的程序,我們必須根據實際情況盡可能挖掘 51 單片機的性能。綜合來說,單片機實現與 UNIX 實現 TCP/IP 有如下區別:
 
(1)操作系統:Windows 或 UNIX 都是多任務操作系統,這使得代碼編寫簡單化,在單片機只能是單任務系統,代碼結構為順序執行+硬件中斷的方式,無法并發執行。
 
(2)內存分配:Windows 或 UNIX 的內存分配是動態的。而一般單片機只有外接的一塊 32K 字節的 RAM,并同時被各個協議使用。一個最大的以太網數據包有 1.5K 字節,分配一包的緩沖區就要 1.5K 字節。為此,我們分配一個 256×6=1536 個字節的固定的 RAM 來存放收到的以太網數據包。收到一包就處理一包。
 
(3)指針:在 PC 里所有程序都必須先放在 RAM 里才能運行,所以它的指針都指向 RAM。而單片機的結構和 PC 的結構有很大差別,指針類型很多,各指針運算的速度也不一樣,特別是“一般指針”運算很慢,還會占用很多程序空間。UNIX 實現 TCP/IP 的源代碼中,用得最多的就是指針,而在單片機里一般要求少用指針,或使用特定類型的指針。對使用 UNIX 的源代碼需要作很多的改動。
 
(4)參數傳遞:在 UNIX 實現的 TCP/IP 源代碼中,一般有很多的參數傳遞,而在單片機里允許傳遞的參數是有限的(因為受到內部 RAM 的限制),同時參數傳遞的過程要浪費程序代碼空間,也降低單片機執行速度。所以在單片機的實現里,一般不要做太多的參數傳遞,而多使用公共的全局變量來實現調用的過程。
 
(5)硬件接口:在 UNIX 或 Windows 里,對網卡驅動無一例外都是采用中斷方式,因為 PC 的處理速度快,一次中斷的處理時間也很短,不會影響系統內的其它中斷。而在單片機的應用中,大部分的方案都是查詢式的。PC 的 NE2000 的網卡,一般都是用 16 位 DMA 的方式,而在單片機里卻只能用 8 位 DMA 方式。這也使 UNIX 對網卡驅動的代碼不能直接移植。
 
結語
本文設計的嵌入式網絡接入方案,采用廉價的 8 位 51 單片機實現了簡化 TCP 協議和 UDP 協議,并支持主動和被動連接、跨越網關,實現互聯網接入,在被控設備與上位控制機之間提供了一條透明的傳輸通道,用戶不需對原有串口設備或其他數字設備做任何修改,就可享受到網絡的好處。目前,本文的系統已被成功使用在網絡化的數據采集器中。