본문 바로가기

원본글은 http://blog.cahg.org/wp/?p=184 입니다.

저자의 양해를 구해 여기로 옮겨 약간 수정된 내용입니다.

W5500 EVB로 IoT 개발하기

  1. 개발 환경 구축

    • LPCXpresso 설치
    • Flash Magic 설치
    • 신규 프로젝트 생성 방법
  2. W5500 드라이버 포팅

    • W5500-EVB W5500 Interface (SPI)
    • W5500 Driver Import
    • 초기화 함수 구현
      • W5500 초기화 Flow
      • MCU Interface 초기화 함수
      • Call Back 함수 구현
      • W5500 Chip 초기화 함수
      • Network 설정 함수
    • Main 함수 구현
    • Firmware 적용 및 테스트
  3. Echo-Server 구현

    • Echo-Server 구현

W5500 드라이버 포팅

W5500-EVB W5500 Interface (SPI)

W5500-EVB는 NXP LPC11E36 MCU를 사용하며, W5500과 SPI를 통하여 인터페이스 되어 있다. LPC11E36 MCU는 2개 채널의 SPI를 지원하는데 W5500과는 SPI0를 통해서 인터페이스 되어 있다. W5500-EVB에 대한 자세한 내용은 WIZnet wiki 사이트에서 참조하기 바란다.
http://wizwiki.net/wiki/doku.php?id=products:w5500:w5500_evb

아래의 그림은 W5500-EVB Schematic에서 W5500 인터페이스를 보여준다.

  • CS : PIO0_2 / SSEL0
  • SCLK : PIO0_6 / SCLK0
  • MISO : PIO0_8 / MISO0
  • MOSI : PIO0_9 / MOSI0
  • W5500_RST : PIO0_3

W5500 Driver Import

이전 강의록 “개발 환경 구축” 편을 참조하여 새로운 프로젝트를 생성한다.
W5500으로 이더넷 구현하기 (개발 환경 구축)
※ 프로젝트명을 W5500-EVB로 생성함

아래의 사이트에서 W5500 Driver 소스 코드를 다운로드 받는다.
http://wizwiki.net/wiki/doku.php?id=products:w5500:driver

소스 코드는 zip으로 압축된 형태로 배포된다. 압축을 풀면 Ethernet이라는 디렉토리가 생기며, 이 디렉토리 내에 W5500 Driver 소스 코드들이 존재한다. Ethernet 디렉토리를 새로 생성한 프로젝트의 src 디렉토리로 복사한다.

src 디렉토리

LPCXpresso Project Explorer에서 생성한 프로젝트를 선택한 후 “F5″를 눌러 refresh를 하면, 복사한 Ethernet 디렉토리를 Project Explorer에서 확인 할 수 있다.

복사한 Ethernet 디렉토리의 Include Path를 위해 다음 과정을 수행한다.
Project Explorer에서 W5500-EVB를 선택한 후, LPCXpresso 메뉴 Project->Properties를 클릭한다. 클릭하면 새로운 팝업 창이 뜨며, 오른쪽 메뉴의 C/C++ Build->Settings를 선택한다.

Tool Settings 탭에서 MCU C Compiler -> Includes 항목을 선택한 후, 새로운 include 경로를 추가하기 위해 “+”로 표시된 아이콘을 클릭한다.

“+”로 표시된 아이콘을 클릭하면 다음 창이 뜨며, Workspace…를 클릭한 후 W5500-EVB 프로젝트 내의 src 디렉토리를 선택하여 추가한다.

동일한 방법으로 Ethernet 디렉토리도 추가한다. 최종적으로 추가가 왼료되면 다음과 같이 나타난다.

빌드하여 생성된 Firmware를 Flash Magic으로 보드에 적용하기 위해서는 Firmware가 Hex 파일 형태가 되어야 한다. Hex 파일 형태의 Firmware를 생성하기 위해서 다음의 과정을 수행한다.
Build steps 탭에서 Post-build steps -> Command 창의 Edit… 버튼을 누르면, 다음의 창이 뜨며 아래의 내용을 추가한다.

objcopy O ihex "${BuildArtifactFileBaseName}.axf""${BuildArtifactFileBaseName}.hex"

추가한 후 “OK” 버튼을 누르면 다음 창이 뜨며, “OK” 버튼을 눌러 다음 단계로 진행한다.

표준 입출력 함수를 사용하기 위해 다음의 설정을 변경한다.
Tool Settings 탭에서 MCU Linker -> Managed Linker Script 항목을 선택한 후, Library 항목을 “Redlib(nohost)”로 변경한다.

W5500 Driver 소스 Ethernet/W5500/w5500.h 파일에 다음 코드를 추가한다.
추가할 위치는 1176줄 “#define WIZCHIP_CRITICAL_EXIT() WIZCHIP.CRIS._exit()” 위에 추가한다.

#ifdef _exit
#undef _exit
#endif

이 과정을 마친 후 빌드하면 정상적으로 빌드되는 것을 볼 수 있다.

