張峻豪,張曉龍,王 聰,李俊杰,楊磊青,高 鵬
(昆明理工大學機電工程學院,云南昆明 650500)
串行通訊在傳統(tǒng)的工業(yè)控制系統(tǒng)、監(jiān)控系統(tǒng)、醫(yī)療系統(tǒng)等領域應用十分廣泛,其擁有簡單、穩(wěn)定、性能可靠、維護方便、容易實現(xiàn)的優(yōu)點,具有較好的數(shù)據(jù)傳輸能力和較高的安全性,在工業(yè)控制現(xiàn)場中的感應器、檢測器等設備上都有應用。但串行通訊有許多不足,如傳輸速度很慢、傳輸距離較短,在較大的系統(tǒng)控制中這些局限性使串行通訊總線變得十分復雜,不利于后續(xù)維修護理。
隨著“中國制造2025”以及智能制造戰(zhàn)略的實施,傳統(tǒng)的工業(yè)控制技術正迎來新的發(fā)展機遇,控制系統(tǒng)網(wǎng)絡化已成大趨勢,以太網(wǎng)技術引入控制系統(tǒng)成為大方向。
學者對以太網(wǎng)串口服務器研究較多,如白晶晶[1]設計了基于Luminary LM3S8962 微控制器,并移植了嵌入式Uc/OS 實時系統(tǒng),實現(xiàn)了以太網(wǎng)、484 通訊協(xié)議和CAN 協(xié)議的轉(zhuǎn)換;范煒[2]設計了一款基于AT91RM9200 處理器及LXT971ALE 的串口服務器;楊洋[3]使 用RH Linux9.0 為ARM 處理器提供交叉工具移植Linux,為嵌入式串口服務器設計了服務器端與客戶端模式,此方案對軟件要求較高,系統(tǒng)比較冗雜;肖利平[4]設計的服務器軟件移植了LwIP 協(xié)議棧的兩部分代碼:①編寫操作系統(tǒng)模擬層相關代碼;②LwIP 接口初始設置及網(wǎng)卡驅(qū)動,并且在應用程序設計方面采用中斷查詢方式,但此種方案的硬件成本較高;陳志星等[5]、Qi 等[6]則主要在以太網(wǎng)通訊協(xié)議上進行了研究,比較了uc/IP、LwIP、uIP 等適用于嵌入式設備的協(xié)議棧,并最終選擇LwIP 協(xié)議棧來實現(xiàn)服務器構(gòu)建。
國外對以太網(wǎng)串口服務器研究更為深入,研究方向主要是以太網(wǎng)服務器的網(wǎng)絡芯片選擇、通訊協(xié)議研究以及設計方案優(yōu)化。Douglas[7]詳細介紹了主控芯片S1C33E07、以太網(wǎng)芯片DM9000A、LwIP 1.3.2 的移植以及驅(qū)動程序?qū)崿F(xiàn),該系統(tǒng)能通過網(wǎng)絡進行準確、穩(wěn)定的通信;Adam[8]和Jing[9]重點研究了如何將Internet 與TCP/IP 進行合作,描述了LwIP 的設計與實現(xiàn)。對實施方案和子系統(tǒng)中的算法作了規(guī)定,此外還提供了有關LwIP 的報告和一些使用LwIP 的代碼示例;Fabrício 等[10]通過研究DM9000A 高速以太網(wǎng)接口芯片,提出基于DM9000A 的伺服控制系統(tǒng)以太網(wǎng)接口,介紹了DM9000A 的工作原理和基本功能,給出DSP 的硬件接口方案以及初始化和收發(fā)器的軟件配置;討論和分析了嵌入式系統(tǒng)以太網(wǎng)接口實現(xiàn)的不同解決方案,討論了兩種基于低成本微控制器的方法并進行比較,指出基于FPGA器件的方法可以在性能和開發(fā)成本之間達到最佳平衡。
結(jié)合以上國內(nèi)外研究可發(fā)現(xiàn)以下不足:①在硬件選擇上成本較高;②軟件設計大多在操作系統(tǒng)基礎上編寫程序,程序較冗雜、繁瑣,同時對軟件的要求比較高。因此,本文重點研究一種硬件成本低廉、軟件程序簡明的串口服務器。
嵌入式串口服務器擁有串行接口和網(wǎng)絡接口,分別接入串行通訊設備和以太網(wǎng)客戶端,實現(xiàn)以太網(wǎng)客戶端與串行通訊設備的雙向數(shù)據(jù)傳輸,如圖1 所示。
硬件需滿足系統(tǒng)的技術指標和實用性,軟件能實現(xiàn)系統(tǒng)基本功能?,F(xiàn)有串口服務器設計方案主要有:①ARM 芯片+網(wǎng)絡控制器芯片(軟件開發(fā)容易,硬件要求高);②普通單片機+網(wǎng)絡控制器芯片(成本很低,硬件和軟件開發(fā)繁瑣);③單芯片硬件協(xié)議棧(集成度高,穩(wěn)定性強)。結(jié)合這3 種方案優(yōu)缺點,本文選擇單芯片硬件協(xié)議棧,這是目前芯片高集成化發(fā)展方向。
該串口服務器由主控模塊、串口模塊、網(wǎng)絡端口模塊組成,實現(xiàn)串口與以太網(wǎng)端口之間的數(shù)據(jù)轉(zhuǎn)換功能,通過綜合考慮選擇目前最流行的STM32 系列處理器進行開發(fā)[12]。STM32 擁有高性能、功耗低、成本低、開發(fā)方便等眾多優(yōu)勢[13]。由于本系統(tǒng)是基于以太網(wǎng)的串口服務器,出于系統(tǒng)開發(fā)的簡潔性和成本考慮,最終選擇具有互聯(lián)功能的STM32F107 系列的STM32F107VCT6 作為系統(tǒng)主控芯片[14-16]。
硬件設計由主控模塊電路設計、電源電路設計、RS232串口電路設計、RS485 串口電路設計和以太網(wǎng)模塊電路設計5 部分組成[17-19]。
主控模塊是整個系統(tǒng)最核心部分,包括提供整個系統(tǒng)時鐘信號的外部時鐘電路、使硬件能夠復位的復位電路、能夠燒寫和下載程序的JTAG 接口電路。主控模塊電路設計如圖2 所示。
Fig.2 Main control module circuit圖2 主控模塊電路
(1)系統(tǒng)時鐘電路設計。STM32 采用外部晶振體震蕩方式給系統(tǒng)提供時鐘信號,同時以太網(wǎng)芯片也需外部晶振來提供時鐘信號,所以在系統(tǒng)的外部時鐘設計中采用25MHz 的晶體振蕩器作為整個系統(tǒng)時鐘信號來源。
(2)復位電路設計。系統(tǒng)的復位包括外部復位和上電復位,電路由RC 電路和復位按鍵組成,連接在主控芯片的NRST 復位引腳上。當主控芯片的復位引腳持續(xù)一段時間的低電平,芯片就會發(fā)生復位。
(3)JTAG 接口電路設計。使用標準的20 引腳JTAG 接口,并根據(jù)設計經(jīng)驗在相應的引腳連接上拉電阻。
(4)除此之外,在主控芯片的VVD 引腳接上濾波電容,使其盡量靠近主控芯片的引腳。
系統(tǒng)使用5VDC 電源供電,但系統(tǒng)工作電壓為3.3V,因此需要將5V 的電通過降壓穩(wěn)壓器轉(zhuǎn)化成3.3V 的電。選擇目前十分流行的降壓穩(wěn)壓器AMS1117 系列芯片,因為:①價格便宜;②管腳定義簡單,一共4 個腳,一個GND,一個固定腳,兩個引腳一進一出;③能實現(xiàn)電壓轉(zhuǎn)換和穩(wěn)壓?;谏鲜鰞?yōu)點和系統(tǒng)要求,選用AMS1117-3.3 作為電源模塊的降壓穩(wěn)壓器。
RS-232 標準是運用十分廣泛的數(shù)據(jù)傳輸標準,其所定義的標準與主控芯片STM32F107VCT6 所定義的標準有所不同,所以需要使用串口轉(zhuǎn)換芯片在主控芯片輸出的TTL電平與標準RS-232C 電平之間進行轉(zhuǎn)換。MAX232 供電電壓為5V,功耗較供電電壓為3.3V 的MAX3232 高,基于系統(tǒng)供電考慮,選用MAX3232 作為本系統(tǒng)的電平轉(zhuǎn)換芯片。為保證串口傳輸速度,RS-232 串口接口采用DB9 母頭,只需連接TXD、RXD 和GND 引腳就可避免其他信號干擾。其中MAX3232 芯片的10、9 引腳,分別連接主控芯片的PD5 和PD6 引腳,實現(xiàn)RS232 串口通訊的發(fā)送與接收。
RS-485 是工業(yè)控制中常見的一種通訊接口,與RS-232 相比,RS-485 增加了通訊距離和通訊速度。在RS-485通訊網(wǎng)絡中一般采用主從通訊方式,即一個主機帶多個從機?,F(xiàn)在市場上較多的此類收發(fā)器有:Sipex 公司的SP49和Maxim 公司的MAX3485。考慮到RS-32 串口模塊也是MAX 系列,且MAX3485 與MAX3232 工作電壓同樣為3.3V,因此本次設計采用MAX3485 作為RS-485 通訊接口的收發(fā)器。其中MAX3485 芯片的1、4 引腳連接主控芯片的PC11 和PC10 引腳,實現(xiàn)RS485 串口通訊的接收與發(fā)送;MAX3485 芯片的2、3 引腳連接主控芯片的PC12 引腳,實現(xiàn)RS485 串口通訊的發(fā)送與接受的使能控制。
以太網(wǎng)模塊就是以太網(wǎng)控制器的外部電路,主要由以太網(wǎng)MAC 控制器和物理層PHY 收發(fā)器組成[20]。STM 32F107VCT6 是一款具有互聯(lián)功能的芯片,它自帶10M/100M 的自適應以太網(wǎng)控制器,支持IEEE-802.3-2002 規(guī)定的以太網(wǎng)行業(yè)標準以及IEEE 1588-2002 的網(wǎng)路精確時鐘同步標準,其內(nèi)部集成了一個MAC 控制器,本設計只需要選擇擴展物理收發(fā)器PHY 即可。
2.5.1 以太網(wǎng)控制器
考慮到功能和成本等綜合因素,本設計采用的PHY 芯片為DP83848。DP83848 是一款10M/100M 的PHY 芯片,符合主控芯片STM32F107 所支持的IEEE802.3u 中10BASETy 與100BASE-TX 物理層協(xié)議。STM32 支持兩種工業(yè)級標準接口,與外部物理層PHY 模塊相連,分別是獨立于介質(zhì)的接口(MII)和簡化的獨立接口(RMII),本系統(tǒng)使用RMII。查閱DP83848 以太網(wǎng)控制芯片手冊,可知DP83848的工作模式(RMII/MII)選擇由39 號RX_DV 和7 號SNI_MODE 兩個管腳的電平共同決定,所以39 引腳需要上拉電阻。除此之外,系統(tǒng)使用MCO 提供DP83848 的時鐘信號,需要將STM32 的PA8 引腳與DP83848 的34 引腳(時鐘源X1)連接。以太網(wǎng)控制器DP83848 與主控芯片連接電路如圖3 所示。
Fig.3 Connection circuit between DP83848 and main control chip圖3 DP83848 與主控芯片的連接電路
2.5.2 以太網(wǎng)接口
由于PHY 和網(wǎng)絡接口RJ45 直接連接會產(chǎn)生很多無用的雜波,所以在PHY 與RJ45 之間要接入一個網(wǎng)絡隔離變壓器,即在以太網(wǎng)物理接口中需擁有隔離變壓器和RS45 接口;當PHY 芯片的供電電壓不一致時也不會對設備造成任何影響[21]。
本文采用隔離變壓芯片與RJ45 接口集成的以太網(wǎng)接口方式,使用漢仁電子公司的HR911105A,此芯片集成了隔離變壓器和RJ-45 接口,簡化了硬件電路設計。以太網(wǎng)控制器DP83848 與HR911105A 的連接電路如圖4 所示。其中,DP83848 的RD-、RD+、TD-、TD+需要上拉49.9 歐1%的電阻,并且還需要3 個100nF 的電容接地;DP83848 的20、21 引腳RESERVED 必須接2.2K 上拉電阻。
Fig.4 Connection circuit between DP83848 and HR911105A圖4 DP83848 與HR911105A 的連接電路
嵌入式設備要連入互聯(lián)網(wǎng)必須遵守TCP/IP 網(wǎng)絡協(xié)議[22],目前有兩種方式實現(xiàn)這種功能:①使用專門的網(wǎng)絡芯片編程,如WIZnet 公司的W5200 等,主控器通過編程得到芯片上的TCP/IP 數(shù)據(jù),但這些芯片價格較昂貴,支持的TCP 連接數(shù)也十分有限,不適合大量開發(fā);②在主控芯片上移植網(wǎng)絡TCP/IP 協(xié)議棧,使用免費的開源協(xié)議棧,這種方式非常普遍。出于成本和實用性考慮本文選擇LwIP 協(xié)議棧。
LwIP 協(xié)議棧移植就是把LwIP 協(xié)議棧源碼添加到kill軟件工程中,移植過程如表1 所示。
Table 1 LwIP protocol stack migration process表1 LwIP 協(xié)議棧移植過程
軟件設計流程如圖5 所示。
串口服務器采用頻率為25MHz 的外部高速晶振時鐘給系統(tǒng)提供時鐘信號。系統(tǒng)時鐘配置如表2 所示。
Table 2 Clock configuration表2 時鐘配置
Fig.5 Software design flow圖5 軟件設計流程
系統(tǒng)時鐘設置完畢后,根據(jù)相應的外部設備連接,對AHB 和APB 進行相應的設置修改即可完成系統(tǒng)時鐘配置。
通過一個初始化設置函數(shù)void USART_Configuration(void)實現(xiàn)串口程序初始化設置。
根據(jù)硬件設計原理可知PD5-USART2-TX、PD6-USART2-RX 即主控芯片STM32F107 的A5 引腳為數(shù)據(jù)輸出腳,A6 引腳為數(shù)據(jù)輸入腳,將串口引腳功能初始化,程序如下[23]:
設置A5 腳為復用推挽輸出,端口速度50MHz,設置A6腳為浮空輸入,端口速度50MHz,開啟使能GPIOD 時鐘:
上述為RS232 的串口初始化配置。與RS232 類似,RS485 的串口初始化只需將相應的接收和發(fā)送引腳作相應更改,除此之外還需配置RS485 的發(fā)送和接收使能。由硬件原理可知,PC10-USART3-TX、PD11-USART3-RX 即主控芯片STM32F107 的C10 引腳為數(shù)據(jù)輸出腳,C11 引腳為數(shù)據(jù)輸入腳,C12 引腳為MAX3485 芯片的發(fā)送和接收使能引腳,配置如下:
串口的收發(fā)數(shù)據(jù)主要由設置串口的相關寄存器實現(xiàn),發(fā)送數(shù)據(jù)由USART_DR 寄存器實現(xiàn),在寄存器里寫下要發(fā)送的數(shù)據(jù)便可實現(xiàn)目的。接收數(shù)據(jù)與發(fā)送數(shù)據(jù)相似,也是通過相應的寄存器實現(xiàn)的[24]。串口發(fā)送數(shù)據(jù)主要有查詢和中斷兩種方式。由于查詢方式會不斷調(diào)用cup 資源,需要消耗大量的CUP 時間,而且由于主程序周期的影響,所以查詢效率很低。而中斷方式是當中斷條件滿足時立即中止當前正在運行的程序,進入中斷服務程序,執(zhí)行完畢后返回斷點繼續(xù)執(zhí)行,其耗費的CPU 時間相對較少,所以在串口服務器中使用中斷方式[25-26]。
STM32F107VCT6 芯片自帶一個MAC 控制器,初始化方法如表3 所示[27]。
4.5.1 UDP 服務器端口初始化
調(diào)用LwIP 協(xié)議棧中的new_udp()函數(shù),新建立一個UDP 的PCB 控制塊;然后使用LwIP 協(xié)議棧中的udp_bind()函數(shù)為已經(jīng)建立好的PCB 控制塊綁定本地的IP 地址和RS232 對應的端口號,綁定成功以后PCB 控制塊便可成功激活;最后調(diào)用LwIP 協(xié)議棧中的udp_recv()函數(shù)來設置UDP,接收客戶端發(fā)送的以太網(wǎng)數(shù)據(jù)回調(diào)函數(shù)。udp_recv()函數(shù)在LwIP 中的源代碼定義如下:
其中,pcb 為udp 協(xié)議控制塊,void(* recv)(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port)為需要編寫的回調(diào)函數(shù),rev_arg 為回調(diào)函數(shù)參數(shù)。
Table 3 Ethernet initialization表3 以太網(wǎng)初始化
4.5.2 UDP 協(xié)議中以太網(wǎng)轉(zhuǎn)串口回調(diào)函數(shù)設計
首先聲明一個udp_pcb 結(jié)構(gòu)體變量,將遠端的IP 地址和端口號存入udp_pcb 控制塊中,然后使用udp_pcb 中的pbuf 指針直接將網(wǎng)口接收到的數(shù)據(jù)提取出來,通過USART2→DR 寄存器操作,將接收緩存送至該數(shù)據(jù)寄存器,同時發(fā)送到串口,從而將以太網(wǎng)接收的數(shù)據(jù)發(fā)向RS232串口。當數(shù)據(jù)發(fā)送完畢時,利用LwIP 協(xié)議棧中的pbuf_free()函數(shù)將udp_pcb 控制塊進行釋放
4.5.3 UDP 協(xié)議中串口轉(zhuǎn)以太網(wǎng)傳輸
在串口將接收到的數(shù)據(jù)存入RS232_rec_buf()后,申明一個udp_buf 結(jié)構(gòu)體,如果接收數(shù)據(jù)的時間等待超時,則將等待超時表示置0,將RS232_rec_buf()中字節(jié)的長度提取出來,存入要發(fā)送數(shù)據(jù)的長度值中,并將接收計數(shù)器清零。若接收的數(shù)據(jù)超過了緩沖區(qū)長度,則將緩沖區(qū)的大小存入要發(fā)送數(shù)據(jù)的長度值中;然后初始化RS232 中的臨時udp數(shù)據(jù)塊,即申請pbuf 數(shù)據(jù)塊,并將RS232_rec_buf()中的數(shù)據(jù)存入申請好的pbuf 數(shù)據(jù)塊中;最后調(diào)用LwIP 協(xié)議棧中的udp_send()函數(shù)將pbuf 中的數(shù)據(jù)發(fā)送給指定的客戶端。完成整個過程后,還要利用LwIP 協(xié)議棧中的pbuf_free()函數(shù)將申請的臨時udp 數(shù)據(jù)塊進行釋放。
對調(diào)試環(huán)境的IP 地址與端口進行配置,具體IP 地址與端口分配如表4 所示。
Table 4 IP address and port allocation of UDP/TCP表4 UDP/TCP 的IP 地址與端口分配
嵌入式以太網(wǎng)串口服務器如圖6 所示。
Fig.6 Embedded Ethernet serial port server圖6 嵌入式以太網(wǎng)串口服務器實物
5.2.1 硬件連接
①用交叉網(wǎng)線將服務器和電腦相連(或用直通網(wǎng)線將服務器和路由器相連并將電腦連接到該設備上);②用USB 轉(zhuǎn)RS485 線將服務器的RS485 和電腦的另一USB 口連接;③連接無誤后給服務器上電,下載軟件程序,復位服務器,此時可看到網(wǎng)口綠燈常亮,黃燈閃爍,表明軟硬件無異常。
5.2.2 軟件配置
電腦IP 地址配置為:192.168.1.21(與服務器在一個網(wǎng)段內(nèi)即可),子網(wǎng)掩碼配置為:255,255,255,0,運行軟件USR-TCP232-Test(串口與網(wǎng)口調(diào)試程序),在TCP 模式下,需要在網(wǎng)口助手中將協(xié)議類型更改為TCP Client 模式。
UDP 與RS232/RS485 雙向數(shù)據(jù)傳輸(RS232 對應UDP端口為1033,RS485 對應的UDP 端口為1031)實驗結(jié)果如圖7 所示。
TCP 與RS232/RS485 雙向數(shù)據(jù)傳輸(RS232 對應TCP 端口為1033,RS485 對應TCP 端口為1031)實驗結(jié)果如圖8 所示。
在上述4 種調(diào)試環(huán)境中,通過串口助手向網(wǎng)口助手發(fā)送串口數(shù)據(jù)及通過網(wǎng)口助手向串口助手發(fā)送數(shù)據(jù)均能實現(xiàn)預期結(jié)果,說明系統(tǒng)設計達到了預期要求。
Fig.7 Bidirectional data transmission between UDP and RS232/RS485圖7 UDP 與RS232/RS485 雙向數(shù)據(jù)傳輸
Fig.8 Bidirectional data transmission between TCP and RS232/RS485圖8 TCP 與RS232/RS485 雙向數(shù)據(jù)傳輸
本文采用STM32 系列芯片、RS232/RS485 電平轉(zhuǎn)換芯片和以太網(wǎng)控制芯片,并采用輕量化IP/TCP 協(xié)議LwIP 協(xié)議棧為基礎,設計了嵌入式以太網(wǎng)串口服務器。首先對串口服務器進行分析,提出設計思路與設計方案,完成串口服務器主控模塊、串口模塊、以太網(wǎng)模塊等硬件設計;其次對LwIP 協(xié)議棧進行分析,完成LwIP 協(xié)議棧的移植以及RS232/RS485 與以太網(wǎng)的雙向通訊程序設計,實現(xiàn)將串口數(shù)據(jù)通過轉(zhuǎn)換后發(fā)向以太網(wǎng),以太網(wǎng)數(shù)據(jù)通過轉(zhuǎn)換后發(fā)向串口;最后進行串口服務器測試,驗證了設計的可行性。