嵌入式以太网串口服务器设计与实现
2021-09-28张峻豪张晓龙李俊杰杨磊青
张峻豪,张晓龙,王 聪,李俊杰,杨磊青,高 鹏
(昆明理工大学机电工程学院,云南昆明 650500)
0 引言
串行通讯在传统的工业控制系统、监控系统、医疗系统等领域应用十分广泛,其拥有简单、稳定、性能可靠、维护方便、容易实现的优点,具有较好的数据传输能力和较高的安全性,在工业控制现场中的感应器、检测器等设备上都有应用。但串行通讯有许多不足,如传输速度很慢、传输距离较短,在较大的系统控制中这些局限性使串行通讯总线变得十分复杂,不利于后续维修护理。
随着“中国制造2025”以及智能制造战略的实施,传统的工业控制技术正迎来新的发展机遇,控制系统网络化已成大趋势,以太网技术引入控制系统成为大方向。
学者对以太网串口服务器研究较多,如白晶晶[1]设计了基于Luminary LM3S8962 微控制器,并移植了嵌入式Uc/OS 实时系统,实现了以太网、484 通讯协议和CAN 协议的转换;范炜[2]设计了一款基于AT91RM9200 处理器及LXT971ALE 的串口服务器;杨洋[3]使 用RH Linux9.0 为ARM 处理器提供交叉工具移植Linux,为嵌入式串口服务器设计了服务器端与客户端模式,此方案对软件要求较高,系统比较冗杂;肖利平[4]设计的服务器软件移植了LwIP 协议栈的两部分代码:①编写操作系统模拟层相关代码;②LwIP 接口初始设置及网卡驱动,并且在应用程序设计方面采用中断查询方式,但此种方案的硬件成本较高;陈志星等[5]、Qi 等[6]则主要在以太网通讯协议上进行了研究,比较了uc/IP、LwIP、uIP 等适用于嵌入式设备的协议栈,并最终选择LwIP 协议栈来实现服务器构建。
国外对以太网串口服务器研究更为深入,研究方向主要是以太网服务器的网络芯片选择、通讯协议研究以及设计方案优化。Douglas[7]详细介绍了主控芯片S1C33E07、以太网芯片DM9000A、LwIP 1.3.2 的移植以及驱动程序实现,该系统能通过网络进行准确、稳定的通信;Adam[8]和Jing[9]重点研究了如何将Internet 与TCP/IP 进行合作,描述了LwIP 的设计与实现。对实施方案和子系统中的算法作了规定,此外还提供了有关LwIP 的报告和一些使用LwIP 的代码示例;Fabrício 等[10]通过研究DM9000A 高速以太网接口芯片,提出基于DM9000A 的伺服控制系统以太网接口,介绍了DM9000A 的工作原理和基本功能,给出DSP 的硬件接口方案以及初始化和收发器的软件配置;讨论和分析了嵌入式系统以太网接口实现的不同解决方案,讨论了两种基于低成本微控制器的方法并进行比较,指出基于FPGA器件的方法可以在性能和开发成本之间达到最佳平衡。
结合以上国内外研究可发现以下不足:①在硬件选择上成本较高;②软件设计大多在操作系统基础上编写程序,程序较冗杂、繁琐,同时对软件的要求比较高。因此,本文重点研究一种硬件成本低廉、软件程序简明的串口服务器。
1 系统方案设计
1.1 功能设计
嵌入式串口服务器拥有串行接口和网络接口,分别接入串行通讯设备和以太网客户端,实现以太网客户端与串行通讯设备的双向数据传输,如图1 所示。
硬件需满足系统的技术指标和实用性,软件能实现系统基本功能。现有串口服务器设计方案主要有:①ARM 芯片+网络控制器芯片(软件开发容易,硬件要求高);②普通单片机+网络控制器芯片(成本很低,硬件和软件开发繁琐);③单芯片硬件协议栈(集成度高,稳定性强)。结合这3 种方案优缺点,本文选择单芯片硬件协议栈,这是目前芯片高集成化发展方向。
1.2 硬件方案选择
该串口服务器由主控模块、串口模块、网络端口模块组成,实现串口与以太网端口之间的数据转换功能,通过综合考虑选择目前最流行的STM32 系列处理器进行开发[12]。STM32 拥有高性能、功耗低、成本低、开发方便等众多优势[13]。由于本系统是基于以太网的串口服务器,出于系统开发的简洁性和成本考虑,最终选择具有互联功能的STM32F107 系列的STM32F107VCT6 作为系统主控芯片[14-16]。
2 系统硬件设计
硬件设计由主控模块电路设计、电源电路设计、RS232串口电路设计、RS485 串口电路设计和以太网模块电路设计5 部分组成[17-19]。
2.1 主控模块电路
主控模块是整个系统最核心部分,包括提供整个系统时钟信号的外部时钟电路、使硬件能够复位的复位电路、能够烧写和下载程序的JTAG 接口电路。主控模块电路设计如图2 所示。
Fig.2 Main control module circuit图2 主控模块电路
(1)系统时钟电路设计。STM32 采用外部晶振体震荡方式给系统提供时钟信号,同时以太网芯片也需外部晶振来提供时钟信号,所以在系统的外部时钟设计中采用25MHz 的晶体振荡器作为整个系统时钟信号来源。
(2)复位电路设计。系统的复位包括外部复位和上电复位,电路由RC 电路和复位按键组成,连接在主控芯片的NRST 复位引脚上。当主控芯片的复位引脚持续一段时间的低电平,芯片就会发生复位。
(3)JTAG 接口电路设计。使用标准的20 引脚JTAG 接口,并根据设计经验在相应的引脚连接上拉电阻。
(4)除此之外,在主控芯片的VVD 引脚接上滤波电容,使其尽量靠近主控芯片的引脚。
2.2 电源模块电路
系统使用5VDC 电源供电,但系统工作电压为3.3V,因此需要将5V 的电通过降压稳压器转化成3.3V 的电。选择目前十分流行的降压稳压器AMS1117 系列芯片,因为:①价格便宜;②管脚定义简单,一共4 个脚,一个GND,一个固定脚,两个引脚一进一出;③能实现电压转换和稳压。基于上述优点和系统要求,选用AMS1117-3.3 作为电源模块的降压稳压器。
2.3 RS-232 串口模块
RS-232 标准是运用十分广泛的数据传输标准,其所定义的标准与主控芯片STM32F107VCT6 所定义的标准有所不同,所以需要使用串口转换芯片在主控芯片输出的TTL电平与标准RS-232C 电平之间进行转换。MAX232 供电电压为5V,功耗较供电电压为3.3V 的MAX3232 高,基于系统供电考虑,选用MAX3232 作为本系统的电平转换芯片。为保证串口传输速度,RS-232 串口接口采用DB9 母头,只需连接TXD、RXD 和GND 引脚就可避免其他信号干扰。其中MAX3232 芯片的10、9 引脚,分别连接主控芯片的PD5 和PD6 引脚,实现RS232 串口通讯的发送与接收。
2.4 RS-485 串口模块
RS-485 是工业控制中常见的一种通讯接口,与RS-232 相比,RS-485 增加了通讯距离和通讯速度。在RS-485通讯网络中一般采用主从通讯方式,即一个主机带多个从机。现在市场上较多的此类收发器有:Sipex 公司的SP49和Maxim 公司的MAX3485。考虑到RS-32 串口模块也是MAX 系列,且MAX3485 与MAX3232 工作电压同样为3.3V,因此本次设计采用MAX3485 作为RS-485 通讯接口的收发器。其中MAX3485 芯片的1、4 引脚连接主控芯片的PC11 和PC10 引脚,实现RS485 串口通讯的接收与发送;MAX3485 芯片的2、3 引脚连接主控芯片的PC12 引脚,实现RS485 串口通讯的发送与接受的使能控制。
2.5 以太网模块
以太网模块就是以太网控制器的外部电路,主要由以太网MAC 控制器和物理层PHY 收发器组成[20]。STM 32F107VCT6 是一款具有互联功能的芯片,它自带10M/100M 的自适应以太网控制器,支持IEEE-802.3-2002 规定的以太网行业标准以及IEEE 1588-2002 的网路精确时钟同步标准,其内部集成了一个MAC 控制器,本设计只需要选择扩展物理收发器PHY 即可。
2.5.1 以太网控制器
考虑到功能和成本等综合因素,本设计采用的PHY 芯片为DP83848。DP83848 是一款10M/100M 的PHY 芯片,符合主控芯片STM32F107 所支持的IEEE802.3u 中10BASETy 与100BASE-TX 物理层协议。STM32 支持两种工业级标准接口,与外部物理层PHY 模块相连,分别是独立于介质的接口(MII)和简化的独立接口(RMII),本系统使用RMII。查阅DP83848 以太网控制芯片手册,可知DP83848的工作模式(RMII/MII)选择由39 号RX_DV 和7 号SNI_MODE 两个管脚的电平共同决定,所以39 引脚需要上拉电阻。除此之外,系统使用MCO 提供DP83848 的时钟信号,需要将STM32 的PA8 引脚与DP83848 的34 引脚(时钟源X1)连接。以太网控制器DP83848 与主控芯片连接电路如图3 所示。
Fig.3 Connection circuit between DP83848 and main control chip图3 DP83848 与主控芯片的连接电路
2.5.2 以太网接口
由于PHY 和网络接口RJ45 直接连接会产生很多无用的杂波,所以在PHY 与RJ45 之间要接入一个网络隔离变压器,即在以太网物理接口中需拥有隔离变压器和RS45 接口;当PHY 芯片的供电电压不一致时也不会对设备造成任何影响[21]。
本文采用隔离变压芯片与RJ45 接口集成的以太网接口方式,使用汉仁电子公司的HR911105A,此芯片集成了隔离变压器和RJ-45 接口,简化了硬件电路设计。以太网控制器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 的连接电路
3 IP/TCP 协议栈
3.1 IP/TCP 协议栈选择
嵌入式设备要连入互联网必须遵守TCP/IP 网络协议[22],目前有两种方式实现这种功能:①使用专门的网络芯片编程,如WIZnet 公司的W5200 等,主控器通过编程得到芯片上的TCP/IP 数据,但这些芯片价格较昂贵,支持的TCP 连接数也十分有限,不适合大量开发;②在主控芯片上移植网络TCP/IP 协议栈,使用免费的开源协议栈,这种方式非常普遍。出于成本和实用性考虑本文选择LwIP 协议栈。
3.2 LwIP 协议栈移植
LwIP 协议栈移植就是把LwIP 协议栈源码添加到kill软件工程中,移植过程如表1 所示。
Table 1 LwIP protocol stack migration process表1 LwIP 协议栈移植过程
4 系统软件设计
软件设计流程如图5 所示。
4.1 系统时钟初始化
串口服务器采用频率为25MHz 的外部高速晶振时钟给系统提供时钟信号。系统时钟配置如表2 所示。
Table 2 Clock configuration表2 时钟配置
Fig.5 Software design flow图5 软件设计流程
系统时钟设置完毕后,根据相应的外部设备连接,对AHB 和APB 进行相应的设置修改即可完成系统时钟配置。
4.2 串口程序初始化设置
通过一个初始化设置函数void USART_Configuration(void)实现串口程序初始化设置。
根据硬件设计原理可知PD5-USART2-TX、PD6-USART2-RX 即主控芯片STM32F107 的A5 引脚为数据输出脚,A6 引脚为数据输入脚,将串口引脚功能初始化,程序如下[23]:
设置A5 脚为复用推挽输出,端口速度50MHz,设置A6脚为浮空输入,端口速度50MHz,开启使能GPIOD 时钟:
上述为RS232 的串口初始化配置。与RS232 类似,RS485 的串口初始化只需将相应的接收和发送引脚作相应更改,除此之外还需配置RS485 的发送和接收使能。由硬件原理可知,PC10-USART3-TX、PD11-USART3-RX 即主控芯片STM32F107 的C10 引脚为数据输出脚,C11 引脚为数据输入脚,C12 引脚为MAX3485 芯片的发送和接收使能引脚,配置如下:
4.3 串口数据传输设计
串口的收发数据主要由设置串口的相关寄存器实现,发送数据由USART_DR 寄存器实现,在寄存器里写下要发送的数据便可实现目的。接收数据与发送数据相似,也是通过相应的寄存器实现的[24]。串口发送数据主要有查询和中断两种方式。由于查询方式会不断调用cup 资源,需要消耗大量的CUP 时间,而且由于主程序周期的影响,所以查询效率很低。而中断方式是当中断条件满足时立即中止当前正在运行的程序,进入中断服务程序,执行完毕后返回断点继续执行,其耗费的CPU 时间相对较少,所以在串口服务器中使用中断方式[25-26]。
4.4 以太网初始化
STM32F107VCT6 芯片自带一个MAC 控制器,初始化方法如表3 所示[27]。
4.5 UDP 传输协议下实现数据传输的程序设计
4.5.1 UDP 服务器端口初始化
调用LwIP 协议栈中的new_udp()函数,新建立一个UDP 的PCB 控制块;然后使用LwIP 协议栈中的udp_bind()函数为已经建立好的PCB 控制块绑定本地的IP 地址和RS232 对应的端口号,绑定成功以后PCB 控制块便可成功激活;最后调用LwIP 协议栈中的udp_recv()函数来设置UDP,接收客户端发送的以太网数据回调函数。udp_recv()函数在LwIP 中的源代码定义如下:
其中,pcb 为udp 协议控制块,void(* recv)(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port)为需要编写的回调函数,rev_arg 为回调函数参数。
Table 3 Ethernet initialization表3 以太网初始化
4.5.2 UDP 协议中以太网转串口回调函数设计
首先声明一个udp_pcb 结构体变量,将远端的IP 地址和端口号存入udp_pcb 控制块中,然后使用udp_pcb 中的pbuf 指针直接将网口接收到的数据提取出来,通过USART2→DR 寄存器操作,将接收缓存送至该数据寄存器,同时发送到串口,从而将以太网接收的数据发向RS232串口。当数据发送完毕时,利用LwIP 协议栈中的pbuf_free()函数将udp_pcb 控制块进行释放
4.5.3 UDP 协议中串口转以太网传输
在串口将接收到的数据存入RS232_rec_buf()后,申明一个udp_buf 结构体,如果接收数据的时间等待超时,则将等待超时表示置0,将RS232_rec_buf()中字节的长度提取出来,存入要发送数据的长度值中,并将接收计数器清零。若接收的数据超过了缓冲区长度,则将缓冲区的大小存入要发送数据的长度值中;然后初始化RS232 中的临时udp数据块,即申请pbuf 数据块,并将RS232_rec_buf()中的数据存入申请好的pbuf 数据块中;最后调用LwIP 协议栈中的udp_send()函数将pbuf 中的数据发送给指定的客户端。完成整个过程后,还要利用LwIP 协议栈中的pbuf_free()函数将申请的临时udp 数据块进行释放。
5 系统测试方法及结果
5.1 UDP/TCP 的IP 地址与端口分配
对调试环境的IP 地址与端口进行配置,具体IP 地址与端口分配如表4 所示。
Table 4 IP address and port allocation of UDP/TCP表4 UDP/TCP 的IP 地址与端口分配
5.2 测试步骤
嵌入式以太网串口服务器如图6 所示。
Fig.6 Embedded Ethernet serial port server图6 嵌入式以太网串口服务器实物
5.2.1 硬件连接
①用交叉网线将服务器和电脑相连(或用直通网线将服务器和路由器相连并将电脑连接到该设备上);②用USB 转RS485 线将服务器的RS485 和电脑的另一USB 口连接;③连接无误后给服务器上电,下载软件程序,复位服务器,此时可看到网口绿灯常亮,黄灯闪烁,表明软硬件无异常。
5.2.2 软件配置
电脑IP 地址配置为:192.168.1.21(与服务器在一个网段内即可),子网掩码配置为:255,255,255,0,运行软件USR-TCP232-Test(串口与网口调试程序),在TCP 模式下,需要在网口助手中将协议类型更改为TCP Client 模式。
5.3 UDP 协议测试结果
UDP 与RS232/RS485 双向数据传输(RS232 对应UDP端口为1033,RS485 对应的UDP 端口为1031)实验结果如图7 所示。
5.4 TCP 协议测试结果
TCP 与RS232/RS485 双向数据传输(RS232 对应TCP 端口为1033,RS485 对应TCP 端口为1031)实验结果如图8 所示。
在上述4 种调试环境中,通过串口助手向网口助手发送串口数据及通过网口助手向串口助手发送数据均能实现预期结果,说明系统设计达到了预期要求。
Fig.7 Bidirectional data transmission between UDP and RS232/RS485图7 UDP 与RS232/RS485 双向数据传输
Fig.8 Bidirectional data transmission between TCP and RS232/RS485图8 TCP 与RS232/RS485 双向数据传输
6 结语
本文采用STM32 系列芯片、RS232/RS485 电平转换芯片和以太网控制芯片,并采用轻量化IP/TCP 协议LwIP 协议栈为基础,设计了嵌入式以太网串口服务器。首先对串口服务器进行分析,提出设计思路与设计方案,完成串口服务器主控模块、串口模块、以太网模块等硬件设计;其次对LwIP 协议栈进行分析,完成LwIP 协议栈的移植以及RS232/RS485 与以太网的双向通讯程序设计,实现将串口数据通过转换后发向以太网,以太网数据通过转换后发向串口;最后进行串口服务器测试,验证了设计的可行性。