초기화 함수 구현

W5500 초기화 Flow

W5500을 사용하기 위해서는 다음의 초기화 과정이 필요하다.

  1. MCU Interface 초기화
    • SPI 관련 초기화
    • Reset Pin 관련 초기화
  2. Call back 함수 구현
    • Chip Select Functions
    • SPI Read/Write Functions
  3. W5500 Chip 초기화
    • H/W reset
    • Register Call Back Functions
    • Initializes to W5500 with SOCKET buffer size
  4. Network Information 초기화
MCU Interface 초기화 함수

MCU Inteface 초기화 함수에서는 SPI Inteface 관련 초기화 루틴과 Reset Pin 관련 초기화 루틴이 포함되어야 한다.

src 디렉토리에 spi_handler.h 파일을 생성한 후 Pin 관련 정보들을 정의한다.

#ifndef __SSP_H__
#define __SSP_H__

#define GPIO_SPI0_PORT      #define GPIO_W5500_RST_PORT #define GPIO_SPI0_CS        #define GPIO_SPI0_CLK       #define GPIO_SPI0_MISO      #define GPIO_SPI0_MOSI      #define GPIO_W5500_RST       SPI_Init#endif

src 디렉토리에 spi_handler.c 파일을 생성한 후 다음의 초기화 루틴들을 구현한다.
헤더 파일 include

#include"board.h"#include"spi_handler.h"

PIN Mux 설정 함수 구현

staticInit_SSP_PinMux/* Configure SPI Pin */Chip_IOCON_PinMuxSetLPC_IOCON GPIO_SPI0_PORT GPIO_SPI0_CLKIOCON_FUNC2  IOCON_MODE_INACT  IOCON_DIGMODE_ENChip_IOCON_PinMuxSetLPC_IOCON GPIO_SPI0_PORT GPIO_SPI0_MISOIOCON_FUNC1  IOCON_MODE_INACT  IOCON_DIGMODE_ENChip_IOCON_PinMuxSetLPC_IOCON GPIO_SPI0_PORT GPIO_SPI0_MOSIIOCON_FUNC1  IOCON_MODE_INACT  IOCON_DIGMODE_ENChip_IOCON_PinMuxSetLPC_IOCON GPIO_SPI0_PORT GPIO_SPI0_CSIOCON_FUNC0  IOCON_MODE_PULLUPChip_GPIO_SetPinDIROutputLPC_GPIO GPIO_SPI0_PORT GPIO_SPI0_CSChip_GPIO_SetPinStateLPC_GPIO GPIO_SPI0_PORT GPIO_SPI0_CS/* Configure W5500 RESET Pin */Chip_GPIO_SetPinDIROutputLPC_GPIO GPIO_W5500_RST_PORT GPIO_W5500_RSTChip_GPIO_SetPinStateLPC_GPIO GPIO_W5500_RST_PORT GPIO_W5500_RST

SPI 초기화 함수 (SPI Mode0 / SPI Clock 10MHz)

 SPI_Init/* SSP initialization */Init_SSP_PinMuxChip_SSP_InitLPC_SSP0Chip_SSP_SetFormatLPC_SSP0 SSP_BITS_8 SSP_FRAMEFORMAT_SPI SSP_CLOCK_MODE0Chip_SSP_SetMasterLPC_SSP0Chip_SSP_SetBitRateLPC_SSP012000000// 12MHzChip_SSP_EnableLPC_SSP0
Call Back 함수 구현

W5500에서 Host MCU의 SPI Interface 사용을 위한 Call Back Function들을 구현한다.

src 디렉토리에 w5500_init.c 파일에 SPI Call back function을 구현한다.

/* W5500 Call Back Functions */static  wizchip_selectChip_GPIO_SetPinStateLPC_GPIO GPIO_SPI0_PORT GPIO_SPI0_CSfalse// SSEL(CS)static  wizchip_deselectChip_GPIO_SetPinStateLPC_GPIO GPIO_SPI0_PORT GPIO_SPI0_CS// SSEL(CS)staticuint8_t wizchip_readuint8_tChip_SSP_ReadFrames_BlockingLPC_SSP0returnstatic  wizchip_writeuint8_tChip_SSP_WriteFrames_BlockingLPC_SSP0

Call Back Function을 등록하기 위해 W5500_Init 함수 “Register Call back function” 주석 밑에 다음 코드를 추가한다.

/* Register Call back function */
reg_wizchip_cs_cbfuncwizchip_select wizchip_deselect
reg_wizchip_spi_cbfuncwizchip_read wizchip_write
W5500 Chip 초기화 함수

W5500 Chip 초기화 함수를 구현한다. 초기화 과정은 다음과 같다.

  • W5500 Chip Reset
  • Register SPI Call back Functions
  • W5500 Chip Initialization (Socket Buffer Size)

W5500 Chip Reset 방법은 Reset 핀을 High 상태에서 Low 상태로 바꾼 뒤 일정 시간 유지한 후, 다시 Reset 핀을 High 상태로 바꿔주면 된다.

