引言
本文主要阐述了基于STM32F207微处理器和DM9161A网络接口芯片的以太网方案,能够实现对谐波的监测,很好地解决了谐波对电网所造成污染这一问题。
1 系统的硬件设计
1.1 系统原理及技术特点
本系统所用的核心微处理器是意法半导体公司生产的STM32F207,该芯片拥有高性能的32位精简指令集,最高工作频率为120 MHz,内置高速存储器,有丰富的I/O端口和外设资源[1]。
本系统的结构包括:CPU电源管理模块、微处理器控制电路模块、网口电路模块、RS485通信接口电路模块、MAX3232接口电路等几个部分。系统框图结构如图1所示。
图1 系统框图结构
STM32F207内部集成了MAC(Media Access Control)模块,它依照IEEE802.3数据帧格式控制PHY(物理层),对外提供MII或者RMII接口,以此实现数据传输。
MII(Medium Independent Interface)即媒体独立接口。MII总线是一种用于将不同类型的PHY与相同网络控制器(MAC)相连接的通用总线。网络控制器可以用同样的硬件接口与任何PHY 相连接。MII支持10 Mb/s和100 Mb/s的操作,但其所需信号线较多,一个端口需要14根数据线,例如一个32端口的交换机需要448根线[2]。
RMII是通过MII简化而来的一种接口方式,它也支持10 Mb/s和100 Mb/s的总线接口速度。RMII所有的数据端口公用一个时钟,所以它的一个端口只需要7根数据线。
MII和RMII综合对比如下:
① MII一个端口需要14根数据线,RMII一个端口需要7根数据线。
② MII的数据传输需要4根线,RMII的数据传输需要2根线。
③ 对于10 Mb/s线速,MII的速率是2.5 Mb/s,RMII的速率是5 Mb/s;对于100 Mb/s线速,MII的速率是25 Mb/s,RMII的速率是50 Mb/s。
综合对比,本系统中选用的是RMII接口方式。
图2给出了STM32F207的外围电路。
图2 STM32F207外围电路
1.2 网络接口芯片DM9161A
DM9161A是用于100BASETX和10BASETX以太网物理层的、低功耗、高集成度的收发芯片。DM9161A采用先进的CMOS工艺,完全符合IEEE802.3规定的100BASETX物理层协议。DM9161A还支持自协商功能[3]。
DM9161A在媒介一侧,它提供了一个直接接口,可以直接连接网络。不过考虑到对DM9161A的保护和自动识别网线,在此外接一个网络变压器HS9016。HS9016内部集成一个网络变压器,并且具有自动翻转功能。它可以自动识别收发信号并自动去适应,因而可以使用交叉网线或者直通网线连接路由、HUB或者PC。
DM9161A与网络变压器的接口电路如图3所示。
20~17引脚(TXD0~TXD3):发送数据位。在RMMI模式下,只需要用到TXD0和TXD1。
21引脚(TXEN):传输使能位。在RMMI模式下,高电平表示TXD上的数据合法。
29~26引脚(RXD0~RXD3)/PHYAD0~PHYAD3):接收数据位。在RMMI模式下,只需要用到RXD0、RXD1。
32引脚(MDINTR#):状态中断输出脚。如果原来是低电平,则中断时输出高电平;如果是高电平,则中断时输出低电平。
40引脚(RESET#):低电平,用来初始化DM9161A。
DM9161A的物理地址是通过接收的26~29引脚,以及35引脚CRS/PHYAD4来确定的。具体来说,在上电复位时,根据这几个引脚的高电平来确定地址。本系统采用的RMMI,只接了RXD0、RXD1,其他几个引脚悬空,所以上电时只有RXD0与RXD1是高电平,因此DM9161A物理地址为3。
LED通过在上电复位后或者通过写PHY寄存器软件复位后每500 mS闪烁一次。所有LED引脚是双向引脚,可以配置成高有效或者低有效,如果这个引脚被拉高,则复位后低有效;如果这个引脚被拉低,则复位后高有效[4]。
LED的两种模式如表1、表2所列。
表1 正常的LED模式
表2 双灯LED模式
2 系统的软件设计
2.1 系统的初始化
本系统开发环境采用的是Keil μVision4,在Keil μVision4环境下,采用的是C语言编程。程序在启动网络功能之前,首先要对STM32F207和DM9161A进行初始化。初始化内容如下:
图3 DM9161A与网络变压器的接口电路
◆ 初始化STM32F207端口控制PIO;
◆ 设定以太网物理地址;
◆ 定义接收帧类型、地址端口、数据类型;
◆ 配置DM9161A的工作模式;
◆ 配置DM9161A的本地MAC地址;
◆ 根据DM9161A配置的MAC地址,初始化STM32F207 MAC的寄存器,使其工作在RMII模式、接收和发送使能[5]。
2.2 LwIP协议栈的实现及应用
LwIP是Light weight(轻型)IP协议,以分层的协议为参照来设计实现TCP/IP,从逻辑上可以分为4层:链路层、网络层、传输层和应用层。各层协议之间有交叉,因此可以更有效地重用缓冲区。其可移植性强,有无操作系统的支持都可以运行。LwIP具有以下特性:
① 支持多网络接口下的IP转发;
② 支持ICMP协议;
③ 包括实验性扩展的UDP;
④ 包括阻塞控制、RTT估算、和快速恢复和转发的TCP;
⑤ 提供专门的内部回调接口;
⑥ 可选择的Berkeley接口API;
⑦ 支持DHCP,动态分配IP地址;
⑧ 支持IPV6协议。
LwIP的初始化程序如下:
static struct netif dm9161a;//声明一个netif结构变量
struct ip_addr ipaddr, netmask, gw;//声明了三个分别用于暂存IP地址、子网掩码和网关地址的变量,它们是32位的
IP4_ADDR(&gw, 192, 168, 0, 1);
IP4_ADDR(&ipaddr, 192, 168, 0, 10);
IP4_ADDR(&netmask, 255,255, 255, 0);//对三个地址的初始化
netif_init();
netif_add(&dm9161a, &ipaddr, &netmask, &gw, NULL, ethernetif_init, tcpip_input);//调用netif_add函数初始化变量dm9161a
netif_set_default(&dm9161a);
netif_set_up(&dm9161a);
2.3 以太网数据包接收
在数据包接收过程中,需要注意的是,数据包是以查询方式接收的,即处理器不断向网卡芯片中读取数据,如果读取成功,则将数据通过网卡注册的input函数交往上层进行处理。因此,使用查询方式实现的数据包接收进程,其优先级必须低于系统中其他进程的优先级。
数据包接收程序如下:
tcpip_input(struct pbuf *p, struct netif *inp){
struct tcpip_msg *msg;
if (mbox != SYS_MBOX_NULL) {
msg = memp_malloc(MEMP_TCPIP_MSG_INPKT); //接收一个数据包
if (msg == NULL) {//如果接收包为空
return ERR_MEM;//返回到ERR_MEM函数
}
msg->type = TCPIP_MSG_INPKT;
msg->msg.inp.p = p;
msg->msg.inp.netif = inp;//取得数据包内容
if (sys_mbox_trypost(mbox, msg) != ERR_OK) {//将数据包发送到上层应用函数
memp_free(MEMP_TCPIP_MSG_INPKT, msg);
return ERR_MEM;
}
return ERR_OK;
}
return ERR_VAL;
}
结语
本文介绍的在STM32F207和DM9161A平台上设计实现的LwIP协议通信,经过测试能够稳定运行。该系统不需要任何的操作系统支持,具有更加广阔的应用前景。如今该系统已经在某些电力系统中得到应用。