1번의 경우는 Window full 상태인것 같습니다. wireshark 같은 프로그램으로 패킷을 잡아보시면 확인 가능하구요
발생원인은 pc쪽 rx 버퍼가 가득차서 W5500 쪽 tx 버퍼에 있는 Data를 가져가지 못해 tx쪽 버퍼도 가득차게 되고
freesize가 1로 유지되어 발생하게됩니다.
이런 상황이라면 W5500에서 문제가 아니기 때문에 pc쪽 프로그램을 확인 해보시기 바랍니다.
2번의 경우에는 1번과 함께 발생한 에러인가요??
2번의 경우는 close api에 들어가서 멈추기 전에 close상태를 써주는데 그 커맨드가 안먹는 것 같은데 말이 안되는 상황이라 현재 주신 정보로는 파악이 어렵습니다.
해당 에러가 발생한 시나리오에 대한 정보를 더 자세히 설명해 주시기 바랍니다.
비슷한 현상을 재현하기 위해 테스트 중이지만 시간이 너무 늘어지는 듯 하여 답글을 남깁니다.
1번 현상의 경우는 자신이 데이터를 내보낼 수 없거나 상대측이 데이터를 받을 수 없는 상태입니다.
비슷한 현상을 재현해 보자면 Establish가 되어 있는 상태에서 물리적 링크가 끊어지면 W5500은 Estblish 상태를 유지하게 됩니다.
이런 현상이 지속된다면 Buffer는 차오르게 되고 결국 while loop에서 나올 수 없게 됩니다. 하지만 TIME OUT에 의해 소켓은 자동으로 Close 됩니다.
이런 현상을 정확하게 분석하고자 한다면 wire shark등으로 data packet을 잡아 확인해야만 합니다.
2번 close 명령을 내렸음에도 close가 동작하지 않는 경우는 한가지 경우밖에 생각나지 않습니다.만약 OS를 사용하여 각기 다른 task가 같은 소켓에 접근하여 한 task는 close를 다른 한 task는 connect나 listen을 하게 된다면 close 동작 중 establish가 되는 현상이 생길 수도 있습니다. 혹시 OS를 사용하시는지 궁금합니다.
저희 쪽에서도 계속 테스트는 진행 중에 있으며…
현재는 8개 socket의 loopback을 호출할때 각각의 loopback 사이에 delay를 1ms 를 주고 테스트 진행 중입니다만… 일주일이 넘게 동일 현상은 재연이 없습니다…
SPI clk 속도는 3M 밖에는 되지 않습니다만… W5500 내부 처리 속도보다 MCU의 처리 속도가 빠른가 하여서 테스트를 진행 하고 있습니다…
그리고, OS는 사용하지 않고 있으며, Blcoked 방식으로 단일 API에서 loopback을 호출하고 있습니다.