Hi Coccoliso, thanks for reply!
Like the picture i posted:
when i try to use 4 sockets simultaneously
With socket 0-1: send and receiver data ok.
With socket 2-3: send ok but can’t receiver data.
My project use W5100 ioLibrary (Driver) [url]http://www.wiznet.co.kr/wp-content/uploads/wiznethome/Chip/W5100/Software/W5100_Driver_V180(0).zip[/url] and programing by CodevisionAVR
After setting register of MCU, socket, w5100…
*In main loop:
while(1)
{
for(i=0;i<4;i++)
{
loopback_tcps(i, gDATABUF, 80) ;
}
} // end of Main loop
*The code of tcps loopback:
[code]int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret; char *p;
uint16_t size = 0, sentsize=0;
uint8_t destip[4];
uint16_t destport;
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
getSn_DIPR(sn, destip);
destport = getSn_DPORT(sn);
printf(“%d:Connected %d.%d.%d.%d : %d\r\n”,sn, destip[0], destip[1], destip[2], destip[3], destport);
setSn_IR(sn,Sn_IR_CON);
}
size = getSn_RX_RSR(sn); //recv_size
if(size> 0)
{
if(size > DATA_BUF_SIZE)
size = DATA_BUF_SIZE;
printf("****Size = %d***\r\n",size);
delay_ms(10); //delay needed to make the buttons work
ret = recv(sn,buf,size); //read client request
//printf("****ret = %d***\r\n",ret);
if(ret <= 0) return ret;
//ret>0: co du lieu gui den xu ly gui nhan du lieu o day
//in du lieu nhan dc ra PC
printf("\r\n*****Receiver Data***********\r\n");
p=buf;
while (*p) putchar(*p++);
printf("\r\n*******findata receiver*********\r\n");
//gui du lieu len server
strcpy((char *)buf, ("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
strcat((char *)buf, ("<html><body>\r\n"));
strcat((char *)buf, ("<title>atk's web server</title>\r\n"));
strcat((char *)buf, ("<h2>ThaiHoai Smart Control....atk32a2</h2>\r\n"));
strcat((char *)buf, ("</body></html>\r\n"));
send(sn,buf,strlen((char *)buf));
//xoa buffer
for(i=0;i<strlen((char *)buf);i++)
buf[i] = NULL;
disconnect(sn);
//printf("%d:Closed\r\n",sn);
}
break;
case SOCK_FIN_WAIT:
case SOCK_CLOSING:
case SOCK_LAST_ACK :
case SOCK_CLOSE_WAIT :
printf("%d:CloseWait\r\n",sn);
if((ret=close(sn)) != SOCK_OK) return ret;
printf("%d:Closed\r\n",sn);
break;
case SOCK_INIT:
printf("%d:Listen,TCP server, port [%d]\r\n",sn, port);
if( (ret = listen(sn)) != SOCK_OK) return ret;
break;
case SOCK_CLOSED:
printf("%d:TCP server Start\r\n",sn);
if((ret=socket(sn,Sn_MR_TCP,port,0x00)) != sn)
return ret;
printf("%d:Opened\r\n",sn);
break;
default:
break;
}
return 1;
}[/code]
*Source code:
#include <mega2560.h>
#include <delay.h>
#include <iobits.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
// Standard Input/Output functions
#include <stdio.h>
#include "Ethernet/socket.h"
#include "Internet/DNS/dns.h"
#include "Ethernet/wizchip_conf.h"
#define SOCK_DNS 0
#define SOCK_TCPC 0
#define SOCK_TCPS 0
#define DATA_BUF_SIZE 1024
volatile uint32_t msTicks; /* counts 1ms timeTicks */
uint16_t i;
uint16_t destport = 80;
uint8_t gDATABUF[1024];//default 2048
/**************************************************************************//**
* @brief Default Network Inforamtion
*****************************************************************************/
wiz_NetInfo gWIZNETINFO = {{0x90, 0x4c, 0xe5, 0x46, 0x0f, 0xcc}, //MAC
{11, 10, 88, 23}, //IP
{255, 0, 0, 0}, //SubMask
{11, 10, 88, 88}, //GateWay
{11, 10, 88, 88}, //DNS google
NETINFO_STATIC };
void platform_init(void);
void network_init(void);
int32_t loopback_tcps(uint8_t, uint8_t*, uint16_t); // Loopback TCP server
// Declare your local variables here
uint8_t tmp=0;//enable_tcpc=0;
int32_t ret = 0;
uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};
//uint32_t led_msTick = 1000;
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
platform_init();
printf("welcome to wiznet...\r\n");
delay_ms(1000);
/* wizchip initialize*/
if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1)
{
printf("WIZCHIP Initialized fail.\r\n");
while(1);
}
/* Network initialization */
network_init(); // Static netinfo setting
/* Main loop */
// #asm ("cli")
while(1)
{
for(i=0;i<4;i++)
{
loopback_tcps(i, gDATABUF, 80) ;
}
} // end of Main loop
}
/******************************************************************************
* @brief Network Init
* Intialize the network information to be used in WIZCHIP
*****************************************************************************/
void network_init(void)
{
#ifdef _MAIN_DEBUG_
uint8_t tmpstr[6] = {0,};
wiz_NetInfo netinfo={0,0,0,0,0,0};
#endif
// Set Network information from netinfo structure: cai dat ip, submask, gateway, MAC
ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);
#ifdef _MAIN_DEBUG_
// Get Network information: lay thong tin ip, submask, gateway, MAC
ctlnetwork(CN_GET_NETINFO, (void*)&netinfo);
// Display Network Information: ten chip W5100 or another
ctlwizchip(CW_GET_ID,(void*)tmpstr);
if(netinfo.dhcp == NETINFO_DHCP) printf("\r\n=== %s NET CONF : DHCP ===\r\n",(char*)tmpstr);
else printf("\r\n=== %s NET CONF : Static ===\r\n",(char*)tmpstr);
printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",netinfo.mac[0],netinfo.mac[1],netinfo.mac[2],
netinfo.mac[3],netinfo.mac[4],netinfo.mac[5]);
printf("SIP: %d.%d.%d.%d\r\n", netinfo.ip[0],netinfo.ip[1],netinfo.ip[2],netinfo.ip[3]);
printf("GAR: %d.%d.%d.%d\r\n", netinfo.gw[0],netinfo.gw[1],netinfo.gw[2],netinfo.gw[3]);
printf("SUB: %d.%d.%d.%d\r\n", netinfo.sn[0],netinfo.sn[1],netinfo.sn[2],netinfo.sn[3]);
printf("DNS: %d.%d.%d.%d\r\n", netinfo.dns[0],netinfo.dns[1],netinfo.dns[2],netinfo.dns[3]);
printf("===========================\r\n");
#endif
}
int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret; char *p;
uint16_t size = 0, sentsize=0;
uint8_t destip[4];
uint16_t destport;
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
getSn_DIPR(sn, destip);
destport = getSn_DPORT(sn);
printf("%d:Connected %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
setSn_IR(sn,Sn_IR_CON);
}
size = getSn_RX_RSR(sn); //recv_size
if(size> 0)
{
if(size > DATA_BUF_SIZE)
size = DATA_BUF_SIZE;
printf("****Size = %d***\r\n",size);
delay_ms(10); //delay needed to make the buttons work
ret = recv(sn,buf,size); //read client request
//printf("****ret = %d***\r\n",ret);
if(ret <= 0) return ret;
//ret>0: co du lieu gui den xu ly gui nhan du lieu o day
//in du lieu nhan dc ra PC
printf("\r\n*****Receiver Data***********\r\n");
p=buf;
while (*p) putchar(*p++);
printf("\r\n*******findata receiver*********\r\n");
//gui du lieu len server
strcpy((char *)buf, ("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
strcat((char *)buf, ("<html><body>\r\n"));
strcat((char *)buf, ("<title>atk's web server</title>\r\n"));
strcat((char *)buf, ("<h2>Wiznet....atk32a2</h2>\r\n"));
strcat((char *)buf, ("</body></html>\r\n"));
//if (Send(mysocket, buf, strlen((char *)buf)) == W5100_FAIL) break; // just throw out the packet for now
send(sn,buf,strlen((char *)buf));
//xoa buffer
for(i=0;i<strlen((char *)buf);i++)
buf[i] = NULL;
disconnect(sn);
//printf("%d:Closed\r\n",sn);
}
break;
case SOCK_FIN_WAIT:
case SOCK_CLOSING:
case SOCK_LAST_ACK :
case SOCK_CLOSE_WAIT :
printf("%d:CloseWait\r\n",sn);
if((ret=close(sn)) != SOCK_OK) return ret;
printf("%d:Closed\r\n",sn);
break;
case SOCK_INIT:
printf("%d:Listen,TCP server, port [%d]\r\n",sn, port);
if( (ret = listen(sn)) != SOCK_OK) return ret;
break;
case SOCK_CLOSED:
printf("%d:TCP server Start\r\n",sn);
if((ret=socket(sn,Sn_MR_TCP,port,0x00)) != sn)
return ret;
printf("%d:Opened\r\n",sn);
break;
default:
break;
}
return 1;
}
void platform_init(void)
{
/****************/
/* Timer*/
/****************/
TCCR1A=0x00; //set ngat 10ms
TCCR1B=0x03;
TCNT1H=0xf6;
TCNT1L=0xa0;
TIMSK1=0x01; //enable interrupt timer1
/************/
/* For UART */
/************/
UCSR0A=0x00;
UCSR0B=0x08;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x33;
/***********/
/* For SPI */
/***********/
//spi module
PORTB = 0XFF;
ETH_CS_DDR =1; //output -> chon slave
SI4432_CS_DDR =1;
SI4432_SCK_DDR =1; //output -> clock for sysn slave
SI4432_MOSI_DDR =1; //output -> data for slave
SI4432_MISO_DDR =0; //input -> data from slave
SI4432_IRQ_DDR =0;
DDRE.3=DDRE.5=1;
PORTE.3=PORTE.5=1;
sei();
}