W5500 UDP Client Program

void fcUdpClientLWM2M(STLWM2M *gstLWM2M)
{
uint16_t any_port = 1000 + (rand()%100);
uint8_t delay_cnt = 0;
uint8_t bClientSocketSt = fcLanRcvByte(Sn_SR(SOCKET_LWM2M));

      static uint16_t modereg = 0x02; 
      
      switch(bClientSocketSt)
      {
         case SOCK_UDP:
         {	// if connection is established.
                fcUdpSend(SOCKET_LWM2M , pLTxbuf , 12 , &gunIpSet);                    
         } break;

         case SOCK_CLOSED:{	// if a socket is closed.
                 if(!gstSocket[SOCKET_LWM2M].st)
                                         gstSocket[SOCKET_LWM2M].st = 1;
                                 
                 if(fcSocket(SOCKET_LWM2M, Sn_MR_UDP,  any_port++, 0x00) == 0) // reinitialize the socket.
                                         gstSocket[SOCKET_LWM2M].st = 0;
         } break;
           default: break;                                    
       }

}
안녕하세요 다음과 같이 UDP Client 코드를 작성중입니다.

UDP Send 패킷이 나가지 않아 모니터링을 해봤더니

fcUDPSend 함수안에

	fcLanSndReg(test_ip, Sn_DIPR0(s), 4);	//IP.
	fcLanSndReg((uint8_t *)test_port , Sn_DPORT0(0) , 2);	//Port.
                
            fcLanRcvReg(test , Sn_DIPR0(s) , 4);
            fcLanRcvReg((uint8_t * )test , Sn_DPORT0(0) , 2);                    

다음과 같이 DIPR과 DPORT를 세팅해 주었는데 해당하는 값이 제대로 세팅이 되었나 레지스터 값을 읽어 봤더니 전부 0으로 읽혀 졌습니다.

위의 함수는 TCP모드에서는 잘 읽어 집니다.

혹시 몰라서 자료를 찾아보던중 Mode Reg의 FARP를 Set해주어야 한다고 해서 해당 비트도 Set을 하고

진행해 봐도 결과는 동일했습니다.

혹시 W5500 UDP Client 예제 프로그램이나 참고할만한 Source코드올려주시면 감사하겠습니다.

그리고 해당 Register에 값을 제대로 쓸려면 어떻게 진행을 해야하는지 알려주시면 감사하겠습니다.

Sn_DIPR, Sn_DPORTR register들은 TCP 인 경우, R=W 입니다.
UDP인 경우는 R != W 입니다.
즉 UDP는 1:N 통신을 지원하기 때문에, 설정과 확인이 다릅니다.
확인은 UDP packet header로 확인할 수 있습니다.

udp send는 destination 정보를 설정하고, 보낼 데이타를 socket tx buffer로 copy한 후
Sn_CR[SEND] Command를 수행하셔야 합니다. 수행하신 후 Sn_IR[SENDOK] 를 반드시 확인후 Clear해주셔야 합니다.

ioLibrary sendto()함수를 참고하세요.