본문 바로가기

[AVR]/AT90USB

[AT90USB1287-EX] Ehternet Test - W5100 TCP/IP 루프백 테스트

[AT90USB1287-EX] Ehternet Test - W5100 TCP/IP 루프백 테스트

[AT90USB1287-EX] 보드는 하드웨어 TCP/IP 모듈인 W5100/W5200 을 연결할 수 있여 이더넷 관련 테스트를 쉽게 진행할 수 있다.
물론 AT90USB1287-EX 보드는 ATmega128도 호환 되기 때문에 동일하게 동작 시킬 수 있다.

먼저 개발 환경 설정을 해 보면...
하드웨어 TCP/IP 스택이므로 쉽게 이더넷 구현이 가능한데, 드라이버 폴더의 wizent에서 W5100관련 w5100.c, socket.c 만 삽입하면 된다.



그리고 메인 소스코드에  아래를 인클루드 한다.
#include "w5100.h"
#include "socket.h"


다음은 네트웍 설정을 해 준다.
W5100초기화 하고 MAC 어드레스, IP, Gateway등을 설정해 준다.
#define MY_NET_MAC   {0x00, 0x08, 0xdc, 0x00, 0x00, 0x00} // MY Mac Address : 00.08.DC.00.00.00

#define MY_NET_GWIP   {192,  168, 0,    1} //Gateway     : 192.168.0.1
#define MY_SOURCEIP   {192,  168, 0,  104} //보드 IP     : 192.168.0.101
#define MY_SUBNET   {255, 255, 255,   0}


void W5100_NetInit(void)
{
 unsigned char mac[6] = MY_NET_MAC;
 unsigned char sm[4] = MY_SUBNET;
 unsigned char gwip[4] = MY_NET_GWIP;
 unsigned char m_sip[4] = MY_SOURCEIP;

 IICHIP_HAL_INIT();
 IICHIP_RESET_INIT() ;
 IICHIP_RESET();

 DebugPrint("W5100_NetInit");     

 //W5100 Chip Init
 iinchip_init();
     
 //Set MAC Address
 setSHAR(mac);

 //Set Gateway
 setGAR(gwip);

 //Set Subnet Mask
 setSUBR(sm);

 //Set My IP
 setSIPR(m_sip);
 
#ifdef __DEF_IINCHIP_INT__
 setIMR(0xEF);
#endif

 sysinit(MY_NET_MEMALLOC, MY_NET_MEMALLOC);  
}



여기까지 하고 시리얼 포트로 설정한 값을 읽을 수 있다면 하드웨어적 설정이 끝난 것이고 ping테스를 할 수 있다.




int main(void)
{
 //시스템 초기화
 SystemInit();
 
 //LED포트 초기화
 Led1Init();
 Led1On();

 Led2Init();
 Led2On();

 //UART Init
 DebugInit(BAUD_57600);
 DebugPrint("myMCU UART0 Test Program\r\n");

 //init_network();
    W5100_NetInit();
    DisplayConfig();

   while(1);
}




TCP 서버 루프백 테스트
ProcessTCPS() 함수를 main루프에서 호출하면 TCP루프백 테스트를 할 수 있다.
(좀더 자세한 사항은 다음에 진행하고 일단 이더넷 통신이 되는것을 확인 하도록 하자)
void ProcessTCPS(unsigned int sock)
{
    unsigned int len;
 unsigned char data_buf[TX_RX_MAX_BUF_SIZE];
 unsigned int port = MY_LISTEN_PORT;

 switch (getSn_SR(sock))
 {
  // Socket CLOSED일 경우     
 case SOCK_CLOSED:
   if(!m_SokStatus1)m_SokStatus1 = 1;
 
  //socket 초기화 하고
  if(socket(sock,Sn_MR_TCP, port,0x00) == 0)
  {
   DebugPrint("Fail to create socket.");
   m_SokStatus1 = 0;
  }
  else
  {
   //접속대기
   listen(sock);
  }
  break; 


 case SOCK_ESTABLISHED:
  //수신데이터가 있으면
  if((len = getSn_RX_RSR(sock)) > 0)   
  {
      if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE;
      //데이터 수신
      len = recv(sock, data_buf, len);  
  
     //수신데이터 처리-> 루프백
     send(sock, data_buf, len);    
  } 
  break;

 case SOCK_CLOSE_WAIT:                            
  //If the client request to close
  disconnect(sock);
 
  m_SokStatus1 = 0;
  break; 
 
    default:
      
        break;
 } 
}


반응형