안녕하세요.
우선 소스에 time_out 설정을 하였습니다.
MCU Reset은 없어졌는데요. connect 함수 안에 while 문 안으로 들어가 timeout으로 return 됩니다. 그래서 MCU Reset은 없어졌구요 하지만 getSn_Sr 의 상태값은 0x00->0x13 반복됩니다.
w5500에서 리셋 되는것 같습니다.
제가 코딩한 부분 첨부하겠습니다.
wiz_NetInfo gWIZNETINFO = {
.mac = { 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }, // Mac address
.ip = { 192, 168, 1, 210 }, // IP address
.gw = { 192, 168, 1, 1}, // Gateway
.sn = { 255, 255, 255, 0}, // Subnet mask
.dns = { 8, 8, 8, 0}, // DNS Server
.dhcp = NETINFO_STATIC
};
wiz_NetTimeout gwiztimeout = { .time_100us = 10000};
void InitUserEthernetDrvA(void)
{
InitUserSpiDrvA();
reg_wizchip_cs_cbfunc(SpiDrv_Enable_CSA, SpiDrv_Disable_CSA);
reg_wizchip_spi_cbfunc(SpiDrv_ReadA, SpiDrv_WriteA);
uint8_t memConf[2][8] = {{2, 2, 2, 2, 2, 2, 2, 2}, {2, 2, 2, 2, 2, 2, 2, 2}};
// allocate internal TX/RX Memory
if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memConf) == -1)
{
#ifdef DBG_ON
printf(" Ethernet : MEMORY CONFIG ERR.\r\n");
#endif
//while(1);
}
// Net Configuration
NetConf();
}
void main (void){
if(TimeTask.bit.Task_100ms==TRUE)
{
EthernetDrv_TcpSvSockOpen(0,5000);
SendEthernetPacket_Shuttle();
Task_100ms(); // 100ms 체크
// Load_EventCnt(); // 로그 데이터 갱신
// Check_SelectBtn_IN(); // OLED 입력 버튼
// Disp_Info(DispPage_uc); // OLED 갱신
}
}
int16 EthernetDrv_TcpSvSockOpen(Uint16 sNum, Uint16 sPort )
{
uint8_t destip[4] = {192, 168, 1, 211}; // pc ip 설정
//uint16_t destport = 2000; // pc TOOL PORT 설정
static uint16_t any_port = 5000;
if(ChkPhyLink(sNum) == false)
{
socketclose(sNum);
return -1;
}
/*
TimerDrv_SetTimeOut(ethTimCnter, 5000);
//while(wizphy_getphylink() == PHY_LINK_OFF)
while(ChkPhyLink(sNum) == false)
{
if(TimerDrv_IsTimeOut(ethTimCnter) == true)
{
return -1;
}
}
*/
if(ChkTcpSockConnect(sNum) == false)
{
//NetConf();
TimerDrv_SetTimeOut(ethTimCnter, 3000);
//while(1)
//{
if(TimerDrv_IsTimeOut(ethTimCnter) == true)
{
socketclose(sNum);
#ifdef DBG_ON
printf("%d : TCP Server Connection TimeOut (sPort %d)\r\n", sNum, sPort);
#endif
return 0;
}
get_data=getSn_SR(sNum);
switch(getSn_SR(sNum))
{
case SOCK_CLOSED:
socketclose(sNum);
if(socket(sNum, Sn_MR_TCP, any_port++,0x00) != sNum)
{
#ifdef DBG_ON
printf("%d : TCP Server Start Fail (sPort %d)\r\n", sNum, sPort);
#endif
return -2;
}
// if(any_port == 0xffff) any_port = 5000;
//printf("%d : TCP Server Start (sPort %d)\r\n", sNum, sPort);
setSn_KPALVTR(sNum, 1); // Keep Alive 5Sec
break;
case SOCK_INIT :
if(connect(sNum,destip,sPort)!= SOCK_OK)//listen(sNum) != SOCK_OK) //listen client
{
#ifdef DBG_ON
printf("%d : TCP Server Listen Fail (sPort %d)\r\n", sNum, sPort);
#endif
return -3;
}
#ifdef DBG_ON
printf("%d : TCP Server Listen (sPort %d)\r\n", sNum, sPort);
#endif
break;
case SOCK_CLOSE_WAIT :
disconnect(sNum);
break;
case SOCK_ESTABLISHED:
if(getSn_IR(sNum) & Sn_IR_CON)
{
setSn_IR(sNum, Sn_IR_CON);
#ifdef DBG_ON
uint8_t dIp[4];
uint16_t dPort;
getSn_DIPR(sNum, dIp);
dPort = getSn_DPORT(sNum);
printf("%d : Connected - %d.%d.%d.%d (dPort %d)\r\n",sNum, dIp[0], dIp[1], dIp[2], dIp[3], dPort);
#endif
return 1;
}
break;
}
//}
}
return 1;
}
서버로는 되는데 클라이언트는 왜 안되는걸까요?
PC IP설정은 192.168.1.211로 설정하였습니다.
허큘레스 TCP 서버로 하고 포트는 5000번 했습니다.
그리고 포럼에 이런 현상이 많은 분들이 있으신데 해결된 답변이 보이지가 않습니다.
아래는 이런 현상이 있어 포럼에 글 올린 주소 입니다,