零死角玩转stm32-高级篇7、以太网(ENC28J60)
零死角玩转stm32-高级篇8、以太网(ENC28J60 + Lwip)

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。
M3的世界,与野火同行,乐意惬无边。
另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。
内容上会给你带来更多的惊喜。
是一本学习STM32必备的工具书。
敬请期待!8、以太网(ENC28J60+LWIP)8.1 友情提醒Lwip的教程非常庞大且深入,是《stm32库开发实战指南》里面的内容,鉴于跟出版社的合约的关系,这里不能够开源,但野火STM32开发板里面提供了源码。
欲知更详细内容,请关注机械工业出版社将于10月份出版的《stm32库开发实战指南》。
LWIP实验需要用到ENC28J60这个以太网模块,野火STM32开发板已经板载了这个模块,可直接做LWIP实验。
8.2实验步骤下面简单介绍下LWIP的操作方法和能够达到的效果。
野火STM32开发板供电(DC5V),插上JLINK,插上串口线(两头都是母的交叉线),利用网线把STM32开发板接入与PC相同的路由,也可以直接利用网线把开发板和PC相连,其实验的操作是相同的(这样可以排除路由的问题),但在进行浏览网页实验时,图片可能无法正常显示。
把本工程文件编译后烧录到开发板上,在程序运行框输入cmd命令进入dos模式。
8.2.1 ping实验在命令提示符窗口输入命令并回车: ping 192.168.1.18输入ping命令成功后的现象ping 192.168.1.188.2.2 telnet实验1.如果使用windows 7系统,系统没有telnet程序,需要自行下载安装。
使用xp系统的用户,在命令提示符窗口输入命令并回车:telnet 192.168.1.18输入命令后弹出如下窗口:进入 telnet程序2.见错误!未找到引用源。
以太网控制器ENC28J60编程要点