src 디렉토리에 w5500_init.h 파일을 생성한 후, 다음을 정의 한다.

#ifndef __W5500_INIT_H__
#define __W5500_INIT_H__

 delay_cntvolatileunsigned nCount display_net_infoNet_Conf W5500_Init#endif

src 디렉토리에 w5500_init.c 파일을 생성한 후, 칩 초기화 루틴을 구현한다. (Call back 함수 등록은 Call Back 함수 부분에서 설명하겠다.)

헤더 파일 include

#include<stdio.h>#include"board.h"#include"spi_handler.h"#include"wizchip_conf.h"#include"socket.h"

Delay 함수

 delay_cntvolatileunsigned nCount nCountnCount

W5500 Chip 초기화 함수

 W5500_Inituint8_t memsize/* W5500 Chip Reset */Chip_GPIO_SetPinStateLPC_GPIO GPIO_W5500_RST_PORT GPIO_W5500_RSTfalse
    delay_cntChip_GPIO_SetPinStateLPC_GPIO GPIO_W5500_RST_PORT GPIO_W5500_RST
    delay_cnt10000/* Register Call back function */
    reg_wizchip_cs_cbfuncwizchip_select wizchip_deselect
    reg_wizchip_spi_cbfuncwizchip_read wizchip_write/* W5500 Chip Initialization */ctlwizchipCW_INIT_WIZCHIP memsize
        printf"WIZCHIP Initialized fail.\r\n"while
Network 설정 함수

Network 정보들을 설정하기 위한 함수이다. 설정하는 정보들은 다음과 같다.

  • mac address
  • ip address
  • gateway
  • subnet mask
  • dns server

src 디렉토리에 w5500_init.c 파일에 다음의 함수를 구현한다.

 display_net_info
    wiz_NetInfo gWIZNETINFO

    ctlnetworkCN_GET_NETINFOgWIZNETINFO
    printf"MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n" gWIZNETINFO gWIZNETINFO gWIZNETINFO gWIZNETINFO gWIZNETINFO gWIZNETINFO
    printf"IP: %d.%d.%d.%d\r\n" gWIZNETINFO gWIZNETINFO gWIZNETINFO gWIZNETINFO
    printf"GW: %d.%d.%d.%d\r\n" gWIZNETINFO gWIZNETINFO gWIZNETINFO gWIZNETINFO
    printf"SN: %d.%d.%d.%d\r\n" gWIZNETINFO gWIZNETINFO gWIZNETINFO gWIZNETINFO
    printf"DNS: %d.%d.%d.%d\r\n" gWIZNETINFO gWIZNETINFO gWIZNETINFO gWIZNETINFONet_Conf
    wiz_NetInfo gWIZNETINFO // Mac address// IP address// Gateway// Subnet mask// DNS Server

    ctlnetworkCN_SET_NETINFOgWIZNETINFO

    display_net_info

Main 함수 구현

W5500-EVB.c 파일내의 main 함수를 다음과 같이 구현한다.

#if defined (__USE_LPCOPEN)#if !defined(NO_BOARD_LIB)// Read clock settings and update SystemCoreClock variableSystemCoreClockUpdate// Set up and initialize all required blocks and// functions related to the board hardwareBoard_Init// Set the LED to the state of "On"Board_LED_Set#endif#endif
    SPI_Init
    W5500_InitNet_Confwhilereturn

W5500-EVB.c 파일에 헤더 파일 include 루틴을 추가한다.

#include"spi_handler.h"#include"w5500_init.h"

Firmware 적용 및 테스트

※ W5500-EVB 연결 후 RS232 Driver를 설치해야 Serial 기능을 사용할 수 있다. RS232 Driver는 다음 링크에서 다운받을 수 있다.
다운로드

먼저 W5500-EVB를 ISP 모드로 동작시키기 위해서 ISP 버튼을 누른 상태에서 Reset 버튼을 누른다.

Flash Magic 프로그램을 실행시킨다.
먼저 Step1 설정을 진행한다. Chip은 “LPC11E36/501″을 선택하며, 시리얼 설정은 각자 자신의 환경에 맞게 설정한다.

Step2에 “Erase all Flash+Code Rd Prot” 부분을 체크한다.

Step3에 앞의 과정에서 생성한 Firmware Hex 파일을 지정한다. Firmware 파일은 프로젝트 내의 Debug 디렉토리 내에 존재한다.

Start 버튼을 누르면 Firmware 이미지가 보드에 적용된다.

시리얼 터미널 프로그램을 실행시킨 후, 보드 Reset 버튼을 누르면 다음과 같은 Network 설정 메시지들을 볼 수 있다. 동일 네트워크 상에서 보드에 설정된 “192.168.1.100”으로 ping을 보내면 정상 동작하는 것을 볼 수 있을 것이다.

소스 파일 : 다운로드, localcopy(src.zip)


프로젝트 파일 : 다운로드, localcopy(w5500_evb_project.zip)



B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.