위즈네트 아카데미

TUTORIAL

튜토리얼

Home  > 튜토리얼

W5500 W5500-EVB 활용 Chat Client 구현하기 -1

WIZnet Academy 2015.03.31 15:17 조회 수 : 65

W5500-EVB 를 활용 Chat Client 를 구현하는 방법에 대해서 설명합니다.  본 프로젝트는 위즈네트의 정석균 연구원이 직접 구현한 내용으로 총 5개의 시리즈로 소개합니다.

W5500-EVB는 NXP社의 Cortex M0 MCU인 LPC11E36FHN33이 Main MCU로 포함되어 있고 W5500을 제어할수 있게 제작되어 있습니다. W5500-EVB의 자세한 내용은 아래 URL을 통해 확인 가능합니다.

http://wizwiki.net/wiki/doku.php?id=products:w5500:w5500_evb

Chat Client란?

간단하게 말하면 TCP Client로 구동되며, TCP Server로 접속해서, TCP로 수신된 데이터를 Serial로 송신하고, Serial로 수신된 데이터를 TCP로 송신을 하는 것으로, 아래의 그림으로 표현할 수 있습니다.

Chat_Client_1

 

본 튜토리얼에서는 W5500-EVB 를 활용할 예정으로 W5500-EVB 사용법에 대한 기본적인 학습이 필요합니다. 아래의 링크를 클릭하여 기본 사항을 확인하시기 바랍니다.

- 개발 환경 구축하기

- 드라이버 포팅하기

 

Chat Client 구현하기

W5500 드라이버를 사용하여 이더넷 통신을 하기 위해서는 “Socket Status Register”의 상태에 따라 동작을 정의 하는 방식으로 구현하게 됩니다. Socket Status Register 상태는 다음과 같이 정의 될 수 있습니다.

socket_status

아래는 TCP를 사용할 때의 State Diagram 입니다.

141029_echo_server1

“Socket Status Register”의 상태에 따라 동작이 정의 되기 때문에 아래와 같은 골격을 참고해서 구현합니다.
{
...
switch(getSn_SR(sn)) {
case SOCK_CLOSED:
/* Socket Closed State */

break;
case SOCK_INIT:
/* TCP Socket Creatation */

break;
case SOCK_LISTEN:
/* TCP Server Mode */

break;
case SOCK_ESTABILSHED:
/* TCP ESTABLISHED */

break;
case SOCK_CLOSE_WAIT:
/* Disconnect request */

break;
}
...
}

구현한 코드는 아래와 같습니다.
#if defined (__USE_LPCOPEN)
#if defined(NO_BOARD_LIB)
#include "chip.h"
#else
#include "board.h"
#endif
#endif

#include <cr_section_macros.h>
#include "socket.h"
#include "spi_handler.h"
#include "w5500_init.h"

// TODO: insert other include files here

// TODO: insert other definitions and declarations here
#define SOCK_TCPS0 0
#define DATA_BUF_SIZE 2048
uint8_t gDATABUF[DATA_BUF_SIZE];

// Ethernet => Serial
int EtherToSerial(uint8_t* buf,uint16_t size)
{
uint8_t i;
for(i=0 ; i < size ; i++){
putchar(buf[i]);
}
//Chip_UART_Send(LPC_USART, buf, size);
return 0 ;
}
// Serial => Ethernet
int SerialToEther(uint8_t sn)
{
uint8_t serial_rx_data;

if((Chip_UART_ReadLineStatus(LPC_USART) & UART_LSR_RDR) == 1){
Chip_UART_Read(LPC_USART, &serial_rx_data, 1);
send(sn, &serial_rx_data, 1);
//Chip_UART_SendBlocking(LPC_USART, &sr_rx_data, 1);
}
return 0 ;
}

int main(void) {

uint8_t ip[4]={192,168,0,142};
uint16_t port=23;
uint8_t sn=SOCK_TCPS0;
uint16_t size=0;

#if defined (__USE_LPCOPEN)
#if !defined(NO_BOARD_LIB)
// Read clock settings and update SystemCoreClock variable
SystemCoreClockUpdate();
// Set up and initialize all required blocks and
// functions related to the board hardware
Board_Init();
// Set the LED to the state of "On"
Board_LED_Set(0, true);
#endif
#endif
SPI_Init();
W5500_Init();
Net_Conf();

//Socket Creation
if(socket(sn, Sn_MR_TCP, port, 0x00)==sn){
printf("%d:Socket Openedrn",sn);
}
else{
printf("%d:Socket Errorrn",sn);
while(1);
}

printf("%d:Connecting, ip[%d.%d.%d.%d] port [%d]rn", sn, ip[0], ip[1], ip[2], ip[3], port);
//Connent TCP Server
if(connect(sn,ip,port)==SOCK_OK);
else {
printf("%d:Connect Errorrn",sn);
while(1);
}

while(1) {
switch(getSn_SR(sn)) {
case SOCK_CLOSED:
/* Socket Closed State */

break;
case SOCK_INIT:
/* TCP Socket Creatation */

break;
case SOCK_LISTEN:
/* TCP Server Mode */

break;
case SOCK_ESTABLISHED:
/* TCP ESTABLISHED */
//Connect Interrupt Check
if(getSn_IR(sn) & Sn_IR_CON) {
printf("%d:Connectedrn",sn);
setSn_IR(sn,Sn_IR_CON);
Board_LED_Set(0, false);
Board_LED_Set(1, true);
}
//Receive Data Check
if((size = getSn_RX_RSR(sn)) > 0) {
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
recv(sn,gDATABUF,size);
EtherToSerial(gDATABUF, size);
}
SerialToEther(sn);
break;

case SOCK_CLOSE_WAIT:
/* Disconnect request */

break;
}
}
return 0 ;
}
</cr_section_macros.h>

아래는 위의 코드에 대한 작업자의 설명입니다.
코드를 자세히 보면 “Socket Status Register”의 상태에 따라 처리하는 것은 'SOCK_ESTABLISHED' 상태 일때 밖에 없는 것을 볼수 있다. 동작하는 순서를 익히기 위해 소켓생성하는 부분과 서버에 접속하는 부분은 밖으로 빼서 구현을 했다. 그리고 Serial 로 받은 데이터를 TCP로 전송하는 부분을 보완할 예정이다. (데이터를 모아 한꺼번에 보내는 기능)

 

W5500-EVB 활용 Chat Client 구현하기 – 2

W5500-EVB 활용 Chat Client 구현하기 – 3

W5500-EVB 활용 Chat Client 구현하기 – 4

W5500-EVB 활용 Chat Client 구현하기 – 5

 

 

출처 : Dokkodai's OSHW Alchemist