摘要:在嵌入式系统中,以太网控制器通常也是研究热点之一,MicroChip公司的ENC28J60在嵌入式系统中应用价值较高,该芯片集成了MAC控制器和PHY,使用SPI接口,适合在引脚资源比较紧张的嵌入式系统中加入以太网连接功能,本文主要介绍了MicroChip公司的ENC28J60控制器的初始化及其编程相关的注意和要点,并针对开发中可能遇到的一些问题进行了探讨。
关键字:ENC28J60编程1.以太网数据缓冲区(8K)读写/地址控制REG的相关作用:注意,这些REG除EPKTCNT外都为16bits,以太网数据缓冲区地址为:0000h~1FFFh 1).ERDPT(分为H/L两个)MC U读缓冲器指针:--手册P28,MCU读取缓冲区数据时,每次实际读取的地址由该REG保存.2).EWRPT(分为H/L两个)MC U写缓冲器指针:--手册P29,MCU向缓冲区写入数据时,每次实际写入的地址由该REG保存.3).ERXRDPT(分为H/L两个)接收读指针:--手册P17,P33, 定义禁止接收硬件写入的FIFO 中的位置。
在正常操作中,接收硬件(指网络接口方向)将数据顺序写入,直到ERXRDPT 所指单元(不包括该单元)。
注意,该REG与释放缓冲区的空间操作相关.4).ERXWRPT(分为H/L两个)接收写指针:--手册P17,P33, 定义接收硬件收到的数据写入的FIFO 中的具体位置。
在正常操作中,接收硬件(指网络接口方向)将数据顺序写入ERXWRPT所指单元。
注意,该REG为”只读”,且与释放缓冲区的空间操作相关.5).ETXST(分为H/L两个)发送缓区起始地址:--手册P17,在整个以太网数据缓冲区中,定义待发送数据区的首地址6).ETXND(分为H/L两个)发送缓区结束地址:--手册P17,在整个以太网数据缓冲区中,定义待发送数据区的尾地址7).ERXST(分为H/L两个)接收缓区起始地址:--手册P17, 在整个以太网数据缓冲区中,定义接收硬件可以写入数据的缓冲区首地址.8).ERXND(分为H/L两个)接收缓区结束地址:--手册P17, 在整个以太网数据缓冲区中,定义接收硬件可以写入数据的缓冲区尾地址.9).EPKTCNT(8bits)以太网数据包计数器:--手册P43,P45,当硬件允许的时候,每次收满一个以太网数据包(>64bytes)时,EPKTCNT+1,最大值为255,此时不论缓冲是否还有空闲也不再接收数据.每次前移ERXRDPT(即释放接收缓冲区操作)后,EPKTCNT-1,最小值为0.注意:在以上9个REG中,名称中带有”X”的规定的地址都是给以太网接收器使用的(即:从以太网一侧访问8K缓存),只有ERDPT和EWRPT是MCU通过SPI接口访问8K缓冲区用的.访问的关系如下图:其中ERXWRPT和 ERXRDPT可以指向同一地址,应为ENC28J60接收时会从ERXWRPT 指向的地址一直写到ERXRDPT指向的地址前一个空间(即手册所谓的”不包括ERXRDPT指向的单元”).此时整个接收缓冲区全部可用.8K空间中,实际用来进行发送缓冲的空间由寄存器组ETXST和ETXND确定,实际用来进行接受缓冲的空间由寄存器组ERXST和ERXND确定.显然,8K空间中可以多余一些什么也不用的位置.2.MII和PHY寄存器的操作:PHY寄存器负责对PHY接口的配置,MCU不能直接从SPI接口访问这些REG,但是主控可以通过MAC组的一组特殊控制REG来访问PHY控制寄存器,MAC组中的这些特殊的控制REG即称为MII接口寄存器.对MCU而言,不会有直接访问PHY的可能,所有的PHY操作都必须经过MII寄存器来完成.还需注意,PHY有部分为16bits,写入的时候必须先写低8bits,当写入高8bits的时候控制的设定将立即起效.3.控制器结构和初始化过程初始化的过程应该是:初始化ETH组REG--->初始化MAC组REG--->通过MII初始化PHY组REG(需要查询硬件稳定)Step1:ETH组控制寄存器初始化1).EIE初始化--手册P67,以太网中断允许控制主控SPI写控制REG(WCR),发出2byte,REG地址0h1b,数据为:0b010\11011+0bAAAAAAAA(A--8bits实际数据)2). EIR查询--手册P68,以太网中断状态获取主控SPI读控制REG(RCR),发出2byte, REG地址0h1C,数据为:0b010\11100+0bXXXXXXXX(X—为了保持SPCK发出的无效数)读取的有效数据在SPI发送的第二个有效字节返回.3).ESTAT查询--手册P66,获得PHY就绪状态(以及以太网的各种错误状态)主控SPI读控制REG(RCR),发出2byte, REG地址0h1D,数据为:0b010\11101+0bXXXXXXXX(X—为了保持SPCK发出的无效数)读取的有效数据在SPI发送的第二个有效字节返回.4).ECON2初始化--手册P16,IC节能控制,数据包指针寄存器控制主控SPI写控制REG(WCR),发出2byte,REG地址0h1E,数据为:0b010\11110+0bAAAAAAAA(A--8bits实际数据)5).ECON1初始化--手册P15,特别注意其中对BANK0~3的选择位,写不同的控制REG需要多次改变Bank0~3的选择.--手册P16,IC节能控制,数据包指针寄存器控制主控SPI写控制REG(WCR),发出2byte,REG地址0h1F,数据为:0b010\11111+0bAAAAAAAA(A--8bits实际数据)6).ERXFCON接收过滤器初始化--手册P48,首先需要写ECON1,选择访问Bank1,此后主控SPI写控制REG(WCR),发出2byte,REG地址0h18,数据为:0b010\11000+0bAAAAAAAA(A--8bits实际数据)Step2:ETH组地址寄存器初始化1).寄存器组ETXST和ETXND就位--定义发送缓冲区范围ETXSTL/H主控SPI写控制REG(WCR),发出4byte,REG地址0h04(L),0h05(H),数据为:0b010\00100+0bAAAAAAAA(A--8bits实际数据,ETXSTL)0b010\00101+0bAAAAAAAA(A--8bits实际数据,ETXSTH)ETXNDL/H主控SPI写控制REG(WCR),发出4byte,REG地址0h06(L),0h07(H),数据为:0b010\00110+0bAAAAAAAA(A--8bits实际数据,ETXNDL)0b010\00111+0bAAAAAAAA(A--8bits实际数据,ETXNDH)2). 寄存器组ERXST和ERXND就位--定义接收缓冲区范围ERXSTL/H主控SPI写控制REG(WCR),发出4byte,REG地址0h08(L),0h09(H),数据为:0b010\01000+0bAAAAAAAA(A--8bits实际数据,ERXSTL)0b010\01001+0bAAAAAAAA(A--8bits实际数据,ERXSTH)ERXNDL/H主控SPI写控制REG(WCR),发出4byte,REG地址0h0a(L),0h0b(H),数据为:0b010\01010+0bAAAAAAAA(A--8bits实际数据,ERXNDL)0b010\01011+0bAAAAAAAA(A--8bits实际数据,ERXNDH)3). ERXWRPT和ERXRDPT就位--注意其范围要随应用中定义的数据帧的大小变化,且每次处理完接收以后要操作ERXRDPT释放空间.ERXWRPTL/H主控SPI写控制REG(WCR),发出4byte,REG地址0h0C(L),0h0D(H),数据为:0b010\01100+0bAAAAAAAA(A--8bits实际数据, ERXRDPTL)0b010\01101+0bAAAAAAAA(A--8bits实际数据, ERXRDPTH)注意:初始化时, ERXWRPTL/H一般取等于ERXSTL/HERXRDPTL/H主控SPI写控制REG(WCR),发出4byte,REG地址0h0E(L),0h0F(H),数据为:0b010\01110+0bAAAAAAAA(A--8bits实际数据, ERXRDPTL)0b010\01111+0bAAAAAAAA(A--8bits实际数据, ERXRDPTH)注意: ERXRDPT与ERXWRPT的差值应该大于1个以太网数据帧的长度,如果ERXRDPT=ERXWRPT则整个接收缓冲区可以连续使用.4).根据MCU从以太网接收数据的需要,ERDPT就位ERDPTL/H主控SPI写控制REG(WCR),发出4byte,REG地址0h00(L),0h01(H),数据为:0b010\00000+0bAAAAAAAA(A--8bits实际数据,ERDPTL)0b010\00001+0bAAAAAAAA(A--8bits实际数据,ERDPTH)5).根据MCU向以太网发送数据的需要,EWRPT就位EWRPTL/H主控SPI写控制REG(WCR),发出4byte,REG地址0h02(L),0h03(H),数据为:0b010\00010+0bAAAAAAAA(A--8bits实际数据,EWRPTL)0b010\00011+0bAAAAAAAA(A--8bits实际数据,EWRPTH)Step3:MAC组寄存器初始化(注意:MAC组寄存器映射在Bank2/3,访问前需要调整ECON1中的BSEL0/1)如果初始化发生在上电复位之后,初始化前必须查询ESTAT.CLKRDY(手册P33)MAC寄存器的初始化顺序不重要,一般按照(手册P34)说明的顺序:1).MACON2.MARST位清0—MAC初始化退出.主控SPI写控制REG(WCR),发出2byte,REG地址0h01(Bank2)数据为:0b010\00001+0bAAAAAAAA(A--8bits实际数据)2).MACON1初始化--MARXEN位置1使能MAC接收.--启动全双工方式,TXPAUS和RXPAUS位置1.主控SPI写控制REG(WCR),发出2byte,REG地址0h00(Bank2)数据为:0b010\00000+0bAAAAAAAA(A--8bits实际数据)3).MACON3初始化--将PADCFG.TXCRCEN.和FULDPX位置1,使能帧自动填充,使能自动CRC生成.(要注意其中FRMLNEN位的使用).主控SPI写控制REG(WCR),发出2byte,REG地址0h02(Bank2)数据为:0b010\00010+0bAAAAAAAA(A--8bits实际数据)4).MACON4一般保持默认值5).MAMXFL(16bitsREG,分为H/L两部分)就位--确定网络帧的最大字节数(暂定义应用中的帧长度都为64bytes).主控SPI写控制REG(WCR),发出4byte,REG地址(Bank2)0h0A(L),0h0B(H),数据为:0b010\01010+0bAAAAAAAA(A--8bits实际数据, MAMXFLL)0b010\01011+0bAAAAAAAA(A--8bits实际数据, MAMXFLH)6).MABBIPG就位--背对背包时间间隔就位,全双工时置入值固定为15h主控SPI写控制REG(WCR),发出2byte,REG地址0h04(Bank2)数据为:0b010\00100+0b000101017).MAIPGL就位--非背对背包时间间隔就位, 全双工时置入值固定为12h(L)和0Ch(H)主控SPI写控制REG(WCR),发出4byte,REG地址(Bank2) 0h06(L)0h07(H)数据为:0b010\00110+0b00010010(MAIPGLL)0b010\00111+0b00001100(MAIPGLH)注意:正常使用时,应该采用全双工方式,此时MACLCON1/2可保持默认值8).MAC地址就位(映射在Bank3)--将6字节的MAC地址写入寄存器组:MAADR0~MAADR5.主控SPI写控制REG(WCR),发出6byte,REG地址(Bank3) 0h00~0h05数据为:0b010\00000+0bAAAAAAAA(A--8bits实际数据,MAADR1)0b010\00001+0bAAAAAAAA(A--8bits实际数据,MAADR0)0b010\00010+0bAAAAAAAA(A--8bits实际数据,MAADR3)0b010\00011+0bAAAAAAAA(A--8bits实际数据,MAADR2)0b010\00100+0bAAAAAAAA(A--8bits实际数据,MAADR5)0b010\00101+0bAAAAAAAA(A--8bits实际数据,MAADR4)Step4:PHY组寄存器初始化注意: 如果初始化发生在上电复位之后,初始化前必须查询ESTAT.CLKRDY(手册P33)(注意:PHY组寄存器的MII接口REG映射在Bank2,访问前需要调整ECON1中的BSEL0/1)与PHY相关的MII寄存器共有6个分别是:MICON—手册P21,MII控制REGMICMD—手册P21,MII命令REGMIREGADR—手册P19,PHY访问地址REGMIWRL/H—手册P19,PHY写数据REG高/低,注意,该REG组必须先写入L再写入H,写入H 会触发MII控制事件.MIRDL/H—手册P19,PHY读数据REG高/低.在读之前应将MICMD的MIIRD位置1,这样可以触发PHY事件且使MISTAT.BUSY=1,当MII获得了PHY值以后,MIIRD不会自动清0.所以在查询MISTAT.BUSY=0以后要手动清0.MISTAT—手册P22,MII状态REG,反映PHY的状态,在读/写PHY之前应该先查询此REG当MISTAT.BUSY=0时才可以进行操作.根据手册P38,一般只需要配置3个PHY模块并且要查询PHY的工作状态1).PHCON1的手动操作--虽然可以通过外接LED的方式确定半双工/全双工方式,但是手工设置PHCON1.PDPXMD位的值是更加安全的方法,同时也要手工修改MACON3中的FULDPX位.--PHY地址00h,通过MII操作时,流程在手册P19主控SPI写控制REG(WCR),发出2byte*3,给MIREGADR,MIWRL/H 3个REG地址(Bank2)0h14(MIREGADR),0h16(MIWRL),0h17(MIWRH),数据为:0b010\10100+0b00000000(字节1—MIREGADR的地址,字节2—写入PHCON1的地址00h)0b010\10110+0bAAAAAAAA(字节1—MIREGADR的地址, 字节2—写入MIWRL的8bits 实际数据—L字节应该是写入PHCON1的实际值)0b010\10111+0b00000000(字节1—MIREGADR的地址, 字节2—写入MIWRH的8bits 实际数据,在这里发出的数据无效,仅触发PHY事件).写入后,MII自动触发PHY事件,MISTAT.BUSY自动置1.2).PHLCON的设置--根据外结LED电路的实际结构,有可能要修改这个REG.--PHY地址00h,通过MII操作时,流程在手册P19主控SPI写控制REG(WCR),发出2byte*3,给MIREGADR,MIWRL/H 3个REG地址(Bank2)0h14(MIREGADR),0h16(MIWRL),0h17(MIWRH),数据为:0b010\10100+0b00010100(字节1—MIREGADR的地址,字节2—写入PHLCON的地址14h)0b010\10110+0bAAAAAAAA(字节1—MIREGADR的地址, 字节2—写入MIWRL的8bits 实际数据—L字节应该是写入PHLCON的实际值)0b010\10111+0b00000000(字节1—MIREGADR的地址, 字节2—写入MIWRH的8bits 实际数据,在这里发出的数据无效,仅触发PHY事件).写入后,MII自动触发PHY事件,MISTAT.BUSY自动置1.3).PHCON2的设置--一般全双工状态时可以保持其默认值,但是注意其中的TXDIS位可以关闭PHY的硬件发送. 主控SPI写控制REG(WCR),发出2byte*3,给MIREGADR,MIWRL/H 3个REG地址(Bank2)0h14(MIREGADR),0h16(MIWRL),0h17(MIWRH),数据为:0b010\10100+0b00000000(字节1—MIREGADR的地址,字节2—写入PHCON2的地址11h)0b010\10110+0bAAAAAAAA(字节1—MIREGADR的地址, 字节2—写入MIWRL的8bits 实际数据—L字节应该是写入PHCON2的实际值)0b010\10111+0b00000000(字节1—MIREGADR的地址, 字节2—写入MIWRH的8bits 实际数据,在这里发出的数据无效,仅触发PHY事件).写入后,MII自动触发PHY事件,MISTAT.BUSY自动置1.特别注意:PHY寄存器不能直接访问,需要通过MII寄存器的间接操作.4).查询MISTAT状态--主控SPI读控制REG(RCR),发出3byte, REG地址0h0A(Bank3),数据为:0b010\01010+0bXXXXXXXX+0bXXXXXXXX(X—为了保持SPCK发出的无效数) 读取的有效数据在SPI发送的第三个有效字节返回.。
基于ENC28J60的嵌入式系统以太网接口设计

