📄 main.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 + -