[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등을 설정해 준다.
여기까지 하고 시리얼 포트로 설정한 값을 읽을 수 있다면 하드웨어적 설정이 끝난 것이고 ping테스를 할 수 있다.
TCP 서버 루프백 테스트
ProcessTCPS() 함수를 main루프에서 호출하면 TCP루프백 테스트를 할 수 있다.
(좀더 자세한 사항은 다음에 진행하고 일단 이더넷 통신이 되는것을 확인 하도록 하자)
[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);
}
#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);
}
{
//시스템 초기화
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;
}
}
{
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;
}
}
반응형