第28卷第3期2007年 6月河南科技大学学报:自然科学版Journal of Henan University of Science and Technol ogy:Natural Science Vol .28No .3Jun .2007基金项目:教育部铁路电力机车牵引及控制项目(V21-W17041)作者简介:张中央(1966-),男,河南孟津人,副教授,从事电力电子技术、电力机车控制、牵引与制动等教学与研究工作.收稿日期:2006-10-13文章编号:1672-6871(2007)03-0049-05基于ENC28J 60的嵌入式系统以太网接口设计张中央,陶乃彬(郑州铁路职业技术学院,河南郑州450052)摘要:介绍了一种基于新型独立以太网控制芯片E NC28J60的以太网通讯接口的软硬件设计方法。
文中详细介绍了新型独立以太网控制器E NC28J60的结构、功能、外围电路以及E NC28J60与C8051F040的SP I 通讯和基于两者的TCP /I P 协议栈的实现的软硬件设计。
E NC28J60以太网控制器采用标准的SP I 串行接口,只需4条连线即可实现与单片机连接,有利于在小型系统上实现以太网功能。
关键词:E NC28J60芯片;以太网;接口;C8051F040;T CP /I P 设计中图分类号:TP393.11文献标识码:A0 前言随着互联网的普及和以太网的迅速发展,基于以太网的设备控制越来越多,发展也越来越快。
目前,以太网已经广泛地应用于各种计算机网络,通过以太网及T CP /I P 协议栈[1]可以使不同的网络控制设备实现互连、交换数据。
用以太网实现嵌入式系统的网络连接有多种方案,传统的多器件以太网连接方案是通过MCU 扩展以太网控制器来实现的,必要时还需要扩展外部RAM 和ROM ,虽然这种方案应用起来不是很困难,但所用外部元件数量较多,系统开销较大,最大的缺点是稳定性不高。
ENC28J60

