Jinbuhm Kim
/
W5500_Driver
Wiznet W5500 driver and TCP/UDP loopback
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 /* Wiznet W5500 Test Program 00002 * 00003 * TCP server(192.168.1.125) is listening with port number 3000 and send back the data to the peer. 00004 * 00005 */ 00006 00007 #include "mbed.h" 00008 #include "Ethernet/wizchip_conf.h" 00009 #include "Ethernet/socket.h" 00010 00011 SPI spi(p5, p6, p7); // mosi, miso, sclk 00012 DigitalOut cs(p8), nRESET(p9); // reset pin of Wiz550io 00013 DigitalIn RDY(p10); // ready pin of Wiz550io 00014 00015 Serial pc(USBTX, USBRX); // tx, rx 00016 00017 void wizchip_select(void); 00018 void wizchip_deselect(void); 00019 uint8_t wizchip_read(); 00020 void wizchip_write(uint8_t wb); 00021 int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t size); 00022 int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t size); 00023 00024 #define DATA_BUF_SIZE 2048 00025 uint8_t gDATABUF[DATA_BUF_SIZE]; 00026 wiz_NetInfo gWIZNETINFO; 00027 00028 int main() 00029 { 00030 uint8_t tmp; 00031 uint8_t tmpstr[6] = {0,}; 00032 int32_t ret = 0; 00033 uint8_t memsize[2][8] = { {2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}}; 00034 00035 pc.baud(115200); 00036 00037 spi.format(8,0); // 8bit, mode 0 00038 spi.frequency(7000000); // 7MHz 00039 00040 00041 nRESET = 0; 00042 wait(0.001); // 1ms 00043 nRESET = 1; 00044 00045 cs = 1; 00046 wait(0.1); // 100ms 00047 00048 // register the chip select/ deselect fucntion 00049 reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect); 00050 00051 // register the chip read/ write fucntion 00052 reg_wizchip_spi_cbfunc(wizchip_read, wizchip_write); 00053 00054 /* wizchip initialize*/ 00055 if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1) { 00056 pc.printf("WIZCHIP Initialized fail.\r\n"); 00057 while(1); 00058 } 00059 00060 do 00061 { 00062 if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1) 00063 pc.printf("Unknown PHY Link stauts.\r\n"); 00064 }while(tmp == PHY_LINK_OFF); 00065 00066 /* wizchip netconf */ 00067 ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO); 00068 00069 gWIZNETINFO.ip[0] = 192; 00070 gWIZNETINFO.ip[1] = 168; 00071 gWIZNETINFO.ip[2] = 1; 00072 gWIZNETINFO.ip[3] = 125; 00073 00074 // set network configuration 00075 ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO); 00076 00077 // get network configuration 00078 ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO); 00079 00080 // Display network configuration 00081 ctlwizchip(CW_GET_ID,(void*)tmpstr); 00082 pc.printf("=== %s NET CONF ===\r\n",(char*)tmpstr); 00083 pc.printf("MAC:%02X.%02X.%02X.%02X.%02X.%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2], 00084 gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]); 00085 pc.printf("GAR:%d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]); 00086 pc.printf("SUB:%d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]); 00087 pc.printf("SIP:%d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]); 00088 00089 while(1) 00090 { 00091 uint8_t sn = 2; 00092 if((ret = socket(sn,Sn_MR_TCP,3000,SF_TCP_NODELAY)) != sn) 00093 { 00094 printf("%d:socket() error:%ld\r\n", sn,ret); 00095 close(sn); 00096 continue; 00097 } 00098 printf("%d:socket() ok.\r\n",sn); 00099 00100 00101 if((ret = listen(sn)) != SOCK_OK) 00102 { 00103 printf("%d:listen() error:%ld",sn,ret); 00104 close(sn); 00105 return ret; 00106 } 00107 printf("%d:listen() ok.\r\n",sn); 00108 00109 00110 if(((ret = socket(sn+1, Sn_MR_UDP, 3000, 0)) != sn+1)) 00111 { 00112 printf("%d:socket() error:%ld\r\n", sn+1,ret); 00113 continue; 00114 } 00115 do 00116 { 00117 getsockopt(sn,SO_STATUS, &tmp); 00118 }while(tmp != SOCK_CLOSED && tmp != SOCK_ESTABLISHED); 00119 if(tmp == SOCK_CLOSED) continue; 00120 //Accept for client 00121 printf("%d:connected\r\nLBStarted Blocking mode\r\n",sn); 00122 00123 while(1) 00124 { 00125 if((ret = loopback_tcps(sn, gDATABUF, DATA_BUF_SIZE)) < 0) 00126 { 00127 printf("%d:loopback_tcps error:%ld\r\n",sn,ret); 00128 break; 00129 } 00130 /* 00131 if((ret=loopback_udps(sn+1,gDATABUF,10)) < 0) 00132 { 00133 printf("%d:loopback_udps error:%ld\r\n",sn+1,ret); 00134 break; 00135 } 00136 */ 00137 } 00138 } 00139 } 00140 00141 void wizchip_select(void) 00142 { 00143 cs = 0; 00144 } 00145 00146 void wizchip_deselect(void) 00147 { 00148 cs = 1; 00149 } 00150 00151 uint8_t wizchip_read() 00152 { 00153 return spi.write(0x00); 00154 } 00155 00156 void wizchip_write(uint8_t wb) 00157 { 00158 spi.write(wb); 00159 } 00160 00161 int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t size) 00162 { 00163 int32_t ret = 0; 00164 ret = recv(sn,buf,size); 00165 if(ret != size) 00166 { 00167 if(ret < 0) 00168 { 00169 printf("%d:recv() error:%ld\r\n",sn,ret); 00170 close(sn); 00171 return ret; 00172 } 00173 } 00174 size = ret; 00175 ret = send(sn,buf,size); 00176 if(ret != size) 00177 { 00178 if(ret < 0) 00179 { 00180 printf("%d:send() error:%ld\r\n",sn,ret); 00181 close(sn); 00182 } 00183 } 00184 return ret; 00185 } 00186 00187 int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t size) 00188 { 00189 int32_t ret = 0; 00190 static uint8_t addr[4] = {0,}; 00191 static uint16_t port = 0; 00192 uint8_t packinfo; 00193 00194 if((ret = recvfrom(sn,buf,size, addr,&port,&packinfo)) < 0) 00195 { 00196 printf("%d:recvfrom error:%ld\r\n",sn,ret); 00197 return ret; 00198 } 00199 if(packinfo & 0x80) 00200 { 00201 printf("%d:recvfrom %d.%d.%d.%d(%d), size=%ld.\r\n",sn,addr[0],addr[1],addr[2],addr[3],port, ret); 00202 } 00203 if(packinfo & 0x01) 00204 { 00205 printf("%d:recvfrom remained packet.\r\n",sn); 00206 } 00207 else 00208 { 00209 printf("%d:recvfrom completed.\r\n",sn); 00210 } 00211 if( (ret = sendto(sn, buf, ret, addr, port)) < 0) 00212 { 00213 printf("%d:sendto error:%ld\r\n",sn,ret); 00214 return ret; 00215 } 00216 printf("%d:sendto %d.%d.%d.%d(%d), size=%ld\r\n",sn,addr[0],addr[1],addr[2],addr[3],port, ret); 00217 return ret; 00218 }
Generated on Tue Jul 12 2022 18:48:21 by 1.7.2