Wiznet W5500 driver and TCP/UDP loopback

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }