张庆辉,马延立
(河南工业大学 信息科学与工程学院,郑州 450001)
随着以太网技术的普及和发展,基于以太网的应用接口设备也迅速普及到医疗设备、工厂电力系统等领域。嵌入式以太网系统不但可以通过Internet将通信距离无限扩大,使得大量数据的快速传输成为可能,还可以实现测控系统间的数据交换,为智能化、模块化的嵌入式设备的实现提供了一种新途径。然而,嵌入式以太网接口设计的核心器件是网络控制芯片,其性能优劣直接影响网络通信的效率。
本文采用基于32位Cortex-M3内核的STM32F103VET6微处理器和高性能的以太网控制芯片ENC28J60实现高性能、高可靠性的嵌入式以太网通信接口设计,其系统各功能模块容易扩展和升级。
STM32F103VET6是32位Cortex-M3内核的新型处理器。它具有更多片内RAM和外设,其出色的性能和丰富的资源几乎不需要扩展外围电路就能满足一般的设计要求,硬件设计大为简化,且执行速度和内存容量完全满足主控模块的多任务实时应用。
ENC28J60是Microchip公司推出的28引脚独立以太网控制芯片,可为嵌入式应用提供低引脚数、低成本且高效易用的远程通信解决方案。ENC28J60采用业界标准的SPI串行接口,只需4条连线即可与主控单片机连接。ENC28J60以太网控制器的主要功能包括:
① 符合IEEE 802.3标准。内置10Mbps以太网物理层器件(PHY)及媒介接入控制器(MAC),可按业界标准的以太网协议可靠地收发信息包数据。
② 可编程过滤功能。特殊的过滤器包括可编程模式匹配过滤器,可自动评价、接收或拒收Magic Packe的单播、多播或广播信息包,以减轻主控单片机的处理负荷。
③ 最高速度可达10MB/s的SPI接口。
④ 可编程8KB双端口SRAM缓冲器,以高效的方式进行信息包的存储、检索和修改,以减轻主控单片机的内存负荷。该缓冲器提供了灵活可靠的数据管理机制[1]。
ENC28J60可以通过SPI接口方便地和微处理器连接而构成嵌入式以太网通信接口,对于没有SPI接口的微处理器也可以通过I/O口模拟SPI的方法实现。STM32F103VET6内部含有3个SPI接口,可以很方便地实现与ENC28J60的连接。STM32F103VET6SPI引脚连接图如图1所示。
图1 STM32F103VET6SPI引脚连接图
ENC28J60具有上电复位功能,一旦VDD上升到某个门限值后,就会在片内产生上电复位脉冲,当VDD上升到足够器件工作电压时,器件会以初始化状态启动,在器件正常工作期间,RESET引脚的内部弱上拉将会使引脚保持逻辑高电平,在系统上电复位后不应立即发送数据或访问到MAC、MII或PHY寄存器,至少应延迟10ms。通过查询ENC28J60状态寄存器ESTAT中的CLKRDY位来确定系统是否准备好是不可靠的,最好将复位引脚连接到单片机的引脚,通过软件延时来使系统可靠复位[2]。
ENC28J60内部集成了2.5V稳压器,要使之工作稳定,需要在VCAP引脚与地之间外接一个10μF电容;由于ENC28J60内部稳压器无法驱动外部负载,所以电源引脚必须与同一个3.3V电源相连,并且在每个电源引脚与地之间都应连接一个0.1μF的磁片电容,而且电容应尽可能靠近引脚。
硬件电路连接如图2所示。根据ENC28J60的工作频率要求,需在OSC1和OSC2引脚间连接25MHz晶振及接地电容。ENC28J60的内部模拟电路需要在RBIAS引脚与地之间外接一个1kΩ的电阻。以太网变压器在实现以太网接口操作时是不可缺少的,在差分发送引脚(TPOUT+/TPOUT-)上,需要外接一个带有中心抽头的1∶1脉冲变压器[3]。变压器应具有2kV以上的电压隔离性能,以防止静电干扰。本设计采用的是集成以太网隔离变压器RJ45插座HR911105A。
STM32(即STM32F10系列芯片,包括了本文所用的芯片)标准外设库也称固件函数库或固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微处理器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,就可以轻松应用每一个外设。因此,使用固件函数库可以大大减少用户的程序编写时间,进而降低开发成本。该固件库中的每个外设驱动都由一组函数组成,这组函数覆盖了该外设的所有功能,并且每个器件的开发都有一个通用API驱动,API对该驱动程序的结构、函数和参数名称都进行了标准化[4]。
在实际开发过程中,根据应用程序的需要,可以采取2种方法使用标准外设库:
① 使用外设驱动:这时应用程序开发基于外设驱动的 API。用户只需要配置文件“stm32f10x_conf.h”,并使用相应的文件“stm32f10x_ppp.h/.c”即可。
② 不使用外设驱动:这时应用程序开发基于外设的寄存器结构和位定义文件。
使用标准外设库进行开发可以极大地减少软件开发的工作量,也是目前嵌入式系统开发的一个趋势。
图2 硬件电路连接图
ENC28J60控制寄存器中最基本和重要的5个寄存器是:EIE、EIR、ESTAT、ECON2和ECON1。
EIE:以太网中断使能控制寄存器,分为总中断使能和各部分使能控制。
EIR:以太网中断标志寄存器,在接收和发送数据包时根据不同的标志位进入不同的执行程序。
ESTAT:以太网状态寄存器,反映以太网当前的数据碰撞、忙信息、错误信息、时钟状态等信息。
ECON2:以太网辅助控制寄存器,设置数据指针、芯片节能等。
ECON1:以太网主控制寄存器,这个是芯片最常用的寄存器,主要用来设置不同层的寄存器空间[5]。
在使用ENC28J60发送和接收数据包时,必须对器件进行初始化设置。根据不同的应用,一些配置选项可能需要更改。ENC28J60的初始化主要是对其接收和发送缓冲器、接收过滤器、晶振启动时间、MAC寄存器、PHY寄存器进行设置。初始化ENC28J60之前,先关闭单片机的中断输入,对引脚给定一个持续的低电平复位信号,然后对相应的寄存器进行设置。设置完成所有需要的寄存器后,判断以太网状态中的时钟启动标志位是否置位,然后开中断。对于以太网传输部分来说,主要有两个作用:一是对要发送的数据按照以太网数据帧格式进行封装并发送;二是对接收的以太网数据帧进行解包,供应用程序使用[6]。
通过向STM32F103VET6的SPI缓冲器写入相应格式的命令代码,可实现与ENC28J60的数据通信。需要指出的是,对PHY寄存器不能通过SPI口直接读写,而是通过特殊的MII寄存器来完成读写操作。
ENC28J60与STM32F103VET6的连接是通过SPI实现的,STM32F103VET6可通过SPI接口发送命令,访问ENC28J60的相关寄存器来完成相应的操作。下面给出SPI读/写数据,以及ENC28J60接收/发送数据包的部分源代码:
ENC28J60内的MAC在发送时会自动生成前导符和帧起始定界符。此外,MAC可根据配置生成填充和CRC字段。但主控制器必须生成所有其他帧字段,并将它们写入缓冲存储器,以待发送。ENC28J60发送数据包主要源代码如下:
ENC28J60收到一个完整的以太网数据包后,会向CPU发出中断请求,CPU响应ENC28J60的中断申请后,系统将进入中断服务程序并开始接收数据。ENC28J60接收数据包主要源代码如下:
由ENC28J60构成的嵌入式以太网接口电路25 连接简单,功能强大,与目前大多数需要并行数据和地址总线的以太网相比,不需要外扩地址和数据总线,并且完全符合未来工业以太网的发展趋势。此外,本设计应用在智能仪表中,可使现场设备方便地接入以太网,以便更好地实现管控一体化;克服了市场上已有以太网控制器封装引脚多的缺点,简化了设计,减小了占板空间。该接口电路实现方便,可以广泛应用于控制领域。
[1] 祁树胜.SPI接口以太网控制器ENC28J60及其应用[J].微计算机信息,2006,8(2):266-268.
[2] 王廷尧.以太网技术与应用[M].北京:人民邮电出版社,2005.
[3] 陈磊,冯冬芹,金建祥,等.以太网在工业应用中的实时特性研究[J].浙江大学学报:工学版,2004,38(6):29-31.
[4] 李宁.基于 MDK的STM32处理器开发应用[M].北京:北京航空航天大学出版社,2008.
[5] 张瑞瑞,马晨普.一种精简可靠的低成本嵌入式以太网接口设计[J].电子产品世界,2006(12):66-68.
[6] 张伟业,黄云龙,陈国定.基于ENC28J60以太网通信接口的设计与实现[J].机电工程,2008,25(1):28-30.