1前言嵌入式以太网开发,可以分为两个部分,一个是以太网收发芯片的使用,一个是嵌入式以太网协议栈的实现。
以太网收发芯片的使用要比串口收发芯片的使用复杂的多,市面上流通比较广泛的以太网收发芯片种类还不少,有SPI接口的ENC28J60,也有并口形式的RTL8019S,CS8900A等。
嵌入式以太网协议栈有著名的uIP协议栈,Lwip协议栈,还有其他嵌入式高手开发的协议栈。
无论是硬件还是软件,都无法分出高低,适合项目需求的才是最好的。
1.1 写作理由再说明一下我写作的理由。
以前从淘宝上购买过ENC28J60,店家信誓旦旦地说能提供51AVR LPC STM32等多个平台的代码,可以实现一个网页控制LED。
头脑一热买了回来,买回来才发现,店家提供的资料零零散散,不易弄懂。
几经周转,发现原来这些ENC28J60的代码都出自一个地方——AVRNET,源自老外的一个开源项目。
把最原始的代码拿来细细品味,以太网协议就不那么神秘了。
在这里说一下ENC28J60的使用,熟悉了ENC28J60的驱动可以分几步走。
第一步,通过ENC28J60移植uIP或者lwIP协议栈,实现TCP或是UDP通信,第二,顺着AVRNET项目走,实现一个简单的web服务器,运行静态或者动态网页。
嵌入式以太网和计算机以太网开发不同,对于TCP通信而言没有socket套接字,对于网页编程而言也没有IIS或PHP,所示实现起来会相对麻烦,但是也非常有乐趣。
1.2 资料准备嵌入式以太网开发是非常复杂的工作,在开始之前最好先大致浏览ENC28J60的使用手册。
除此之外,需要认真阅读TCP IP相关知识,推荐一本图书《嵌入式Internet TCP/IP基础、实现和应用》。
嵌入式开发是一个反复借鉴的过程,该部分代码参考了AVRNET项目和奋斗开发板的相关范例。
【AVRNET项目网址链接】虽然AVRNET项目所使用的MCU为ATmega32,但是认真阅读源代码之后也可以方便的移植到其他的MCU平台,例如STM8、STM32和MSP430等。
ENC28J60的AVR单片机接口设计与网络通信编程

