您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > 零死角玩转stm32-高级篇7、以太网(ENC28J60)
-第2页-0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。M3的世界,与野火同行,乐意惬无边。另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。内容上会给你带来更多的惊喜。是一本学习STM32必备的工具书。敬请期待!-第3页-7、以太网(ENC28J60)7.1实验描述及工程文件清单实验描述在浏览器上创建一个web服务器,通过web里面的命令来控制开发板上的LED的亮灭。应用-1:在PC机的DOS界面输入:ping192.168.1.15,看能否ping通。2:在IE浏览器中输入:则会出现一个网页,通过网页中的命令可以控制开发板中的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.c-第4页-USER/led.cUSER/usart.cUSER/spi_enc28j60.cUSER/enc28j60.cUSER/ip_arp_udp_tcp.cUSER/web_server.c野火STM32开发板中10M以太网ENC28J60的硬件原理图-第5页-7.2ENC28J60简介ENC28J60是带有行业标准串行外设接口(SerialPeripheralInterface,SPI)的独立以太网控制器。它可作为任何配备有SPI的控制器的以太网接口。ENC28J60符合IEEE802.3的全部规范,采用了一系列包过滤机制以对传入数据包进行限制。它还提供了一个内部DMA模块,以实现快速数据吞吐和硬件支持的IP校验和计算。与主控制器的通信通过两个中断引脚和SPI实现,数据传输速率高达10Mb/s。两个专用的引脚用于连接LED,进行网络活动状态指示。下图所示为ENC28J60的简化框图。图1-2所示为使用该器件的典型应用电路。要将单片机连接到速率为10Mbps的以太网,只需ENC28J60、两个脉冲变压器和一些无源元件即可。本开发板中用的网络变压器的型号为911105A。-第6页-ENC28J60由七个主要功能模块组成:1.SPI接口——充当主控制器和ENC28J60之间通信通道。2.控制寄存器——用于控制和监视ENC28J60。3.双端口RAM缓冲器——用于接收和发送数据包。4.判优器——当DMA、发送和接收模块发出请求时对RAM缓冲器的访问进行控制。5.总线接口——对通过SPI接收的数据和命令进行解析。6.MAC(MediumAccessControl)模块——实现符合IEEE802.3标准的MAC逻辑。7.PHY(物理层)模块——对双绞线上的模拟数据进行编码和译码。该器件还包括其他支持模块,诸如振荡器、片内稳压器、电平变换器(提供可以接受5V电压的I/O引脚)和系统控制逻辑。-第7页-7.3实验讲解建议阅读程序的顺序为:spi_enc28j60.c-enc28j60.c-ip_arp_udp_tcp.c-web_server.c。spi_enc28j60.c:ENC28J60(以太网芯片)SPI接口应用函数库。enc28j60.c:MicrochipENC28J60EthernetInterfaceDriver。ip_arp_udp_tcp.c:IP,Arp,UDPandTCPfunctions(这部分野火仍在学习)。web_server.c:web服务程序应用函数库。其中enc28j60.c、ip_arp_udp_tcp.cweb_server.c是从国外的一个开源项目里面移植过来的,源文件基本上没有做修改。spi_enc28j60.c是由我们用户实现的底层函数接口,还有我们修改了web_server.c这个文件中网页命令控制部分的服务程序。在配置好需要用的库文件之后,下面我们从main函数开始讲解,有关库函数是如何添加的情参考前面的教程,这里不再赘述。1./*2.*函数名:main3.*描述:主函数4.*输入:无5.*输出:无6.*/7.intmain(void)8.{9./*配置系统时钟为72M*/10.SystemInit();11.12./*配置LED*/13.LED_GPIO_Config();14.15./*ENC28J60SPI接口初始化*/16.SPI_Enc28j60_Init();17.18./*ENC28J60WEB服务程序*/19.Web_Server();20.21.//return0;22.}在进入main函数代码段后,我们首先调用系统库函数SystemInit();将我们的系统时钟配置为72MHZ,如果用的是3.5.0版本的库则不需要,因为已在启动文件里面调用了。-第8页-LED_GPIO_Config();用于初始化LED,因为我们我们在我们的web服务器中要控制的就是LED,所以在这里要先把LED配置好,好让它接下来能工作。SPI_Enc28j60_Init();用于配置以太网芯片ENC28J60所用到的数据通信口SPI2和其他控制I/O。这是我们用户在spi_enc28j60.c中实现的底层程序。1./*2.*函数名:SPI1_Init3.*描述:ENC28J60SPI接口初始化4.*输入:无5.*输出:无6.*返回:无7.*/8.voidSPI_Enc28j60_Init(void)9.{10.GPIO_InitTypeDefGPIO_InitStructure;11.SPI_InitTypeDefSPI_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*/-第9页-51.SPI_Cmd(SPI1,ENABLE);52.}在这个函数中不知大家有没注意到没有这两条注释:1./*PB13:ENC28J60_INT*///中断引脚没用到2.3./*PE1:ENC28J60_RST*///复位似乎不用也可以enc28j60的中断引脚没用到很正常,但是复位引脚也没用到,这我就很纳闷了。我想原因可能是enc28j60有个上电自动复位的功能,这里它的复位引脚只能暂时没有用到而已,也或许是我们的开发板中引脚PE1(接enc28j60的复位脚)收到什么信号的干扰,产生了类似复位的信号。这里我们先把这问题搁一边先,毕竟程序还是工作了。至于具体的原因我以后有时间再深究下。Web_Server();函数实现的功能是创建一个网页服务器,在这个网页服务器上我可以点击我们设定好的命令按钮来控制我们开发板上LED的亮灭。其实,从这里面我们就可以看到有点智能家居的味道了,所谓智能家居就是通过网络来控制我们家电的状态,如开和断。举个例子:我们可以在遥远的地方可以通过网络来控制家里的电视、电冰箱等,是不是很神奇哩?只要你学会了这个实验,再经过自己的再深入学习,这些都是小菜一碟。^_^,本实验旨在引导大家入门。Web_Server();在web_server.c中实现。在web_server.c的开头包含了头文件:1.#includeenc28j60.h2.#includeip_arp_udp_tcp.h3.#includenet.henc28j60.h:MicrochipENC28J60EthernetInterfaceDriverHeaderfileip_arp_udp_tcp.h:IP,Arp,UDPandTCPfunctionsHeaderfile.FormoreInfermationPleaseSee:Basedonthenet.hfilefromtheAVRliblibrarybyPascalStang.ForAVRlibSee第10页-有关这三个头文件对应的C文件的功能,请大家阅读源码。接下来我们具体看看Web_Server();这个函数具体做了什么,由于这个函数的源码较多,
本文标题:零死角玩转stm32-高级篇7、以太网(ENC28J60)
链接地址:https://www.777doc.com/doc-6329704 .html