⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 带硬件TCP/IP网卡芯片W5300 AVR下应用工程代码
💻 C
字号:
/** * \file    main.c * W5300 example applications for ATMEGA128 of AVR * This code is optimized at AVR-GCC 4.3.3(20090313) *  * This file shows how to use  SOCKET_API_FUNC "WIZnet SOCKET APIs" and  * how to implement your internet application with  W5300.\n *  * \author MidnightCow * \date 15/05/2008 * \version 1.1.0 * * Revision History : * ----------  -------  -----------  ---------------------------- * Date        Version  Author       Description * ----------  -------  -----------  ---------------------------- * 24/03/2008  1.0.0    MidnightCow  Release with W5300 launching * ----------  -------  -----------  ---------------------------- * 01/05/2008  1.0.1    MidnightCow  Modify 'w5300.c'. Refer M_01052008. * ----------  -------  -----------  ---------------------------- * 15/05/2008  1.1.0    MidnightCow  Refer M_15052008. *                                   Modify 'w5300.c', 'w5300.h' and 'socket.c'.  * ----------  -------  -----------  ---------------------------- * * The Main() includes the example program of  W5300 such as  * - loopback_tcps() \n * - loopback_tcpc() \n * - loopback_udp() *  */#include <avr/io.h>#include <avr/interrupt.h>#include <stdio.h>#include "socket.h"#include "types.h"#include "uart.h"void initMCU(void);			        // Initialize MCU/* Definition of example code */void     loopback_tcps(SOCKET s, uint16 port, uint8* buf,uint16 mode);void     loopback_tcpc(SOCKET s, uint8* addr, uint16 port, uint8* buf,uint16 mode);void     loopback_udp(SOCKET s, uint16 port, uint8* buf, uint16 mode);/* * It executes example program such as loopback_tcps(), loopback_tcpc(), and loopback_udp(). */ int main(void){   unsigned long dd = 100000;   uint8 tx_mem_conf[8] = {8,8,8,8,8,8,8,8};          // for setting TMSR regsiter   uint8 rx_mem_conf[8] = {8,8,8,8,8,8,8,8};          // for setting RMSR regsiter   	 uint8 *data_buf = (uint8 *)0x2000;											// buffer for loopack data      uint8 ip[4] = {192,168,1,86};                   // for setting SIP register   uint8 gw[4] = {192,168,1,1};                     // for setting GAR register   uint8 sn[4] = {255,255,255,0};                     // for setting SUBR register   uint8 mac[6] = {0x00,0x08,0xDC,0x11,0x22,0x86};      // for setting SHAR register      uint8 serverip[4] = {192,168,1,85};              // "TCP SERVER" IP address for loopback_tcpc()     initUART();                  											// initiate serial port	      initMCU();                                			  // initiate MCU    /* initiate W5300 */   iinchip_init(); 	 setIMR(1 << INT5);	 printf("\r\nIMR = 0x%04x\r\n",getIMR());	 printf("EIMSK = 0x%04x\r\n",EIMSK);      while(dd--);   /* allocate internal TX/RX Memory of W5300 */   if(!sysinit(tx_mem_conf,rx_mem_conf))              {      printf("MEMORY CONFIG ERR.\r\n");      while(1);   }      //setMR(getMR()|MR_FS);                            // If Little-endian, set MR_FS.   setSHAR(mac);                                      // set source hardware address   #ifdef __DEF_IINCHIP_PPP__      if(pppinit((uint8*)"test01", 6, (uint8*)"pppoe1000", 9)!=1)      {         printf("PPPoE fail.\r\n");         while(1);      }      close(0);   #else      /* configure network information */      setGAR(gw);                                     // set gateway IP address      setSUBR(sn);                                    // set subnet mask address      setSIPR(ip);                                    // set source IP address   #endif      /* verify network information */   getSHAR(mac);                                      // get source hardware address    getGAR(gw);                                        // get gateway IP address         getSUBR(sn);                                       // get subnet mask address        getSIPR(ip);                                       // get source IP address              printf("SHAR : %02x:%02x:%02x:%02x:%02x:%02x\r\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);   printf("GWR  : %d.%d.%d.%d\r\n",gw[0],gw[1],gw[2],gw[3]);   printf("SUBR : %d.%d.%d.%d\r\n",sn[0],sn[1],sn[2],sn[3]);   printf("SIPR : %d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]);      while(1)   {      loopback_tcps(0,5000,data_buf,0);//      loopback_tcps(1,5001,data_buf,0);//      loopback_tcps(2,5002,data_buf,0);//      loopback_tcps(3,5003,data_buf,0);//      loopback_tcps(4,5004,data_buf,0);//      loopback_tcps(5,5005,data_buf,0);//      loopback_tcpc(6,serverip, 3000,data_buf,0);      loopback_udp(7,3000,data_buf,0);   }   #ifdef __DEF_IINCHIP_PPP__   {      uint8 ppp_mac[6];      getPDHAR(ppp_mac);      pppterm(ppp_mac, getPSIDR());   }   #endif   while(1);}void initMCU(void){	EICRA = 0x00;			// External Interrupt Control Register A clear	EICRB = 0x02;			// External Interrupt Control Register B clear // edge 	EIMSK = (1 << INT5);		// External Interrupt Mask Register : 0x10	EIFR = 0xFF;			// External Interrupt Flag Register all clear	DDRE &= ~(1 << INT5);		// Set PE Direction 	PORTE |= (1 << INT5);		// Set PE Default value	sei();				// enable interrupts	MCUCR |= (1 << SRE) | (1 << SRW10);	XMCRA |= (1 << SRL2) | (1 << SRW00);}/** * "TCP SERVER" loopback program. */ void     loopback_tcps(SOCKET s, uint16 port, uint8* buf, uint16 mode){   uint32 len;      switch(getSn_SSR(s))                // check SOCKET status   {                                   // ------------      case SOCK_ESTABLISHED:           // ESTABLISHED?         if(getSn_IR(s) & Sn_IR_CON)   // check Sn_IR_CON bit         {            printf("%d : Connect OK\r\n",s);            setSn_IR(s,Sn_IR_CON);     // clear Sn_IR_CON         }         if((len=getSn_RX_RSR(s)) > 0) // check the size of received data         {            len = recv(s,buf,len);     // recv            if(len !=send(s,buf,len))  // send            {               printf("%d : Send Fail.len=%ld\r\n",s,len);            }         }         break;                                       // ---------------   case SOCK_CLOSE_WAIT:               // PASSIVE CLOSED         disconnect(s);                // disconnect          break;                                       // --------------   case SOCK_CLOSED:                   // CLOSED      close(s);                        // close the SOCKET      socket(s,Sn_MR_TCP,port,mode);   // open the SOCKET        break;                                       // ------------------------------   case SOCK_INIT:                     // The SOCKET opened with TCP mode      listen(s);                       // listen to any connection request from "TCP CLIENT"      printf("%d : LOOPBACK_TCPS(%d) Started.\r\n",s,port);      break;   default:      break;   }}/** * "TCP CLIENT" loopback program. */ void     loopback_tcpc(SOCKET s, uint8* addr, uint16 port, uint8* buf, uint16 mode){   uint32 len;   static uint16 any_port = 1000;      switch(getSn_SSR(s))                   // check SOCKET status   {                                      // ------------      case SOCK_ESTABLISHED:              // ESTABLISHED?         if(getSn_IR(s) & Sn_IR_CON)      // check Sn_IR_CON bit         {            printf("%d : Connect OK\r\n",s);            setSn_IR(s,Sn_IR_CON);        // clear Sn_IR_CON         }         if((len=getSn_RX_RSR(s)) > 0)    // check the size of received data         {            len = recv(s,buf,len);        // recv            if(len !=send(s,buf,len))     // send            {               printf("%d : Send Fail.len=%ld\r\n",s,len);            }         }         break;                                          // ---------------   case SOCK_CLOSE_WAIT:                  // PASSIVE CLOSED         disconnect(s);                   // disconnect          break;                                          // --------------   case SOCK_CLOSED:                      // CLOSED      close(s);                           // close the SOCKET      socket(s,Sn_MR_TCP,any_port++,mode);// open the SOCKET with TCP mode and any source port number      break;                                          // ------------------------------   case SOCK_INIT:                        // The SOCKET opened with TCP mode      connect(s, addr, port);             // Try to connect to "TCP SERVER"      printf("%d : LOOPBACK_TCPC(%d.%d.%d.%d:%d) Started.\r\n",s,addr[0],addr[1],addr[2],addr[3],port);      break;   default:      break;   }}/** * UDP loopback program. */ void     loopback_udp(SOCKET s, uint16 port, uint8* buf, uint16 mode){   uint32 len;   uint8 destip[4];   uint16 destport;      switch(getSn_SSR(s))   {                                                         // -------------------------------      case SOCK_UDP:                                     //          if((len=getSn_RX_RSR(s)) > 0)                   // check the size of received data         {            len = recvfrom(s,buf,len,destip,&destport);  // receive data from a destination            if(len !=sendto(s,buf,len,destip,destport))  // send the data to the destination            {               printf("%d : Sendto Fail.len=%ld,",s,len);               printf("%d.%d.%d.%d(%d)\r\n",destip[0],destip[1],destip[2],destip[3],destport);            }         }         break;                                                         // -----------------      case SOCK_CLOSED:                                  // CLOSED         close(s);                                       // close the SOCKET         socket(s,Sn_MR_UDP,port,mode);                  // open the SOCKET with UDP mode         break;      default:         break;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -