UIP協(xié)議在單片機上的移植與實現(xiàn)2_第1頁
UIP協(xié)議在單片機上的移植與實現(xiàn)2_第2頁
UIP協(xié)議在單片機上的移植與實現(xiàn)2_第3頁
UIP協(xié)議在單片機上的移植與實現(xiàn)2_第4頁
UIP協(xié)議在單片機上的移植與實現(xiàn)2_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

設(shè)計總結(jié)可以看出,uIP協(xié)議棧采用有效的方法和結(jié)構(gòu)化的代碼,使其存儲器占用量很小并且可以很方便的應(yīng)用到不同的工程項目中,同時它又是免費的可以自由使用于商業(yè)和非商業(yè)目的。uIP為低端嵌入式設(shè)備的網(wǎng)絡(luò)接入提供了很好的解決方案,具有很高的應(yīng)用價值。ENC28J60是極具特色的獨立以太網(wǎng)控制器:SPI接口使得小型單片機也能具有網(wǎng)絡(luò)連接功能;集成MAC和PHY無需其他外設(shè);具有可編程過濾功能,可自動評價、接收或拒收多種信息包,減輕了主控單片機的處理負荷;內(nèi)部繼承可編程的8KB雙端口SRAM緩沖器,操作靈活方便。不足之處為僅支持10BASET。這次設(shè)計基本實現(xiàn)了所要設(shè)計的內(nèi)容,但是我也看到了設(shè)計過程中的不足和出現(xiàn)的問題。例如,在編程時由于所掌握的知識有限,遇到過不少困難,雖然出了不少錯誤,但我相信自己在以后越來越多的實踐中越來越成熟起來??偟膩碚f這次的畢業(yè)設(shè)計不僅鍛煉了我的實戰(zhàn)能力,激發(fā)了我的創(chuàng)新思維,提高了我發(fā)現(xiàn)問題、解決問題的能力,而且培養(yǎng)了我面對挫折并勇于克服的意志、品質(zhì)和吃苦耐勞的精神,也使我深深的體會到理論結(jié)合實際的重要性,體會到即使以后走到工作崗位,仍然要繼續(xù)努力汲取知識。參考文獻[1]李廣弟,朱月秀,王秀山.單片機基礎(chǔ)[M].北京:北京航空航天大學出版社,2001.7[2]韓志軍,沈晉源,望振波.單片機應(yīng)用系統(tǒng)設(shè)計[M].北京:機械工業(yè)出版社,2005[3]樓然苗,李光飛.51單片機設(shè)計實例[M].北京:北京航空航天大學出版社,2003[4]雷曉平等編.單片機及其應(yīng)用[M].成都:電子科技大學出版社,2005.6[5]李蘭友等編.單片機開發(fā)應(yīng)用十例[M].北京:電子工業(yè)出版社,2006.7[6]吳微,文軍等編.單片機原理及制作[M].武漢:武漢大學出版社,2004.12[7]靳達.單片機應(yīng)用系統(tǒng)開發(fā)實例導航[M].北京:人民郵電出版社,2003.10[8]周志敏,周紀海等編.LED驅(qū)動電路設(shè)計與應(yīng)用[M].北京:人民郵電出版社,2004.8[9]何立民.單片機高級教程[M].北京:北京航空航天大學出版社,2001[10]夏繼強.單片機實驗與實踐教程[M].北京:北京航空航天大學出版社,2001[11]閻石.數(shù)字電子技術(shù)基礎(chǔ)[M].北京:高等教育出版社,2005附錄1.ENC28J60與單片機的外部連接圖(1)整體連接圖(2)MCU部分(3)串口與單片機部分(4)串口與單片機部分(5)電源部分2.重點函數(shù)程序(1)USART函數(shù)#include"USART.h"#include"STC12C5A#defineBAUD9600//串口初始化voidUSART_Init(){ PCON&=0x7f; //波特率不倍速SMOD=0 SCON=0x50; //8位數(shù)據(jù),可變波特率 AUXR|=0x40; //定時器1時鐘為Fosc,即1T AUXR&=0xfe; //串口1選擇定時器1為波特率發(fā)生器 TMOD&=0x0f; //清除定時器1模式位 TMOD|=0x20; //設(shè)定定時器1為8位自動重裝方式 TL1=0xB2; //設(shè)定定時初值 TH1=0xB2; //設(shè)定定時器重裝值 ET1=0; //禁止定時器1中斷 TR1=1; //啟動定時器1 ES=1; //開串行中斷 EA=1; //開總中斷} //發(fā)送一個字符,ASCII碼voidSendASC(unsignedchard){ SBUF=d; while(!TI); //等待發(fā)送完成,TI置位 TI=0;}//發(fā)送字符串voidSendString(unsignedchar*str) { while(*str) { SendASC(*str); str++; }}//串口中斷服務(wù)程序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函數(shù)#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)主函數(shù)#incldue<reg52.h>voidmain(void){unsignedchari;unsignedchararptimer=0;USART_init();//網(wǎng)絡(luò)初始化函數(shù)nic_init();//uip協(xié)議棧初始化uip_init();//initapp應(yīng)用程序初始化,如tcp或者udp,http的應(yīng)用httpd_init();//initARPcache初始化arp協(xié)議的緩沖uip_arp_init();//initperiodictimer初始化周期函數(shù)定時器initTimer();//開放中斷//主循環(huán)while(1){uip_len=nic_poll();if(uip_len==0)//如果沒有數(shù)據(jù)包{if(timerCounter>TIMERCOUNTER_PERIODIC_TIMEOUT){timerCounter=0;for(i=0;i<UIP_CONNS;i++){uip_periodic(i);//周期性檢查函數(shù) if(uip_len>0)//如果包長度大于0發(fā)送包{uip_arp_out();//主動發(fā)送和重發(fā)數(shù)據(jù)包在此進行nic_send();}}if(++arptimer==20)//更新arp表{ uip_arp_timer();arptimer=0;}}}else//packetreceived接收到網(wǎng)絡(luò)數(shù)據(jù)包{//processanIPpacket處理ip數(shù)據(jù)包if(BUF->type==htons(UIP_ETHTYPE_IP)){

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論