[WIZ850io] RESET 과 link status 관계

안녕하십니까?

이번에 WIZ850io을 사용하여 프로젝트를 진행하면서 궁금한 점이 있어서 이렇게 문의드립니다.

WIZ850io에 연결상태와 통신상태를 알려주는 LED(녹색, 노랑)가 있는데, 통신을 하는 과정에서 LINK LED(녹색)이 점멸되거나 LED가 꺼져버리는 현상이 나타나 이렇게 문의드립니다.
이런 현상이 간헐적으로 발생하여 네트워크의 문제인지, 칩의 문제인지… 어디를 체크해봐야할지 문의드립니다.

제가 확인한바로는 MCU에서 초기 구동시에 WIZ850io의 RESET 핀을 LOW로 만들어 준 상태에서 SPI통신을 하지 않아도 녹색LED에 불이 들어오는 것으로 보아서는MCU와 W5500사이의 통신과는 상관없이 정상적인 LINK가 연결되면 녹색불이 켜지는것 같은데, 어떤 상황에서 녹색이 꺼질수 있는지 알고 싶습니다.

테스트를 진행하는 과정에서 LINK LED, ACTIVE LED가 고정이 되어버리는 경우가 발생하여, WIZ850io의 RESET핀을 사용하여 리셋을 걸어주어도 W5500칩 자체가 동작을 하지 못하는것 같습니다. 이렇게 판단한 이유는 SPI 통신을 하게 되는데 Response가 전혀 들어오지 않아 MCU가 static uint8_t wizchip_rw(uint8_t byte) 함수에 계속 머물러 있거나, WIZ850io의 LINK LED가 점멸되고 PC에서 ping을 해주어도 전혀 연결이 되지 않습니다.

아래 동영상은 제가 임의로 상황을 재현해 본것입니다. 동영상을 보면 LINK LED가 반응하지 않는 것을 볼수 있습니다.
동영상

안녕하세요.

가능하다면 회로도를 첨부하여 support@wiznet.io 로 기술문의 주시기 바랍니다.
동영상만으론 확인이 어려워 보입니다.

감사합니다.

WIZ850io 모듈을 사용해서 SPI통신을 하는겁니다.
회로도는 일반적인 SPI 연결입니다.
잘 사용을 하다 한번씩 위에 말씀드린것 처럼 연결이 이상해서 왜 그럴까? 원인이 찾아보다가 저런 이상한 테스트를 하니 W5500이 비정상적인 동작을 하게 되어서 문의드리는 겁니다.

카테고리를 으로 '네트워크 모듈’로 이동하고, 게시물 제목에 [WIZ850io]를 추가하였습니다.

안녕하세요.

W5500의 ACT LED와 LINK LED는 Ethernet 연결이 되는 peer와 물리적으로 연결이 되면 점등합니다.
이는 OSI계층, 혹은 TCP 계층에서 표현되는 물리적인 네트워크 Layer 영역입니다.

LINK LED는 전원인가 후 RESET이 되지 않는이상 꺼지지 않습니다.
LED가 꺼지는 경우는 EMI라던지, ESD라던지 등의 영향으로 보이게 될 수 있습니다. 또한 주변의 환경상황이라던지,
WIZ850io와 연결되는 보드가 어떻게 구성되어 있는지 정확한 진단이 필요할 것으로 생각됩니다.

즉, 정확하게 어떤 테스트를 진행했더니, 어떤 비정상적인 동작을 하게 되었다는지… 등등의 정확한 정보가 필요합니다.

감사합니다.

안녕하세요

Wiz850io 보드와는 아래와 같이 STM32F103 컨트롤러와 SPI2를 통하여 연결하였습니다.

위 동영상의 문제로 모듈이 문제인듯하여 모듈을 교체하여 테트스하니 케이블을 끼웠다 뺐다를 반복하면 모듈이 LINK LED가 꺼지는 현상은 계속발생하지는 않습니다. 모듈이 불량인듯합니다. 이거 교환되나요??
그런데 모듈을 교체하여 이데넷 연결을 테스트하는 과정(TCP Client 모드로 동작)에서 이더넷 케이블을 빼서 다시 연결한다던지, IP 변경을 한다든지 하였을때, ACTIVE LED가 계속 켜져있는 현상이 발생하면 모듈이 RESET된것 같은 현상이 나타납니다. 그 경우에 케이블을 빼고 다시 연결하면 LINK LED에 켜지지 않습니다. 위즈넷에서 제공되는 소스를 사용하였습니다.

TCP server 소켓에 연결할 때 while문에서 계속 대기하는 현상(MCU가 다른 함수 호출이 안되는)이 있어 Retry Time과 Retry Count를 아래와 같이 줄여서 SOCK_CLOSED 상태에서 소켓 Open하고 있습니다
setRTR(3); setRCR(2);

