Wiz5500 Sn_SR 레지스터 문의

mbed 에서 Nucleo_F103RB_W5500HelloWorld 예제를 이용해 루프백 테스트 하려고합니다.

동작시 spi통신으로 IP,MAC,GW 정상 셋팅 됩니다.
그런데 PC 클라이언트 프로그램에서 커넥트함과 동시에 커넥트 되고 바로 디스커넥트됩니다.

예제 함수에서
sreg<uint8_t>(_sock_fd, Sn_SR) == SOCK_ESTABLISHED 가 되어야 루프백 함수에 진입하는데
Sn_SR 값이 변하지 않아 바로 넘어가는것 같습니다.

일전에 _sock_fd 는 현재 연결된 소켓이 아닌 다음 소켓이라고 답변을 주셨는데,
이것때문에 현재 소켓의 상태가 아닌 비어있는 소켓의 상태를 읽어 문제가 발생하는것이 아닌가 생각됩니다.

현재 연결된 소켓의 상태를 읽어오려면 어떻게 하는지 문의드리고,

이런 문제가 아니면 어떤 원인이 있는지 문의드립니다.

   while (1) {
        pc.printf("\nWait for new connection...\r\n");
        TCPSocketConnection client;
        server.accept(client);
        client.set_blocking(false, 0); // Timeout=0.
        pc.printf("Connection from: %s\r\n", client.get_address());
        while ([b]client.is_connected() == true[/b]) {
            int n = client.receive(buffer, sizeof(buffer));
            if(n > 0)
                client.send_all(buffer, n);
            if(client.is_fin_received())
                client.close();
        }
        pc.printf("Disconnected.\r\n");
    }

안녕하세요.

“Nucleo_F103RB_W5500HelloWorld” 위 예제를 사용하신다고 하셨는데,

보드도 Nucleo_F103RB와 W5500 Ethernet shield를 사용하시는 건가요???

아래 첨부해주신 예제는 단순 TCP echoback Test입니다.

Nucleo_L152RE_W5500HelloWorld로 제작된 예제가 있으니 이 예제를 한번 테스트 부탁드리겠습니다. (아래 링크 첨부합니다.)

developer.mbed.org/users/najgh0 … elloWorld/

개인적인 소견으로는 Serial Terminal로 접속시 어떻게 연결이 되고 끊기는지 캡쳐해서 보여주시면 감사하겠습니다.

그리고 코드가 문제 없어도 네트워크 연결에 따라서 연결이 됐다가 끊어졌다가 할 수도 있으니, PC와 모듈을 다이렉트로 연결해서 먼저 테스트

진행 부탁드립니다.

로컬망에서 테스트 하려면 링크드린 코드에서 #define DHCP 를 주석처리하면 됩니다.

감사합니다.

nucleo stm32F411과 wiz550io 사용합니다.
PC 와는 dhcp사용하지않고 다이렉트로 연결하였습니다.

터미널에서는
커넥트 되어서 PC의 IP를 가져오고 바로 Disconnected 가 출력됩니다.

위의 while 루프를 그냥 지나가는듯 합니다.

위예제 import 하면 아래같은 에러가 발생하는데 괜찮은건지 문의드립니다.

올려주신 예제 결과 입니다.

똑같이 연결하자마자 Discnnected. 로 넘어갑니다. (캡쳐첨부)

확인을 위해

pc.printf(“Connection from: %s\r\n”, client.get_address());
밑에

pc.printf(“Sn_SR : 0x%x \r\n”, server.state());
를 첨부하여 연결시 Sn_SR 을 읽었습니다.

int TCPSocketServer::state()
{ return eth->sreg<uint8_t>(_sock_fd, Sn_SR); }

마찬가지로
pc.printf(“Disconnected.\r\n”);
밑에도
pc.printf(“Sn_SR : 0x%x \r\n”, server.state());
를 추가하였습니다.

이때 터미널에 찍힌 결과는

[quote]W5500 Application Started
DHCP OFF
SPI Initialized
W5500 Networking Started
Initialized, MAC: 00:08:DC:01:02:03
IP: 192.168.1.194, MASK: 255.255.255.0, GW: 192.168.1.1
TCP PORT 5000

Wait for new connection…
Connection from: 192.168.1.7
Sn_SR : 0x0
Disconnected.
Sn_SR : 0x0

Wait for new connection…[/quote]

입니다. Sn_SR값이 변하지 않아서 receive, SEND 함수가 있는 루프로 진입하지 않는걸로 판단됩니다.
Sn_SR 읽을때 _sock_fd 를 쓴이유는 while (client.is_connected() == true) 의 조건인 함수를 따라가니 Sn_SR 읽는 소켓에 _sock_fd 아 입력됩니다.

답변 부탁드립니다.


해외 포럼에

w5500, SPI ok, Sn_SR always 0x00, TCP

라는 글이 있는데

SPI SEND 함수의 어드레스가 잘못되었다고 합니다.

그런데 저는 mbed의 예제를 사용하는데 이런 문제가 있을 수 있나요? 답변 부탁드립니다. 살려주세요.

안녕하세요.

일단 제공드린 예제중에서 SD Card 부분은 그냥 주석처리하시고 하셔도 상관없습니다.

그리고 캡쳐하신 Serial Terminal을 보면… 저게 정상동작하는 것으로 알고 있습니다.

위 예제는 Loopback(echoback)예제입니다.

일단 접속하면 아래 캡쳐한 그림처럼 접속을 하게 되고 메세지를 날리면 리턴해서 자신한테 다시 날라오게 됩니다.


위 TCP예제는 단순 Loopback을 하는 예제입니다. (Nucleo_L152RE & W5500 Ethernet shield 사용)

캡쳐해주신 부분을 고려한다면 Data Send/Recieve 하는 부분도 함께 첨부해주시면 감사하겠습니다.

감사합니다.

접속후 메세지를 보내기전에 바로 디스커넥트로 빠지고 있습니다.

보낸메세지를 다시 루프백 하는 루프 조건이 Sn_SR 값인데

Sn_SR 값이 리슨 커넥트 등으로 바뀌지 않고 계속 0이 출력되어 루프백 함수 진입못하고 바로 디스커넥트 됩니다.

[size=150]Sn_SR 레지스터가 계속 0X00으로 나오는 문제 입니다.[/size]

답변 부탁드립니다.

Sn_SR은 소켓 상태를 알 수 있는 함수 입니다.

Sn_SR이 0x00이 되었다는 것은 SOCK_CLOSED가 되었다는 것인데,

위 문제는 코드 문제로 보여집니다.

근데 제가 드린 예제는 다시 말씀드리자면 Nucleo_L152RE보드와 W5500 Ethernet shield를 사용하여 구현한 예제입니다.

WIZ550io에 맞는 코드로 구현하셔야 합니다.

이 말은 MAC주소를 WIZ550io가 갖고있기 때문에, WIZ550io에서 사용하는 MAC주소를 사용해야 하므로 코드의 수정이 필요합니다.

캡쳐부분을 보면 MAC주소는 제가 코드에 추가한 부분과 동일하게 적혀있습니다.

일단 WIZ550io는 전원 on시 MAC주소를 받아와서 칩 내부에 저장하고 있기 때문에 나머지 Network 정보만 할당해서 구현해보시기 바랍니다.

감사합니다.