ENC28J60的AVR单片机接口设计与网络通信编程作者:黄维铭来源:《数字化用户》2013年第13期本文介绍了带有行业标准串行外设接口(Serial Peripheral Interface,SPI)的独立以太网控制器ENC28J60 在AVR单片机接口开发设计中的应用,以及单片机控制ENC28J60的程序及计算机与ENC28J60进行网络通信的有关程序设计段。
一、概述带SPI接口的ENC28J60由七个主要功能模块组成:1. SPI 接口:充当主控制器和ENC28J60 之间通信通道;2. 控制寄存器:用于控制和监视ENC28J60;3. 双端口RAM缓冲器:用于接收和发送数据包;4. 判优器:当DMA、发送和接收模块发出请求时对RAM 缓冲器的访问进行控制;5. 总线接口:对通过SPI 接收的数据和命令进行解析;6. MAC (Medium Access Control)模块:实现符合IEEE 802.3 标准的MAC 逻辑;7. PHY(物理层)模块——对双绞线上的模拟数据进行编码和译码。
该器件还包括其他支持模块,诸如振荡器、片内稳压器、电平变换器(提供可以接受5V 电压的I/O 引脚)和系统控制逻辑。
二、器件结构接口示意框图ENC28J60 中所有的存储器都是以静态RAM 的方式实现的。
ENC28J60 中有三种类型的存储器:控制寄存器、以太网缓冲器和PHY寄存器,控制寄存器类存储器包含控制寄存器(Control Register,CR)。
它们用于进行ENC28J60 的配置、控制和状态获取。
可以通过SPI 接口直接读写这些控制寄存器。
PHY 寄存器用于进行PHY 模块的配置、控制和状态获取。
PHY 寄存器用于进行PHY 模块的配置、控制和状态获取。
不可以通过SPI 接口直接访问这些寄存器,只可通过MAC 中的MII (Media Independent Interface)访问这些寄存器。
基于ENC28J60以太网通信接口的设计与实现