초기 시스템이 부팅되어 정상적으로 TCP 서버와 연결이 이루어지면 통신이 잘되다 소켓이 닫히고 다시 연결되는 현상도 한번씩 발생하고 있습니다.

위즈넷에서 제공하는 소스에서 폴링방식이 아닌 인터럽트방식으로 구동되는 예제가 있다고 포럼에서 글을 읽은적이 있느데 보내주시면 프로젝트를 진행하는데 도움이 될것 같습니다.

감사합니다.

안녕하세요. 위즈네트 입니다.

일단 문제가 발생 했던 WIZ850io를 저희에게 보내주실 수 있나요?

저희 측에서 동일한 증상이 확인 된다면 교환이 가능 할것 같습니다.

http://shop.wiznet.co.kr/ 에서 구매를 하셨다면 저희에게 직접 보내주시고,

다른 곳에서 구매하셨다면, 구매처를 통해서 저희에게 보내주시면 될것 같습니다.

감사합니다.

안녕하세요.

구매한 모듈은 보내드리도록 하겠습니다.
경기도 성남시 분당구 황새울로 216 휴맥스 빌리지 5층 으로 보내드리면 되나요?

그리고 현재 테스트를 50ms 주기로 짧은 데이타를 tcp서버로 보내고 있습니다.
wireshark로 확인해보니 아래 그림과 같이 RST ACK가 간헐적으로 발생하고 있습니다.

이 문제가 Retry Time과 Retry Count를 짧게 설정하여 이런 문제가 발생하는 건가요?

아래 코드는 1ms 주기로 호출하는 어플리케이션입니다.

void EthernetTask(void)
{
uint16_t u16RsrLength, RxLength;
uint8_t *u08Rxbuf = gU08ViEthSpiRxBufSv1;

switch (getSn_SR(SERVER_SOCKET_V1))
{
case SOCK_ESTABLISHED : 	// 소켓 연결이 이루어 지면
    if ((u16RsrLength = getSn_RX_RSR(SERVER_SOCKET_V1)) > 0) 		// 수신 데이터 확인
    {
        if (u16RsrLength > SPI_BUF_SIZE) 
        {
            u16RsrLength = SPI_BUF_SIZE;
        }
        
        RxLength = recv(SERVER_SOCKET_V1, u08Rxbuf, u16RsrLength);	// 수신 데이터를 읽어서
        DataParsing(1, u08Rxbuf, RxLength);		// 데이터 분석 
    }
    
    Application function ...
    break;
        
case SOCK_CLOSE_WAIT :  
    disconnect_ret = disconnect(SERVER_SOCKET_V1);
           
    if(disconnect_ret == SOCK_OK)
    {
        invalid_disconnect = 1;
    }
    else if(disconnect_ret == SOCKERR_TIMEOUT)
    {
        invalid_disconnect =2;
        close(SERVER_SOCKET_V1);
    }
    break;
    
case SOCK_CLOSED :	// 소켓 접속 닫기       
    if (gU32ViEthSocketInit100msCountSv1 == 0)							
    {
        if(socket(SERVER_SOCKET_V1, Sn_MR_TCP, gU16ViEthServerPortV1, 0x00) == SERVER_SOCKET_V1)
        {
            socket_opened =1 ;
        }
        else
        {
            socket_opened = 0;
            close(SERVER_SOCKET_V1);
            gU32ViEthSocketInit100msCountSv1 = 40;
        }
    }
    
    setRTR(3);
    setRCR(2);
    break;  

case SOCK_INIT :  	// 소켓 초기화
    if (gU32ViEthSocketInit100msCountSv1 == 0)								
    {
        gU32ViEthSocketInit100msCountSv1 = 40;

        i08SocketStatus  = connect(SERVER_SOCKET_V1, gU08ViEthServerIpV1, gU16ViEthServerPortV1);   
         
        switch(i08SocketStatus)
        {
            case SOCKERR_IPINVALID :	// IP 에러
                break;
                
            case SOCKERR_PORTZERO :		// 포트 번호 에러
                break;

            case SOCK_BUSY :
                break;

            case SOCKERR_TIMEOUT :		// 타이 아웃
                close(SERVER_SOCKET_V1);// 소켓을 닫는다.
                break;

            case SOCKERR_SOCKCLOSED :	// 비정상 소켓 닫기
                break;
                
            case SOCK_OK :		    // 소켓 접속 OK
                break;

            case SOCK_FATAL :
            default :
                break;
        }
        gU08ViEthShotTrigFlagSv1 = MC_RESET;						
        
    }
    break;
    
default :
    break; 
}

}