UIP协议在单片机上的移植与实现2_第1页
UIP协议在单片机上的移植与实现2_第2页
UIP协议在单片机上的移植与实现2_第3页
UIP协议在单片机上的移植与实现2_第4页
UIP协议在单片机上的移植与实现2_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

设计总结可以看出,uIP协议栈采用有效的方法和结构化的代码,使其存储器占用量很小并且可以很方便的应用到不同的工程项目中,同时它又是免费的可以自由使用于商业和非商业目的。uIP为低端嵌入式设备的网络接入提供了很好的解决方案,具有很高的应用价值。ENC28J60是极具特色的独立以太网控制器:SPI接口使得小型单片机也能具有网络连接功能;集成MAC和PHY无需其他外设;具有可编程过滤功能,可自动评价、接收或拒收多种信息包,减轻了主控单片机的处理负荷;内部继承可编程的8KB双端口SRAM缓冲器,操作灵活方便。不足之处为仅支持10BASET。这次设计基本实现了所要设计的内容,但是我也看到了设计过程中的不足和出现的问题。例如,在编程时由于所掌握的知识有限,遇到过不少困难,虽然出了不少错误,但我相信自己在以后越来越多的实践中越来越成熟起来。总的来说这次的毕业设计不仅锻炼了我的实战能力,激发了我的创新思维,提高了我发现问题、解决问题的能力,而且培养了我面对挫折并勇于克服的意志、品质和吃苦耐劳的精神,也使我深深的体会到理论结合实际的重要性,体会到即使以后走到工作岗位,仍然要继续努力汲取知识。参考文献[1]李广弟,朱月秀,王秀山.单片机基础[M].北京:北京航空航天大学出版社,2001.7[2]韩志军,沈晋源,望振波.单片机应用系统设计[M].北京:机械工业出版社,2005[3]楼然苗,李光飞.51单片机设计实例[M].北京:北京航空航天大学出版社,2003[4]雷晓平等编.单片机及其应用[M].成都:电子科技大学出版社,2005.6[5]李兰友等编.单片机开发应用十例[M].北京:电子工业出版社,2006.7[6]吴微,文军等编.单片机原理及制作[M].武汉:武汉大学出版社,2004.12[7]靳达.单片机应用系统开发实例导航[M].北京:人民邮电出版社,2003.10[8]周志敏,周纪海等编.LED驱动电路设计与应用[M].北京:人民邮电出版社,2004.8[9]何立民.单片机高级教程[M].北京:北京航空航天大学出版社,2001[10]夏继强.单片机实验与实践教程[M].北京:北京航空航天大学出版社,2001[11]阎石.数字电子技术基础[M].北京:高等教育出版社,2005附录1.ENC28J60与单片机的外部连接图(1)整体连接图(2)MCU部分(3)串口与单片机部分(4)串口与单片机部分(5)电源部分2.重点函数程序(1)USART函数#include"USART.h"#include"STC12C5A#defineBAUD9600//串口初始化voidUSART_Init(){ PCON&=0x7f; //波特率不倍速SMOD=0 SCON=0x50; //8位数据,可变波特率 AUXR|=0x40; //定时器1时钟为Fosc,即1T AUXR&=0xfe; //串口1选择定时器1为波特率发生器 TMOD&=0x0f; //清除定时器1模式位 TMOD|=0x20; //设定定时器1为8位自动重装方式 TL1=0xB2; //设定定时初值 TH1=0xB2; //设定定时器重装值 ET1=0; //禁止定时器1中断 TR1=1; //启动定时器1 ES=1; //开串行中断 EA=1; //开总中断} //发送一个字符,ASCII码voidSendASC(unsignedchard){ SBUF=d; while(!TI); //等待发送完成,TI置位 TI=0;}//发送字符串voidSendString(unsignedchar*str) { while(*str) { SendASC(*str); str++; }}//串口中断服务程序voidUSART_Interrupt(void)interrupt4 //放在这里和放在main()里面一样{ unsignedcharRxData=0; EA=0; if(RI) //必须判断RI(接收中断标志)是否为1{ RI=0; RxData=SBUF; //在这里添加你的接收代码 SendString("Thewordyousendis"); SendASC(RxData); SendASC('\n');} EA=1;}(2)uip_arp函数#include"uip_arp.h"#include<string.h>structarp_hdr{structuip_eth_hdrethhdr;u16_thwtype;u16_tprotocol;u8_thwlen;u8_tprotolen;u16_topcode;structuip_eth_addrshwaddr;u16_tsipaddr[2];structuip_eth_addrdhwaddr;u16_tdipaddr[2];}structethip_hdr{structuip_eth_hdrethhdr;u8_tvhl;tos;len[2];ipid[2];ipoffset[2];ttl;proto;u16_tipchksum;u16_tsrcipaddr[2];destipaddr[2];}#defineARP_REQUEST1#defineARP_REPLY2#defineARP_HWTYPE_ETH1structarp_entry{u16_tipaddr[2];structuip_eth_addrethaddr;u8_ttime;}structuip_eth_addruip_ethaddr={{UIP_ETHADDR0;UIP_ETHADDR1; UIP_ETHADDR2;UIP_ETHADDR3; UIP_ETHADDR4; UIP_ETHADDR5;}}staticstructarp_entryarp_table[UIP_ARPTAB_SIZE];staticu16_tipaddr[2];staticu8_ti,c;staticu8_tarptime;staticu8_ttmpage;#defineBUF((structarp_hdr*)&uip_buf[0])#defineIPBUF((structethip_hdr*)&uip_buf[0])*/Voiduip_arp_init(void){for(i=0;i<UIP_ARPTAB_SIZE;++i){memset(arp_table[i].ipaddr,0,4);}}*/Voiduip_arp_timer(void){structarp_entry*tabptr;++arptime;for(i=0;i<UIP_ARPTAB_SIZE;++i){tabptr=&arp_table[i];if((tabptr->ipaddr[0]|tabptr->ipaddr[1])!=0&&arptime-tabptr->time>=UIP_ARP_MAXAGE){memset(tabptr->ipaddr,0,4);}}}*/staticvoiduip_arp_update(u16_t*ipaddr,structuip_eth_addr*ethaddr){registerstructarp_entry*tabptr;for(i=0;i<UIP_ARPTAB_SIZE;++i){tabptr=&arp_table[i];if(tabptr->ipaddr[0]!=0&&tabptr->ipaddr[1]!=0){if(ipaddr[0]==tabptr->ipaddr[0]&& ipaddr[1]==tabptr->ipaddr[1]){ memcpy(tabptr->ethaddr.addr,ethaddr->addr,6); tabptr->time=arptime; return;}}}for(i=0;i<UIP_ARPTAB_SIZE;++i){tabptr=&arp_table[i];if(tabptr->ipaddr[0]==0&&tabptr->ipaddr[1]==0){break;}}if(i==UIP_ARPTAB_SIZE){tmpage=0;c=0;for(i=0;i<UIP_ARPTAB_SIZE;++i){tabptr=&arp_table[i];if(arptime-tabptr->time>tmpage){ tmpage=arptime-tabptr->time; c=i;}}i=c;}memcpy(tabptr->ipaddr,ipaddr,4);memcpy(tabptr->ethaddr.addr,ethaddr->addr,6);tabptr->time=arptime;}*/Voiduip_arp_ipin(void){uip_len-=sizeof(structuip_eth_hdr);if((IPBUF->srcipaddr[0]&uip_arp_netmask[0])!=(uip_hostaddr[0]&uip_arp_netmask[0])){return;}if((IPBUF->srcipaddr[1]&uip_arp_netmask[1])!=(uip_hostaddr[1]&uip_arp_netmask[1])){return;}uip_arp_update(IPBUF->srcipaddr,&(IPBUF->ethhdr.src));return;}*/Voiduip_arp_arpin(void){if(uip_len<sizeof(structarp_hdr)){uip_len=0;return;}uip_len=0;switch(BUF->opcode){caseHTONS(ARP_REQUEST):if(BUF->dipaddr[0]==uip_hostaddr[0]&&BUF->dipaddr[1]==uip_hostaddr[1]){BUF->opcode=HTONS(2);memcpy(BUF->dhwaddr.addr,BUF->shwaddr.addr,6);memcpy(BUF->shwaddr.addr,uip_ethaddr.addr,6);memcpy(BUF->ethhdr.src.addr,uip_ethaddr.addr,6);memcpy(BUF->ethhdr.dest.addr,BUF->dhwaddr.addr,6);BUF->dipaddr[0]=BUF->sipaddr[0];BUF->dipaddr[1]=BUF->sipaddr[1];BUF->sipaddr[0]=uip_hostaddr[0];BUF->sipaddr[1]=uip_hostaddr[1];BUF->ethhdr.type=HTONS(UIP_ETHTYPE_ARP);uip_len=sizeof(structarp_hdr);}break;caseHTONS(ARP_REPLY):if(BUF->dipaddr[0]==uip_hostaddr[0]&&BUF->dipaddr[1]==uip_hostaddr[1]){uip_arp_update(BUF->sipaddr,&BUF->shwaddr);}break;}return;}*/Voiduip_arp_out(void){structarp_entry*tabptr;if((IPBUF->destipaddr[0]&uip_arp_netmask[0])!=(uip_hostaddr[0]&uip_arp_netmask[0])||(IPBUF->destipaddr[1]&uip_arp_netmask[1])!=(uip_hostaddr[1]&uip_arp_netmask[1])){ipaddr[0]=uip_arp_draddr[0];ipaddr[1]=uip_arp_draddr[1];}else{ipaddr[0]=IPBUF->destipaddr[0];ipaddr[1]=IPBUF->destipaddr[1];}for(i=0;i<UIP_ARPTAB_SIZE;++i){tabptr=&arp_table[i];if(ipaddr[0]==tabptr->ipaddr[0]&&ipaddr[1]==tabptr->ipaddr[1]){break;}}if(i==UIP_ARPTAB_SIZE){memset(BUF->ethhdr.dest.addr,0xff,6);memset(BUF->dhwaddr.addr,0x00,6);memcpy(BUF->ethhdr.src.addr,uip_ethaddr.addr,6);memcpy(BUF->shwaddr.addr,uip_ethaddr.addr,6);BUF->dipaddr[0]=ipaddr[0];BUF->dipaddr[1]=ipaddr[1];BUF->sipaddr[0]=uip_hostaddr[0];BUF->sipaddr[1]=uip_hostaddr[1];BUF->opcode=HTONS(ARP_REQUEST);BUF->hwtype=HTONS(ARP_HWTYPE_ETH);BUF->protocol=HTONS(UIP_ETHTYPE_IP);BUF->hwlen=6;BUF->protolen=4;BUF->ethhdr.type=HTONS(UIP_ETHTYPE_ARP);uip_appdata=&uip_buf[40+UIP_LLH_LEN];uip_len=sizeof(structarp_hdr);return;}memcpy(IPBUF->ethhdr.dest.addr,tabptr->ethaddr.addr,6);memcpy(IPBUF->ethhdr.src.addr,uip_ethaddr.addr,6);IPBUF->ethhdr.type=HTONS(UIP_ETHTYPE_IP);uip_len+=sizeof(structuip_eth_hdr);}(3)主函数#incldue<reg52.h>voidmain(void){unsignedchari;unsignedchararptimer=0;USART_init();//网络初始化函数nic_init();//uip协议栈初始化uip_init();//initapp应用程序初始化,如tcp或者udp,http的应用httpd_init();//initARPcache初始化arp协议的缓冲uip_arp_init();//initperiodictimer初始化周期函数定时器initTimer();//开放中断//主循环while(1){uip_len=nic_poll();if(uip_len==0)//如果没有数据包{if(timerCounter>TIMERCOUNTER_PERIODIC_TIMEOUT){timerCounter=0;for(i=0;i<UIP_CONNS;i++){uip_periodic(i);//周期性检查函数 if(uip_len>0)//如果包长度大于0发送包{uip_arp_out();//主动发送和重发数据包在此进行nic_send();}}if(++arptimer==20)//更新arp表{ uip_arp_timer();arptimer=0;}}}else//packetreceived接收到网络数据包{//processanIPpacket处理ip数据包if(BUF->type==htons(UIP_ETHTYPE_IP)){

温馨提示

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

评论

0/150

提交评论