WIZnet Developer Forum

[W7500x] Sn_SR 레지스터 변경 안되는 문제 문의

아래 코드에서
Sn_SR 값을 계속 출력하는데
PC와 TCP 접속 했을경우에도 0x14 OCK_LISTEN 이 출력되고,
PC 클라이언트에서 disconnect 를 한 뒤에 다시 connect 해야 SOCK_ESTABLISHED 0x17 로 변경됩니다.

처음 접속시에 Sn_SR에 반영이 안되는데 어떻게 해결해야 할지 문의드립니다.

int main (void)
{
*(volatile uint32_t *)(0x41001014) = 0x0060100; //clock setting 48MHz

// Chip must be deselected
cs = 1;

// Setup the spi for 8 bit data, high steady state clock,
// second edge capture, with a 1MHz clock rate
spi.format(8,3);
spi.frequency(20000000);

mode = 0;
// Select the device by seting chip select low
cs = 0;

printf("Wait a second...\r\n");

uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0x00, 0x01, 0x02};
char ip_addr[] = "192.168.11.5";
char subnet_mask[] = "255.255.255.0";
char gateway_addr[] = "192.168.11.1";

EthernetInterface eth;
eth.init(mac_addr, ip_addr, subnet_mask, gateway_addr);
eth.connect();
printf("Server IP Address is %s\r\n", eth.getIPAddress());

TCPSocketServer server;
server.bind(ECHO_SERVER_PORT);
server.listen();
char buffer[12];

while (true)
{
server.bind(ECHO_SERVER_PORT);
server.listen();
printf(“Wait for new connection…\r\n”);
printf(“socket state:%x\r\n”,server.State());
TCPSocketConnection client;
server.accept(client);

    printf("Connection from: %s\r\n", client.get_address());
    wait(1);
    
    while (true)
    {
        printf("%s\r\n",(DRDY)?"true":"false");
        
       [b] printf("socket state: %x\r\n", server.State());[/b]
        
        if(!DRDY)
        {
            printf("DRDY Low");
            
            for(uint8_t i=0; i<12; i++)
            {
                buffer[i] = spi.write(0x00);
            }            
            client.send_all(buffer, 12);                                              
        }
                    
        if ((server.State()) == 0x00 || (server.State() == 0x1c) ) 
        {
            printf("SOCK_CLOSED\r\n");
            break; 
        } 
    }      
         
    client.close();
}

어떤 예제를 사용하셨는지 잘 모르겠습니다.

server.State()라는 함수는 어디서 가져오셨는지요?

테스트 해볼 수 있도록 좀더 정확한 정보를 주시기 바랍니다.

감사합니다.

[quote=“justinkim”]어떤 예제를 사용하셨는지 잘 모르겠습니다.

server.State()라는 함수는 어디서 가져오셨는지요?

테스트 해볼 수 있도록 좀더 정확한 정보를 주시기 바랍니다.

감사합니다.[/quote]

ethernetinterface 에 get Sn_SR 함수가 없어서 TCPSocketServer.c 에 아래 함수를 추가해서 Sn_SR 레지스터를 읽었습니다.

처음 연결시에 변경안되고 리슨상태에서 접속 끊고 두번째 접속해야 값이 변경됩니다.

uint8_t TCPSocketServer::State()
{

return eth->sreg<uint8_t>(_sock_fd, Sn_SR);

}

안녕하세요 :slight_smile:

mbed 프로그램은 소프트웨어 스택처럼 짜져있어 소켓하나를 오픈하고 해당 소켓이 연결하면 새로운 소켓을 또 하나 오픈시킵니다.
예를 들어 보겠습니다.

먼저 0번 소켓을 열었습니다.
상태를 읽으면 Listen 상태입니다. 여기서 _sock_fd는 0번 소켓에 해당하는 값입니다.
그 다음 0번 소켓에 클라이언트가 접속합니다.
0번 소켓이 connect이 되면서 1번소켓이 열립니다.
이 상황에서 상태 값을 읽어오면 _sock_fd가 1번 소켓에 해당하는 값이 들어가게 됩니다.

eth->sreg<uint8_t>(_sock_fd, Sn_SR);
위의 코드에서 _sock_fd 부분을 이전에 연결된 sock 번호로 연결시키시면 제대로 값이 나옵니다.

감사합니다.

[quote=“justinkim”]안녕하세요 :slight_smile:

mbed 프로그램은 소프트웨어 스택처럼 짜져있어 소켓하나를 오픈하고 해당 소켓이 연결하면 새로운 소켓을 또 하나 오픈시킵니다.
예를 들어 보겠습니다.

먼저 0번 소켓을 열었습니다.
상태를 읽으면 Listen 상태입니다. 여기서 _sock_fd는 0번 소켓에 해당하는 값입니다.
그 다음 0번 소켓에 클라이언트가 접속합니다.
0번 소켓이 connect이 되면서 1번소켓이 열립니다.
이 상황에서 상태 값을 읽어오면 _sock_fd가 1번 소켓에 해당하는 값이 들어가게 됩니다.

eth->sreg<uint8_t>(_sock_fd, Sn_SR);
위의 코드에서 _sock_fd 부분을 이전에 연결된 sock 번호로 연결시키시면 제대로 값이 나옵니다.

감사합니다.[/quote]

_sock_fd 부분을 이전에 연결된 sock 번호로 연결시키려면 어떻게 하나요?

하나의 소켓만 사용하도록 하려면 어떻게 하나요?

하나의 소켓만 open 하시면 됩니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.