alientek ministm32开发板9增值应用an enc28j60网络模块使用_第1页
alientek ministm32开发板9增值应用an enc28j60网络模块使用_第2页
alientek ministm32开发板9增值应用an enc28j60网络模块使用_第3页
alientek ministm32开发板9增值应用an enc28j60网络模块使用_第4页
alientek ministm32开发板9增值应用an enc28j60网络模块使用_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MiniSTM32开发板上使用ALIENTEKENC28J60网络模块。使用ALIENTEKENC28J60网络模块和uIP1.0实现:TCP服务器、TCP端以及WEB服务器等三个功能。2341、ENC28J60以及uIP简本实验(ALIENTEKMINISTM3221)ENC28J60以太网控制器和uIP1.0以太网协议栈。接下来分别介绍这两个部分。ENC28J60是带有行业标准串行外设接口(SerialPeripheralInterface,SPI)的独立以太SPI的控制器的以太网接口。ENC28J60IEEE802.3的引脚和SPI实现,数据传输速率高达10Mb/s。两个的引脚用于连接LED,进行网络活8K数据接收和发送双端口MAC(MediumAccessControl)IEEE802.3标准的MACENC28J60还包括其他支持模块,诸如振荡器、片内稳压器、电平变换器(提供可以接受5V电压的I/O引脚)和系统控制逻辑。利用该模块,基本上只要是个单片机,就可以实现以太网连接。ALIENTEKENC28J60网络模块原理图如图1.1.3所示:SCK、MOSI、INT、CSV3.3GNDV3.3用于给模块供电,MISO/MOSI/SCKSPI通信,CS是片选信号,INT为中断输出引脚,RST为模块复位信号。uIPuIP由瑞典计算机科学学院(网络嵌入式系统小组)AdamDunkels开发。其源代码由C语言编写,并完全公开,uIP的版本是1.0版本,本指南移植和使用的版本正是此版uIP协议栈去掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保留了网络通客户端),net服务器,DNS主机名解析程序等。通用性强,移植起来基本不uIP8位微控制器都使用过uIP协议栈,而应用uIP相当于一个代码库,通过一系列的函数实现与底层硬件和应用程序的通讯,对于整个系统来说它内部的协议组是透明的,从而增加了协议的通用性。uIP协议栈与系统底层和应用之间的关系如图1.2.1所示:应用应用

