1、http:/192.168.1.15/123456 则会出 现一个网页,通过网页中的命令可以控制开发板中的 LED 的 亮灭。硬件连接硬件连接 PE4 :ENC28J60-INT PA6-SPI1-MISO :ENC28J60-SO PA7-SPI1-MOSI :ENC28J60-SI PA5-SPI1-SCK :ENC28J60-SCK PA4-SPI1-NSS :ENC28J60-CS PE1 :ENC28J60-RST 用到的库文件用到的库文件 startup/start_stm32f10 x_hd.c CMSIS/core_cm3.c CMSIS/system_stm32f10 x.c
2、 FWlib/stm32f10 x_gpio.c FWlib/stm32f10 x_rcc.c FWlib/stm32f10 x_usart.c FWlib/stm32f10 x_spi.c 用户编写的文件用户编写的文件 USER/main.c USER/stm32f10 x_it.c -第 4 页-USER/led.c USER/usart.c USER/spi_enc28j60.c USER/enc28j60.c USER/ip_arp_udp_tcp.c USER/web_server.c 野火 STM32 开发板中 10M 以太网 ENC28J60 的硬件原理图 -第 5 页-7.2
3、ENC28J60 简介简介 ENC28J60 是带有行业标准串行外设接口(SerialPeripheral Interface,SPI)的独立以太网控制器。它可作为任何配备有 SPI 的控制器的以太网接口。ENC28J60 符合 IEEE 802.3 的全部规范,采用了一系列包过滤机制以对传入数据包进行限制。它还提供了一个内部 DMA 模块,以实现快速数据吞吐和硬件支持的 IP 校验和计算。与主控制器的通信通过两个中断引脚和 SPI 实现,数据传输速率高达 10 Mb/s。两个专用的引脚用于连接 LED,进行网络活动状态指示。下图所示为 ENC28J60 的简化框图。图 1-2 所示为使用该器
4、件的典型应用电路。要将单片机连接到速率为 10 Mbps 的以太网,只需 ENC28J60、两个脉冲变压器和一些无源元件即可。本开发板中用的网络变压器的型号为 911105A。-第 6 页-ENC28J60 由七个主要功能模块组成:1.SPI 接口充当主控制器和 ENC28J60 之间通信通道。2.控制寄存器用于控制和监视 ENC28J60。3.双端口 RAM 缓冲器用于接收和发送数据包。4.判优器当 DMA、发送和接收模块发出请求时对 RAM 缓冲器的访问进 行控制。5.总线接口对通过 SPI 接收的数据和命令进行解析。6.MAC(Medium Access Control)模块实现符合 I
5、EEE 802.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 :Microchip ENC28J60 Ethernet Interface Driver。ip
6、_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.*函数名:
7、main 3.*描述 :主函数 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,如果
8、用的是 3.5.0 版本的库则不需要,因为已在启动文件里面调用了。-第 8 页-LED_GPIO_Config();用于初始化 LED,因为我们我们在我们的 web 服务器中要控制的就是 LED,所以在这里要先把 LED 配置好,好让它接下来能工作。SPI_Enc28j60_Init();用于配置以太网芯片 ENC28J60 所用到的数据通信口SPI2 和其他控制 I/O。这是我们用户在 spi_enc28j60.c 中实现的底层程序。SPI1_Init 3.*描述 :ENC28J60 SPI 接口初始化 4.*输入 :无 6.*返回 :无 7.*/8.void SPI_Enc28j60_In
9、it(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_SCK 18.*PA6-SPI1-MISO:ENC28J60_SO 19.*PA7-SPI1-MOSI:ENC28J60_SI 20.*/21.GPIO_InitStru
10、cture.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
11、_Speed=GPIO_Speed_10MHz;30.GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/推免输出 31.GPIO_Init(GPIOA,&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_InitS
12、tructure.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_InitStructur
13、e.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 的中断引脚没用到很正常,但是复位引脚也没用到,这我就很纳闷了。我想原因可能是 en
14、c28j60 有个上电自动复位的功能,这里它的复位引脚只能暂时没有用到而已,也或许是我们的开发板中引脚 PE1(接 enc28j60 的复位脚)收到什么信号的干扰,产生了类似复位的信号。这里我们先把这问题搁一边先,毕竟程序还是工作了。至于具体的原因我以后有时间再深究下。Web_Server();函数实现的功能是创建一个网页服务器,在这个网页服务器上我可以点击我们设定好的命令按钮来控制我们开发板上 LED 的亮灭。其实,从这里面我们就可以看到有点智能家居的味道了,所谓智能家居就是通过网络来控制我们家电的状态,如开和断。举个例子:我们可以在遥远的地方可以通过网络来控制家里的电视、电冰箱等,是不是很神奇哩?只要你学会了这个实验,再经过自己的再深入学习,这些都是小菜一碟。_,本实验旨在引导大家入门。在 web_server.c 中实现。在 web_server.c 的开头包含了头文件:1.#include enc28j60.h 2.#include ip_arp_udp_tcp.h 3.#include net.h enc28j60.h :Microchip ENC28J60 Ethernet Interface Driver Header file ip_arp_udp_tcp.h:IP,Arp,UDP and
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1