O前言
在嵌入式系统的开发中,比较常用的独立以太网控 制器都是为个人计算机系统而设计的,如RTL8019As、 cs8900A等,这些器件不仅结构复杂、体积大,而且价 格相对昂贵。目前市场上大部分以太网控制器封装的 引脚数目庞大,RTL8019As、cs8900A均为100脚。 ENc28J60是美国微芯科技公司近期推出的28引脚独 立以太网控制器,兼容IEEE802.3协议,与微控制器 的连接采用最高速度可达10 MB/s的业界标准sPI接 口,既能提供以太网通信的相应功能,又可以大大简化 设计、减小空间、降低成本。
TcP/IP参考模型
Mjcrochip协议栈
匿
图2 Microchip TcP/IP协议栈
2.3以太网通信实现
ENC28J60和PIcl8F4550通过sPI连接来进行通 信日141,PIcl8F4550对ENc28J60的各种操作均通过sPI 接口进行,包括寄存器的设置,数据的发送和接收。 PICl8F4550的sPI工作在主动方式,即ENc28J60的 sPI时钟信号由PIcl8F4550提供,sPI通信速率设置 成5 MB/s。要实现以太网通信首先要设置ENc28J60 的MAc地址与IP地址、子网掩码以及网关等,这些参 数可以用宏定义放在单片机ROM里,也可以以数据 的方式放在单片机的E2PROM里。在协议栈中, “StackTask”和“ARPTask”函数实现ARP和ICMP协 议,这两个函数作为必要的任务驻留在无限循环的函 数里。设定好ENc28J60的IP地址后,PC机可以通过 ping该IP地址的方式来查看通信接口的ARP协议和 IcMP协议是否正常。
基于Micmchip TcP/IP协议栈uDP和TcP协议 的应用程序需要用户根据不同的应用进行编程,本研 究实现了一个基于uDP的应用程序,通过ss=uD—
浅析ENC28J60模块在单片机以太网通信中重置问题

浅析ENC28J60模块在单片机以太网通信中重置问题作者:杨金石来源:《科学与财富》2015年第29期摘要:针对ENC28J60模块稳定性问题,采用周期重置的方式来提高其连续运行的稳定性;结合网络状态实时监测,对周期重置方式进行改进,改善了系统联网的质量。
关键词:ENC28J60 单片机稳定性一、引言单片机系统作为自动化控制的一个核心部件,随着其应用范围的不断扩大,不同单片机控制系统之间数据交互的需求也在不断的增加。
传统的单片机之间通信一般是采用RS232串口来实现,该标准典型的传输速率只有9600bps,同时其传输距离也非常有限,很难适应不断发生的应用需求。
相比于串口通信,以太网通信无论是通信速率还是通信距离都有很大的提升;美国微芯公司在2005年推出的ENC28J60是一个能够用于单片机以太网接入的集成电路芯片,该芯片采用28引脚的封装,自带SPI接口能够与带有该类型接口的单片机直接进行高速的数据交互。
通过这种方式,可以将单片机控制系统接入到以太网中实现远程高速的数据通信。
然而,在实际的工程实践过程中,在诸如数据通信量过大、系统工作时间太长等因素的影响下,容易导致ENC28J60通信模块无法正常进行数据通信,影响了单片机系统正常功能的发挥。
在排除单片机系统自身控制程序问题的前提下,笔者尝试通过以下方式来对该问题进行解决。
二、对ENC28J60模块进行周期重置该方法设计思路非常简单,就是在单片机中启动一个定时计数器,通过对定时计数器相关寄存器的初始化和单片机控制程序设计,得到一个符合系统需求的ENC28J60模块重置周期,在周期到来后,由单片机系统通过SPI接口向ENC28J60模块发送重置指令,实现对该模块的周期重置。
通过测试,发现在该方式下系统能够在连续工作数小时(12小时以上)后,仍能进行数据通信。
但是进一步的测试发现,该方式下,会出现较频繁的数据丢包现象。
通过分析,发现导致丢包的原因是在ENC28J60模块进行数据接收或者是发送过程中,该模块设定的重置周期到了,此时,由定时计数器产生的中断将使单片机由数据收发流程直接跳转到中断服务程序,进行ENC28J60模块重置工作;该模块重置后,ENC28J60的接收和发送缓存将被清空,虽然单片机控制程序返回到数据接收/发送程序,但是重置时正在接收或发送的数据包已经被清除,从而导致丢包。
ENC28J60_cn中文手册