uIP 系统定网卡系统定网卡驱从上图可以看出,uIP协议栈主要提供2个函数供系统底层调用:uip_input当网卡驱动收到一个输入包时,将放入全局缓冲区uip_buf中,包的大小由全局变量uip_len约束。同时将调用uip_input()函数,这个函数将会根据包首部的协议处理这个包和需要时调用应用程序。当uip_input()返回时,一个输出包同样放在全局缓冲区uip_buf里,uIP周期计时是用于驱动所有的uIP内部时钟。当周期计时激发,每一个TCP连接都会调用uIPuip_periodic()uip_input()函数。uip_periodic()函数返回时,输出的IP包要放到uip_buf中,供底层系统查询uip_len的大小发送。由于使用TCP/IP的应用场景很多,因此应用程序作为单独的模块由用户实现。uIP协C的宏命令实现的,主uIPUIP_APPCALL()。这样,uIP在接受到底层传来的数uIPuip.h中定义,为了减少函数调用造成的额外支出,大部分接口函数以宏命令实现的,uIP提供的接口函数有:1,初始化uIP协议栈:uip_init()其中apps文件夹里面是uip提供的各种参考代码,本实验,我们主要有用到里面的webserver部分。doc文件夹里面是一些uip的使用及说明文件,是学习uip的资料。lib于初始化网卡(也就是我们的ENC28J60),通过这个函数实现网卡初始化。其次,是据长度返回给uip_lentapdev_send函数,该函数用于向网卡发送一包数据,将全第二步,因为uIP协议栈需要使用时钟,为TCP和ARP的定时器服务,因此我们需要STM3210ms计时(假设clock-arch.h里面的CLOCK_CONF_SECOND100)clock-arch.cclock_timeuIP使uip-conf.hTCP最大连接数、TCP监听端口数、CPU大小端模式等,这个大家根据自己需要配置即可。该函数是我们使用uIP最关键的部分,它是uIP和应用程序的接口,须根据uIP提那么还需要实现UIP_UDP_APPCALL回调函数。这个和电脑上网差不多,只不过我们这里是通过uip_ipaddr、uip_sethostaddr、uip_setdraddruip_setnetmask等函数实现。uIP根据你设定的不同端口,实现不同的服务,比如我们实现WebServer就监的APPCALL函数处理。根据自己的需要设置不同的端口。不过uIP有本地端口最后,uIP通过uip_polling函数轮询处理uIP。该函数必须插入到用户的主循2、硬件连接本实验功能简介:开机检测ENC28J60,如果检测不成功,则提示报错。在成功检测1200端口,并尝试连接1400端口,80端口用于实现WEBServer功能,1200端口用于实现TCPServer功能,连接1400端口实现TCP功能。此时,我们在电脑浏览器输入,就可以登录到一个界面,该界面可以控制开发板上两个LED灯的亮灭,还会显示开发板的当前时间以及开发板STM32的温度(每10秒自动刷新一端口为1400;做TCP时,设置IP地址为:6,端口为1200)同开发板端发送数据到电脑的TCP端。按KEY1,则由开发板的TCP端发送数据到电脑的TCPServer端。LCD显示当前连接状态。ALIENTEKENC28J60网络模块同ALIENTEKMiniSTM32开发板的ALIENTEKENC28J60网络模块的接口,我们通过杜邦线连接网络模块和开发板的相应端口,连接关系如表2.1所示:网络模块与开发板连接关系ENC28J60络模MiniSTM32开发3、软件实现uIP1.0uIP-APPuIPtimer.c这里我们改为timerx.c和timerx.h,我们还需要实现ENC28J60的驱动代码,存放在HARDWARE文件夹下的ENC28J60文件夹里面。详细的步骤我们就不一一阐述了,全部改好之后,工程如图3.1所示:3.1移植完后,MDKuIP-1.0uIPuIP-APP里面的代码则部分是我们自己实现的,部分是uIP提供的,其中:tapdev.c,同样是uIP提供,用来实现uIP与网卡的接口,该文件实现tapdev_init、tapdev_read和tapdev_send三个重要函数。tcp_demo.c,完成UIP_APPCALLtcp_demo_appcall函数。该函数根据端口的不同,分别调用不同的appcall函数,实现不同功能。同时该文件还实现了uip_logtcp_server_demo.cTCPTCP我们通过修改部分代码,实现一个简单的WEB服务器。constu8 //MAC地u8tapdev_init(void){u8 for(i=0;i<6;//PHLCON:PHYLEDreturn} uint16_t{ }void{}tapdev_initENC28J60,初始化工作主要通过调用ENC28J60_Init函数实现,该函数在enc28j60.c里面实现,同时该函数还用于设LED控制器工作方式,即完成对ENC28J60的全部初始化工作。该函数的返回值用于判断uip_len里面的tapdev_send函数,该函数调用ENC28J60_Packet_Send函数,实现从网卡(ENC28J60)发送一包数据到网络,数据内容存放在uip_buf,数据长度为uip_len。void{{)和HTTPcasecasecase} 1400{case }}该函数即UIP_APPCALLuIP同应用程序的接口函数,该函数通过端选择不同的appcall函数,实现不同的服务。其中80端口用于实现WEB服务,通过调用实现;1400是端口,用于实现TCP客户端,调用tcp__demo_appcall函数实现。void{structhttpd_state*s=(structhttpd_state*)&(uip_conn-()()void{structhttpd_state*s=(structhttpd_state*)&(uip_conn-()(){PSOCK_INIT(&s->sin,s->inputbuf,sizeof(s->inputbuf)-1);PSOCK_INIT(&s->sout,s->inputbuf,sizeof(s->inputbuf)-1);s->state= timer_set(&s->timer,CLOCK_SECOND*100);*/s->timer=0;}else{{if(s->timer>=20)uip_abort();elses->timer=0;}}else}{ //处理http}handle_inputhttphandle_outputhttp网页输出。对我们来说最重要的是handle_input函数,handle_input函数代码如下:externvoidget_time(u8 constu8*LED0_ON_PIC_ADDR="http //LED0亮,图标地址constu8*LED1_ON_PIC_ADDR="http //LED1亮,图标地址constu8*LED_OFF_PIC_ADDR="http //LED灭,图标地址{char*strx; //"== {{if(strx)//存在"LED0状态"这个字符串{if(LED0)//LED0灭{strncpy(strx+7,"5B5B5B",6);//灰色 strx=strstr((constchar*)strx,"http:");//找到"http:"字符串strncpy(strx,(constchar*)LED_OFF_PIC_ADDR,strlen((constchar*)LED_OFF_PIC_ADDR));//LED0灭{strncpy(strx+7,"FF0000",6);//红色 strx=strstr((constchar*)strx,"http:");//找到"http:"字符串char*)LED0_ON_PIC_ADDR));//LED0亮}}{if(strx)//存在"LED1状态"这个字符串{if(LED1)//LED1灭{strncpy(strx+24,"灭",2);//灭strx=strstr((constchar*)strx,"http:");//找到"http:"字符串strncpy(strx,(constchar*)LED_OFF_PIC_ADDR,strlen((constchar*)LED_OFF_PIC_ADDR));//LED1灭{strncpy(strx+7,"00FF00",6绿色strncpy(strx+24,"亮",2);//"亮"strx=strstr((constchar*)strx,"http:");//找到"http:"字符串char*)LED1_ON_PIC_ADDR));//LED1亮}}}strx=strstr((constchar*)(data_index_html+13),"℃");//找到"℃"字符{ }{;//}{s->inputbuf[PSOCK_DATALEN(&s->sin)-1]=0;}{PSOCK_READTO(&s->sin,ISO_nl);if(strncmp(s->inputbuf,http_referer,8)==0){}}}作的时候,浏览器就会发送消息给WEB服务器,服务器根据收到的消息内容,判断用户所实现的WEB服界面如图3.2所示:控制DS0,DS1Get方法(科普找将请求参数放到URL里面,然后WEB服务器根据URL的参数来相STM32URLDS0DS1的亮灭。uIPGet请求后判断URLdata_index_html里面的部STM32温度和RTC时间是通过刷新实现的,uIP每次得到来自浏览器的请求就会data_index_htmldata_index_html发送给浏览器,这里面加入了自动刷新的控制代码,每10秒钟刷新一次,这样就不需要手动刷新了。sram数据,data_index_html里面的数据,则是通过一个工具软件:amo的编程小工具集合V1.2.6.exe,将网页源码转换而来,该软件在TCP服务器appcall函数:tcp_server_demo_appcallu8u8u8u8 void{structtcp_demo_appstate*s=(structtcp_demo_appstate*)&uip_conn->appstate; if(uip_connected())tcp_server_connected();//连接成功 ({{if(uip_len>199)((u8*)uip_appdata)[199]=0;}{}{}}该函数通过将需要发送的数据通过tcp_server_senddata函数发送出去。u8u8u8u8 void {_connected();//if{ {if(uip_len>199)((u8*)uip_appdata)[199]=0; }}else { s->textlen=strlen((constchar*)tcp_ }{ }}时候,将需要发送的数据通过tcp__senddata函数发送出去。uIPclock-archclock_timetimerx.c里面初始化6clock_time10ms1,这里代码就不贴出来了,请大家查看光盘源码(ALIENTEKMiniSTM32扩展实验21)。#defineBUF((structuip_eth_hdr*)&uip_buf[0])intmain(void){u8key;u8u8tcp_server_tsta=0XFF;u8tcp__tsta=0XFF;uip_ipaddr_tipaddr; //串口初始化为9600 //初始化ADC //初始化USMART LCD_ShowString(60,10,200,16,16,"MiniSTM32");LCD_ShowString(60,30,200,16,16,"ENC28J60TEST"); {LCD_ShowString(60,70,200,16,16,"ENC28J60InitErrordelay_ms(200); //uIP初始化LCD_ShowString(60,70,200,16,16,"KEY0:ServerSendMsg"); SendMsg");LCD_ShowString(30,200,200,16,16,"TCPRX:");LCD_ShowString(30,220,200,16,16,"TCPTX:");LCD_ShowString(30,270,200,16,16,"TCPRX:");LCD_ShowString(30,290,200,16,16,"TCPTX:");uip_ipaddr(ipaddr192,168,1,1);//IP地址(IP地址) 80端口,用于WebServer while(1){ if(tcp_server_tsta!=tcp_server_sta)//TCPServer状态改变{ elseLCD_ShowString(30,180,200,16,16,"TCPServerDisconnected"); { printf("TCPServerRX:%s\r\n",tcp_server_databuf);//打印数据 }}if(key==1KEY0按下,TCPServer{ {sprintf((char*)tcp_server_databuf,"TCPServerOK%d\r\n" }} { elseLCD_ShowString(30,250,200,16,16,"TCP { } } { { OK%d\r\n" }}}} voiduip_polling(void){u8staticstructtimerperiodic_timer,arp_timer;staticu8timer_ok=0;{timer_ok= }();// {//处理IP数据包(只有校验通过的IP { //uip_buf,uip_len(2个全局变量){}{//需要发送的数据在uip_buf,长度是uip_len(2个全局变量)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论