[STM32 + W5100] Etherent to 2 Port Serial 보드 제작
STM32F103C8 과 W5100을 이용하여 Ethernet To 2 Port Serial모듈을 제작
Ethernet Controller는 W5100 이용
STM32F103 - 48LQFP
[STM32 + W5100] Etherent to 2 Port Serial 보드 제작
//----------------------------------------------------------------------------- void NetInit(void) { unsigned char mac[6] = MY_NET_MAC; unsigned char sm[4] = MY_SUBNET; unsigned char gwip[4] = MY_NET_GWIP; //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); } //-----------------------------------------------------------------------------
2)서버 설정서버모드는 클라이언트 모드와 거의 유사하지만 socket()함수로 소켓을 생성한 후 listen()함수로
서버로부터 접속을 기다리게 된다. //----------------------------------------------------------------------------- //Initialize socket - 서버 모드로 소켓 초기화 unsigned char InitSocketServer(unsigned int Socket, unsigned Port) { //initialize the socket if(socket(Socket,Sn_MR_TCP, Port,0x20) == 0) { DebugPrint("Fail to create socket."); return 0; } else { listen(Socket); } return 1; }
3)접속후 데이터 송수신
데이터 수신은 접속후 getSn_SR(SOCK_TCPS)함수로 소켓의 상태를 체크하다 SOCK_ESTABLISHED상태,
즉 서버에 연결된 상태가 되었을때 getSn_RX_RSR()함수로 수신된 데이터가 있으면
recv()함수로 데이터를 수신할 수 있다.
클라이언트에 의해 접속 종료 요청이 오면 SOCK_CLOSE_WAIT 상태가 되고 disconnect()함수로 연결을 종료 할 수 있다.
이후 TCP상태는 SOCK_CLOSED가 되고 InitSocketServer()함수를 이용하여
다시 소켓을 초기화 해서 서버로 접속을 대기할 수 있다.
//----------------------------------------------------------------------------- //수신데이터 처리 void EthernetTest(unsigned char *pRcvBuffer, unsigned int len) { unsigned int i; DebugPrint("Read Data[%d]\r\n", len); for(i=0;i<len;i++) { //if(i%16==0)DebugPrint("\r\n"); DebugPrint("%02X ", pRcvBuffer[i]); } DebugPrint("\r\nReceive OK!\r\n"); } //TCP-Server 처리 void ProcessTcpSever(void) { int len; unsigned char data_buf[TX_RX_MAX_BUF_SIZE]; uint16 port = MY_LISTEN_PORT; switch (getSn_SR(SOCK_TCPS)) { case SOCK_ESTABLISHED: //check Rx data if((len = getSn_RX_RSR(SOCK_TCPS)) > 0) { //if Rx data size is lager than TX_RX_MAX_BUF_SIZE if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE; //read the received data len = recv(SOCK_TCPS, data_buf, len); //send the received data - loop back test send(SOCK_TCPS, data_buf, len); EthernetTest(data_buf, len); } break; case SOCK_CLOSE_WAIT: //If the client request to close disconnect(SOCK_TCPS); break; case SOCK_CLOSED: //if a socket is closed //reinitialize the socket InitSocketServer(SOCK_TCPS, port); break; } } //-----------------------------------------------------------------------------
//============================================================================= // Mega128 EVM Module Test Program // by nexp76(nexp76@naver.com) http://cafe.naver.com/elab // [tcps1.c] //============================================================================= /* - [W5100] EVM Tcp Server Test Program - MY_LISTEN_PORT(5000)로 접속 대기하여 수신한 데이터 시리얼로 표시 예제 */ #include "..\00_hal\system.h" #include "..\01_drv\serial.h" #include "../01_drv/wiznet/mcu/types.h" #include "../01_drv/wiznet/iinchip/w5100.h" #include "../01_drv/wiznet/iinchip/socket.h" #include "../01_drv/wiznet/iinchip/wiznet.h" //----------------------------------------------------------------------------- #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} // MY Gateway IP : 192.168.0.1 #define MY_DESTINATIONIP {192, 168, 0, 154} // MY Destination : 192.168.0.154 #define MY_SOURCEIP {193, 168, 0, 100} // MY Source IP : 192.168.0.100 #define MY_SUBNET {255, 255, 255, 0} #define MY_NET_MEMALLOC 0x55 // MY iinchip memory allocation #define MY_LISTEN_PORT 5000 // MY Listen Port : 5000 #define MY_CONNECT_PORT 3000 // MY Connect Port : 3000 #define TX_RX_MAX_BUF_SIZE 1024 #define SOCK_TCPC 0 #define SOCK_TCPS 1 //----------------------------------------------------------------------------- unsigned char m_dip[4] = MY_DESTINATIONIP; //Destination IP : 192.168.0.154 unsigned char m_sip[4] = MY_SOURCEIP; //Source IP : 192.168.0.100 //----------------------------------------------------------------------------- void NetInit(void) { unsigned char mac[6] = MY_NET_MAC; unsigned char sm[4] = MY_SUBNET; unsigned char gwip[4] = MY_NET_GWIP; //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); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //Initialize socket - 서버 모드로 소켓 초기화 unsigned char InitSocketServer(unsigned int Socket, unsigned Port) { //initialize the socket if(socket(Socket,Sn_MR_TCP, Port,0x20) == 0) { DebugPrint("Fail to create socket."); return 0; } else { listen(Socket); } return 1; } //----------------------------------------------------------------------------- //수신데이터 처리 void EthernetTest(unsigned char *pRcvBuffer, unsigned int len) { unsigned int i; DebugPrint("Read Data[%d]\r\n", len); for(i=0;i<len;i++) { //if(i%16==0)DebugPrint("\r\n"); DebugPrint("%02X ", pRcvBuffer[i]); } DebugPrint("\r\nReceive OK!\r\n"); } //TCP-Server 처리 void ProcessTcpSever(void) { int len; unsigned char data_buf[TX_RX_MAX_BUF_SIZE]; uint16 port = MY_LISTEN_PORT; switch (getSn_SR(SOCK_TCPS)) { case SOCK_ESTABLISHED: //check Rx data if((len = getSn_RX_RSR(SOCK_TCPS)) > 0) { //if Rx data size is lager than TX_RX_MAX_BUF_SIZE if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE; //read the received data len = recv(SOCK_TCPS, data_buf, len); //send the received data - loop back test send(SOCK_TCPS, data_buf, len); EthernetTest(data_buf, len); } break; case SOCK_CLOSE_WAIT: //If the client request to close disconnect(SOCK_TCPS); break; case SOCK_CLOSED: //if a socket is closed //reinitialize the socket InitSocketServer(SOCK_TCPS, port); break; } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Main Routine //----------------------------------------------------------------------------- int main(void) { SystemInit(); //Serial Init DebugInit(BAUD_115200); DebugPrint("[Mega128 EVM] Test Program. - TCP Server\r\n"); //W5100 Chip Initialize //---------------------------- InitWiznet(); NetInit(); //---------------------------- //Display Net Configuration.. DisplayConfig(); //Initialize TCP Server InitSocketServer(SOCK_TCPS, MY_LISTEN_PORT); while (1) { //TCP Server Process ProcessTcpSever(); } } //-----------------------------------------------------------------------------
댓글을 달아 주세요