2
20
3
19
4 ENC28J60 18
5
17
6
16
7
15
8 9 1011121314
VDDOSC
OSC2 OSC1 VSSOSC VSSPLL VDDPLL VDDRX
2006 Microchip Technology Inc.
高级信息
DS39662A_CN 第 1 页
ENC28J60
目录
1.0 概述 ... 2.0 外部连接 ... 3.0 存储器构成 ... 4.0 串行外设接口 (SPI) ... 5.0 以太网概述 ... 6.0 初始化 ... 7.0 发送和接收数据包 ... 8.0 接收过滤器 ... 9.0 双工模式配置和协商 ... 10.0 流量控制 ... 11.0 复位 ... 12.0 中断 ... 13.0 直接存储器访问控制器 ... 14.0 掉电 ... 15.0 内置自测试控制器 ... 16.0 电气特性 ... 17.0 封装信息 ... 索引 ... 客户支持 ... 系统信息和升级热线 ... 读者反馈表 ... 产品标识体系 ...
... 3 .. 5 .. 11 . 25 .. 31 . 33 . 39 .. 47 ... 53 ... 55 . 59 . 65 .. 75 . 77 . 79 ... 83 ... 89 .. 95 . 97 . 97 ... 98 .. 99
致客户
我们旨在提供᳔佳文档供客户正确使用 Microchip 产品。为此,我们将不断改进出版物的内容和质量,使之更好地满足您的要求。 出版 物的质量将随新文档及更新版本的推出而得到提升。 如果您对本出版物有任何问题和建议,请通过电子邮件联系我公司 TRC 经理,电子邮件地址为 CTRC@,或将本 数据手册 后附的 《读者反馈表》传真到 86-21-5407 5066。我们期待您的反馈。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。
M3的世界,与野火同行,乐意惬无边。
另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。
内容上会给你带来更多的惊喜。
是一本学习STM32必备的工具书。
敬请期待!7、以太网(ENC28J60)7.1 实验描述及工程文件清单实验描述在浏览器上创建一个web服务器,通过web里面的命令来控制开发板上的LED的亮灭。
应用->1:在PC机的DOS界面输入: ping 192.168.1.15 ,看能否ping通。
2:在IE浏览器中输入:http://192.168.1.15/123456 则会出现一个网页,通过网页中的命令可以控制开发板中的LED的亮灭。
硬件连接PE4 :ENC28J60-INTPA6-SPI1-MISO :ENC28J60-SOPA7-SPI1-MOSI :ENC28J60-SIPA5-SPI1-SCK :ENC28J60-SCKPA4-SPI1-NSS :ENC28J60-CSPE1 :ENC28J60-RST用到的库文件startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_spi.c用户编写的文件USER/main.cUSER/stm32f10x_it.cUSER/led.cUSER/usart.cUSER/spi_enc28j60.cUSER/enc28j60.cUSER/ip_arp_udp_tcp.cUSER/web_server.c野火STM32开发板中10M以太网ENC28J60的硬件原理图7.2 ENC28J60简介ENC28J60是带有行业标准串行外设接口(SerialPeripheral Interface,SPI)的独立以太网控制器。
它可作为任何配备有 SPI 的控制器的以太网接口。
ENC28J60 符合 IEEE 802.3 的全部规范,采用了一系列包过滤机制以对传入数据包进行限制。
它还提供了一个内部 DMA 模块,以实现快速数据吞吐和硬件支持的IP校验和计算。
与主控制器的通信通过两个中断引脚和SPI 实现,数据传输速率高达 10 Mb/s。
两个专用的引脚用于连接 LED,进行网络活动状态指示。
下图所示为ENC28J60的简化框图。
图 1-2所示为使用该器件的典型应用电路。
要将单片机连接到速率为10 Mbps 的以太网,只需 ENC28J60、两个脉冲变压器和一些无源元件即可。
本开发板中用的网络变压器的型号为911105A。
ENC28J60由七个主要功能模块组成:1. SPI 接口——充当主控制器和ENC28J60 之间通信通道。
2. 控制寄存器——用于控制和监视 ENC28J60。
3. 双端口RAM缓冲器——用于接收和发送数据包。
4. 判优器——当DMA、发送和接收模块发出请求时对 RAM 缓冲器的访问进行控制。
5. 总线接口——对通过SPI 接收的数据和命令进行解析。
6. MAC (Medium Access Control)模块——实现符合 IEEE 802.3 标准的 MAC 逻辑。
7. PHY(物理层)模块——对双绞线上的模拟数据进行编码和译码。
该器件还包括其他支持模块,诸如振荡器、片内稳压器、电平变换器(提供可以接受 5V 电压的 I/O 引脚)和系统控制逻辑。
7.3 实验讲解建议阅读程序的顺序为:spi_enc28j60.c -> enc28j60.c ->ip_arp_udp_tcp.c ->web_server.c 。
spi_enc28j60.c :ENC28J60(以太网芯片) SPI接口应用函数库。
enc28j60.c : Microchip ENC28J60 Ethernet Interface Driver。
ip_arp_udp_tcp.c:IP, Arp, UDP and TCP functions(这部分野火仍在学习)。
web_server.c:web服务程序应用函数库。
其中enc28j60.c 、ip_arp_udp_tcp.c web_server.c是从国外的一个开源项目里面移植过来的,源文件基本上没有做修改。
spi_enc28j60.c是由我们用户实现的底层函数接口,还有我们修改了web_server.c这个文件中网页命令控制部分的服务程序。
在配置好需要用的库文件之后,下面我们从main函数开始讲解,有关库函数是如何添加的情参考前面的教程,这里不再赘述。
1./*2. * 函数名:main3. * 描述:主函数4. * 输入:无5. * 输出:无6. */7.int main (void)8.{9./* 配置系统时钟为72M */10. SystemInit();11.12./* 配置 LED */13. LED_GPIO_Config();14.15./* ENC28J60 SPI 接口初始化 */16. SPI_Enc28j60_Init();17.18./* ENC28J60 WEB 服务程序 */19. Web_Server();20.21.//return 0;22.}在进入main函数代码段后,我们首先调用系统库函数SystemInit();将我们的系统时钟配置为72MHZ,如果用的是3.5.0版本的库则不需要,因为已在启动文件里面调用了。
LED_GPIO_Config();用于初始化LED,因为我们我们在我们的web服务器中要控制的就是LED,所以在这里要先把LED配置好,好让它接下来能工作。
SPI_Enc28j60_Init();用于配置以太网芯片ENC28J60所用到的数据通信口SPI2和其他控制I/O。
这是我们用户在spi_enc28j60.c中实现的底层程序。
1./*2. * 函数名:SPI1_Init3. * 描述:ENC28J60 SPI 接口初始化4. * 输入:无5. * 输出:无6. * 返回:无7. */8.void SPI_Enc28j60_Init(void)9.{10. GPIO_InitTypeDef GPIO_InitStructure;11. SPI_InitTypeDef SPI_InitStructure;12.13./* 使能 SPI1 时钟 */14. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1,ENABLE);15.16./*17. * PA5-SPI1-SCK :ENC28J60_SCK18. * PA6-SPI1-MISO:ENC28J60_SO19. * PA7-SPI1-MOSI:ENC28J60_SI20. */21. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;22. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;23. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用输出24. GPIO_Init(GPIOA, &GPIO_InitStructure);25.26./* PA4-SPI1-NSS:ENC28J60_CS */// 片选27.28. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;29. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;30. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推免输出31. GPIO_Init(GPIOA, &GPIO_InitStructure);32. GPIO_SetBits(GPIOA, GPIO_Pin_4);33.34./* PB13:ENC28J60_INT */// 中断引脚没用到35./* PE1:ENC28J60_RST*/// 复位似乎不用也可以36.37.38./* SPI1 配置 */39. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;40. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;41. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;42. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;43. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;44. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;45. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;46. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;47. SPI_InitStructure.SPI_CRCPolynomial = 7;48. SPI_Init(SPI1, &SPI_InitStructure);49.50./* 使能 SPI1 */51. SPI_Cmd(SPI1, ENABLE);52.}在这个函数中不知大家有没注意到没有这两条注释:1./* PB13:ENC28J60_INT */// 中断引脚没用到2.3./* PE1:ENC28J60_RST*/// 复位似乎不用也可以enc28j60的中断引脚没用到很正常,但是复位引脚也没用到,这我就很纳闷了。
我想原因可能是enc28j60有个上电自动复位的功能,这里它的复位引脚只能暂时没有用到而已,也或许是我们的开发板中引脚PE1(接enc28j60的复位脚)收到什么信号的干扰,产生了类似复位的信号。