직접 Maker가 만들고 공유하는 다양하고 유용한 WIZnet TCP/IP Ethernet Controller Driver

Written by MC


Overview

WIZnet는 W3100(단종)을 시작으로 W3150A+, W5100, W5200, W5300, W5500 등 개선되고 안정화된 TCP/IP Chip을 선보이고 있으며, 전세계의 많은 개발자와 Maker에게 지속적인 관심을 받고 있다.

위즈네트는 큰 사랑을 받은 W5100의 성능을 개선하고 가격을 낮춘 W5100S를 최근 출시하였고, 곧 다가올 IPv6 IoT 시장에 대응할 수 있는 Dual TCP/IP Stack(IPv4 & IPv6) 지원하는 W6100을 곧 출시할 예정이다.

위즈네트는 공식적으로 W5xxx Series을 통합 운영할 수 있는 ioLibrary를 제공하고 있으며, 이는 사용자 Application의 수정을 최소화하고, 손쉽게 새로운 칩으로 변경할 수 있도록 한다.

그리고, W6100에 대한 io6Library 또한 Github를 통해 제공될 예정이다.
ioLibrary에 익숙한 사용자라면 io6Library 역시 손쉽게 사용할 수 있을 거라 기대한다.

이 글에서 소개하고자 하는 것은 위즈네트의 공식 ioLibrary가 아닌, 위즈네트 뮤지엄에서 소개하고 있는 전세계 Maker나 개발자가 개발한 유용하고 다양한 Library를 소개하고자 한다.

소개할 Library는 다음과 같다.

Arduino Library

Official Arduino Library

Aurdino Library는 전세계 Maker에게 가장 사랑받고 활용되고 있는 Library이다. 누구나 손쉽고 빠르게 개발할 수 있는 장점은 있지만, 단순한 Library 구조로 위즈네트 Chip이 제공하는 세부적인 기능을 제어하기에는 한계가 있다.

이러한 단점에도 불구하고, 전세계 Maker들에게 지속적으로 사랑받고 활용되는 이유는, 손쉽게 동작할 수 있는 다양한 Example을 제공하고, 전세계 Maker들이 함께 만들어가는 Library로 github에 공유되어 W5100, W5200, W5500, W5100S, W6100 등을 Runtime에 지원하는 Library를 제공한다.

Multicasting Arduino Library

이 Library는 Arduino Library가 지원하지 않는 UDP Mutilcasting 구현을 위한 Library를 제공한다. 저자는 udp.h 와 udp.c에서 UdpClass::begin() 함수와 같은 UdpClass::beginMulti() 추가하여 구현하였다.

필자 생각에는 UdpMultiClass를 원본 Library를 수정하지 않고, UdpClass 상속 받아 beginMulti()를 추가하는 것이 활용도 면에서 좋을 것으로 판단된다.

 
   class UdpMultiClass : UdpClass {
      public:
      void beginMutli(uint16_t portMulti, uint8_t * addrMulti);
   }

   void UdpMutiClass::beginMulti(uint16_t portMulti, uint8_t * addrMulti) 
   {
      _port = portMulti;
      _sock = 0; //TODO: should not be hardcoded
      // set destination IP
      W5100.writeSnDIPR(_sock, addrMulti);
      W5100.writeSnDPORT(_sock, portMulti);

      socket(_sock, SnMR::UDP, _port, 0x80);
   }
 

[Refer to WIznet Museum]
[Download Library]
[How to Use]

Non-blocking Arduino Library

Non-Blocking Arduino Library는 Arduino Board가 DHCP Server로 부터 IP address는 할당받거나, DNS 요청이 Blocking 되어 수초 동안 아무런 동작도 하지 않는 Standard Library를 Blocking 되지 않도록 일부 코드를 수정한 것입니다. 저자와 같은 고민을 해본 분들에게 도움이 될 만한 Library입니다.

[Refer to WIznet Museum]
[Download Library]
[How to Use]

FreeRTOS Library

FreeRTOS 기반에 동작하는 ATmega MCU의 WIZnet Library로 WIZnet가 제공하는 초기 ioLibrary로 구현되었습니다.

이 Library는 RTOS 기반의 Application에서 WIZnet Library가 어떻게 활용될 수 있는지 잘 보여줍니다.
저자는 그외에도 FreeRTOS 기반의 uIP Stack도 지원하고 있으며, 이는 WIZnet의 Hardware TCP/IP stack과 Software Stack를 손쉽게 비교할 수 있습니다.

또한, 이 Site는 WIZnet Chip의 MACRAW SOCKET 기능을 활용하여 uIP Stack을 구현하는 Library도 제공하고 있습니다. 여기를 참조하세요.

[Refer to WIznet Museum]
[Download Library]
[How to Use]

ATmega Library

ATmega Library는 W5100을 기반으로 하는 간단한 Library 입니다.
ermicor의 Library를 수정하여 만들었습니다.
이 Library는 ioLibrary를 필요한 기능만을 구현하여 아주 작게 만들었습니다.
아래 코드는 WIZnet Chip을 Access하기 위한 기본 IO library입니다.


void  W51_register(W5100_CALLBACKS  *pcallbacks)
{
    select = pcallbacks->_select;
    xchg = pcallbacks->_xchg;
    deselect = pcallbacks->_deselect;
    reset = pcallbacks->_reset;
    inited = FALSE;
    if ((select) && (xchg) && (deselect))  inited = TRUE;    // these functions must be valid
}
void  W51_write(unsigned int  addr, unsigned char  data)
{
    if (!inited)  return;                        // not set up, ignore request

    select();                                    // enable the W5100 chip
    xchg(W5100_WRITE_OPCODE);                    // need to write a byte
    xchg((addr & 0xff00) >> 8);                  // send MSB of addr
    xchg(addr & 0xff);                           // send LSB
    xchg(data);                                  // send the data
    deselect();                                  // done with the chip
}
unsigned char  W51_read(unsigned int  addr)
{
    unsigned char                val;

    if (!inited)  return  0;                     // not set up, ignore request

    select();                                    // enable the W5100 chip
    xchg(W5100_READ_OPCODE);                     // need to read a byte
    xchg((addr & 0xff00) >> 8);                  // send MSB of addr
    xchg(addr & 0xff);                           // send LSB
    val = xchg(0x00);                            // need to send a dummy char to get response
    deselect();                                  // done with the chip
    return  val;                                 // tell her what she's won
}

[Refer to WIznet Museum]
[How to Use]

PSoC Library

PSoC Library는 Cypress사의 PSoC4 & PSoC4에 동작하며, W5100, W5200, W5500을 통합한 Library이다. PSoC 사용자에게는 아주 유용한 Library가 될 것이다.

[Refer to WIznet Museum]
[Download Library]

Library for BASIC Language Users

이 Library는 특이하게 일반적인 C library가 아닌 Basic 언어로 작성된 Library이다.

PIC 과 ATmega MCU를 지원한다.

PIC Library

[Refer to WIznet Museum]
[Download Library]
[How to Use]

ATmega Library

[Refer to WIznet Museum]
[Download Library]
[How to Use]

BSD SOCKET

다음 표는 ioLibrary와 BSD Socket Library와의 지원 함수를 비교한 것이다.

ioLibrary BSD Sccket
socket() O O
bind() X O
listen() O O
accept() X O
send() & recv() O O
sendto() & recvfrom() O O
select() & poll() X O

WIZnet의 ioLibrary는 BSD Socket과 달리 bind()accept() 함수를 지원하지 않는다.

BSD Socket Library인 경우, 다음 그림처럼 bind()에 의해 source port가 할당되고 socket resource와 바인딩된다. 또한, client의 접속을 accept()를 통해 대기하며, client 접속 요구가 있을 경우, 새로운 socket을 생성하고 임의의 source port로 바인딩하여 이를 data communication socket으로 사용한다.

ioLibrary인 경우, BSD Socket의 socket()와 bind() 함수를 ioLibrary의 socket() 함수 하나로 통합되어 있다.

또한, 아래 그림처럼 Socket resource는 BSD와 달리 동적으로 할당받는 것이 아니라, 이미 Chip에 존재하는 Hardwired socket을 그대로 사용함ㅇ로 accept() 함수가 필요없다. 즉, ioLibrary의 listen socket은 client의 접속 요구를 항상 대기하고 있으며, client의 요구가 받아질 경우 곧바로 Data communication socket으로 역할을 변경한다. 여러 client의 접속 요구를 받아들이기 위해서는 client 수 만큼 listen socket을 생성하여야 한다.

이러한 차이에도 불구하고, WIZnet chip은 아래와 같이 BSD socket Library를 지원한다.

BSD Socket by using ioLibrary

이 Library를 위즈네트의 ioLibrary에 bind()와 accept() 함수를 추가 구현한 Library이다.
여기서 이 함수는 아래와 같이 empty function으로 구현하여 BSD와의 호환성만을 유지한 것 같다.


int accept(int s, struct sockaddr *addr, socklen_t *addrlen)
{
   return 0;
}
int bind(int s, const struct sockaddr *name, socklen_t namelen)
{
   return 0;
}

이것보다는 아래와 같이 구현하는 것이 좀 더 정확한 구현이 될 것이다.


int accept(int s, struct sockaddr *addr, socklen_t *addrlen)
{
   struct sockaddr_in * destaddr = (struct sockaddr_in *)addr;
   while(getSn_SR(s) != SOCK_ESTABLISHED)
   {
      if(getSn_IR(s) & Sn_IR_TIMEOUT) return -1;
   }
   destaddr->sin_family = AF_INET;
   destaddr->sin_port = getSn_DPORTR(s);
   destaddr.sin_addr.s_addr = ntohl(getSn_DIPR(s));
   return 0;
}
int bind(int s, const struct sockaddr *name, socklen_t namelen)
{
   setSn_PORTR(((struct sockaddr_in *)name)->sin_port);
   return 0;
}

[Refer to WIZnet Musuem]
[Download Library]

POSIX BSD Socket

POSIX BSD Library와 가장 유사하게 구현된 Library로 BSD Socket Library로 구현된 다양한 Application을 손쉽게 Porting 할 수 있다.
select()와 poll(), 그리고 getsockoptH()와 setsockopt() 함수도 구현되어 있다.


int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
    int ret;
    struct w5100_socket *s;

    s = get_socket_from_fd(sockfd);
    if (s == NULL)
    {
        ret = -1;
    }
    else if ( addr->sa_family != AF_INET )
    {
        errno = EAFNOSUPPORT;
        ret = -1;
    }
    else if (s->state != W5100_SOCK_STATE_CREATED)
    {
        errno = EINVAL;
        ret = 1;
    }
    else if (s->type == SOCK_STREAM)
    {
        struct sockaddr_in *server;
        uint8_t sr;
        uint8_t sr_end;

        (void)addrlen;
        server = (struct sockaddr_in *)addr;

        /* TODO: check if already in use EADDRINUSE */
        w5100_write_sock_regx(W5100_Sn_PORT, s->isocket, &server->sin_port);
        w5100_command(s->isocket, W5100_CMD_OPEN);
        sr_end = W5100_SOCK_INIT;
        do {
            sr = w5100_read_sock_reg(W5100_Sn_SR, s->isocket);
        } while (sr != sr_end);
        s->sockname = *server;
        s->state = W5100_SOCK_STATE_BOUND;
        ret = 0;
    }
    else if (s->type == SOCK_DGRAM)
    {
        struct sockaddr_in *server;
        (void)addrlen;

        server = (struct sockaddr_in *)addr;
        bind_udp(s, server->sin_port);
        ret = 0;
    }
    else
    {
        /* TODO: RAW */
        errno = EBADF;
        ret = -1;
    }
    return ret;
}

[Refer to WIZnet Musuem]
[Download Library]
[How to Use]


블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

HTTP SD Card File Server on WIZwiki-W7500 platform

WIZwiki-W7500 platform과 ARMembed Web-Compiler를 이용하여, Web-Browser 상에서 SD File 목록을 볼 수 있도록 하는 프로그램을 작성해 보자.

Import Program on ARMmbed developer site

mbed 사이트에는 다양한 Example이 존재한다. 직접 모든 code를 작성할 수 있지만, Open source를 활용하면 손쉽고 빠르게 원하는 프로그램을 구현할 수 있다.

Search a program

mbed 검색에서 우리가 원하는 응용프로그램을 Key Word는 HTTP와 SD로 검색해 보자.
다행히 원하는 프로그램을 다음과 같이 볼 수 있다. 자 Import 하자.

주의  : 프로그램 작성 시 검색이 되었지만, 현재 검색이 되지 않는 관계로 아래 URL을 참조하자.
       https://developer.mbed.org/teams/FRDM-K64F-Code-Share/code/HTTP_SD_Server_K64F/

 

Import program

해당 Program을 성공적으로 Import 했을 경우 다음과 같이 Web-Compiler의 Program Workspace 창에 나타난다.

 

Select a platform

ARMmbed Web-Compiler의 우측 상단의 [mbed LPC1768] icon을 클릭하고, [Add Platform]을 눌러 Platfrom 목록에서 WIZwik-W7500 Platform를 찾아 선택하자.

WIZwiki-W7500 Platform을 선택할 경우 Web-Browser의 우측 창에 다음과 같이 나타난다.
[Add to your mbed Compiler] 버튼이 없을 경우 아래 Example programs 중 하나를 Import하면 WIZwiki-W7500 Platform을 당신의 mbed-Compiler에 추가할 수 있다.

 

How to port mbed-LPC1768 into WIZwiki-W7500

mbed-rtos 는 현재 사용하지 않는 라이브러리이므로 삭제(우 클릭 후 delect 선택)한다. 또한 lwip 기반의 EthernetInterface Library를 WIZnetInterface Library로 변경(삭제 후 추가)한다.

WIZnetInterface Library는 https://developer.mbed.org/teams/WIZnet/에서 Import 할 수 있다. (현재 검색이 잘 안되니, URL 참조).
WIZnetInterface Library를 Example HTTP_SD_Server_K64F 프로그램으로 import 한다.

 

Compile HTTP_SD_Server_K64F example for WIZwiki-W7500

지금까지 잘 따라 왔다면, 다음과 같이 Platform과 Library를 성공적으로 변경했을 것이다. 자 이제 과감하게 컴파일을 해보자.

[Compile] 버튼을 누르자. 다음과 같은 Error가 발생한다.

Can not open source input file "device.h" : No such file or directory "#include "device.h""

이 Error는 mbed Library가 Update 되지 않기 때문에 발생한다. 이를 해결하기 위해서는 [Program Workspace] 창의 “mbed” Library를 더블클릭하고, [Library Details] 창의 “Update” 버튼을 눌러 mbed Library를 Update한다.

다시 컴파일하자. 그럼 SDFileSystem 에서 4개, eth.init()에서 1개 총 5개의 Error가 발생한다.

4 Error : SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd");
1 Error : eth.init();

 

main.c

//SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // K64F
SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); // WIZwiki-W7500
  • Ethernet Initialization
    eth.init() 대신 DHCP를 사용할 경우 eth.init(MAC) 를 사용하고, Static IP를 사용할 경우 eth.init((uint8_t*)MAC,IP,MASK,GATEWAY)를 사용한다. 여기서는 static IP를 사용한다.
#define MAC     "\x--\x--\x--\x--\x--\x--"   // Should be Replaced -- with your MAC
#define IP      "192.168.77.100"             // Should belong with your lan.
#define MASK    "255.255.255.0"
#define GATEWAY "192.168.77.1"
//eth.init((uint8_t*)MAC);    // Use DHCP for WIZnetInterface
eth.init((uint8_t*)MAC,IP,MASK,GATEWAY);  //IP,mask,Gateway

 

Upload the binary image on WIZwiki-W7500

WIZwiki-W7500은 CMSIS-DAP를 지원하여, W7500의 Code flash가 USB storage로 인식된다. Web-compiler에서 compile을 성공적으로 마쳤을 경우, Binaray Image를 Download할 수 있게 된다. 이때, Local Directory로 저장한 후 해당 Binary image를 WIZwiki-W7500의 USB storage(MBED)로 copy 하거나, image를 바로 MBED로 저장하면 된다.

 

Demos

해당 Project는 아래 URL이나 WIZwiki-W7500 Example programs에서 Import할 수 있도록 만들어 두었다.
동작 상태를 확인하기 위해 Ticker를 활용하여 LED1 LED2를 On/oFF toggle하는 코드도 추가되었다.

 

Initialization

 

Connect to WIZwiki-W7500 through Web-Browser

  • Terminal

  • Web-Browser

 

Click [img] directory

 

Click [WIZnet_log_IoT.png] file

블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

WIZWiki-W7500 Platform on ARMmbed

mBed Platform WIZwiki_W7500에 대해 간략히 살펴보고, mbed web-compiler를 활용g하는 방법을 알아보자.

mbed Platform WIZwiki-W7500

WIZnet사에서 개발한 W7500 - Cortex M0 + TCP/IP Core + 128KB flash + 16KB Ram - mcu를 기반으로 하는 Open source hardware platform으로, ARMmbed enabled Platform 이다.
자세한 내용은 wizwiki를 참조하세요.

 

  • Block Diagram
    WIZWiki-W7500 보드는 크게 3개의 Main IC - W7500, Ethernet PHY, MCU for debugging - 로 구성된다.
    ARMmbed enabled 지원을 위한 CMSIS-DAP을 내장하고 있어, mbed Web-Compiler로 통해 만들어진 binary image를 USB storage로 인식된 W7500의 Code flash로 단순히 copy하는 것만으로 Firmware를 Upload할 수 있다.

 

  • Part Layout

  • Extension Pin - Arduino Compatible
    WIZwiki-W7500의 확장 핀들은 Aruduino Board와 호환가능하도록 설계되어 있으며, 각종 Arduino Shield 들과 Stacking 할 수 있어 다양한 응용을 개발 할 수 있다.

ARMmbed

ARMmbed는 CortexM 계열의 ARM 개발자들을 위한 Open Community 사이트다. Web 개발 환경을 무료로 제공할 뿐 아니라, 개발자끼리 서로 code를 공유할 수 있다. ARM은 Silicon Partner와 Platform Partner와 같은 Eco-system을 제공하고, 개발자들은 자유롭게 이를 활용하여 손쉽게 빠르고 원하는 제품을 개발할 수 있도록 도와 준다.
ARMmbed에 접속을 하고 Sign-up 후 Web-Compiler를 무료로 사용할 수 있다.
다음 그림 우측 상단 Red Box 참조.

Web-Compiler

다음은 mbed Web-Compiler를 실행한 화면이다. 자신이 원하는 Example이나 응용을 찾아서 import Program 혹은 Import Library를 하면 자신의 Web-Compiler에 import한 Program이나 Library가 로딩된다.

 

How to import a program or library to your web-compiler

mbed developer site에서 원하는 program이나 library의 Keyword로 검색을 하고, 해당 프로그램을 click하자.

 

  • import
    해당 프로그램을 클릭할 경우 우측 상단에 [Import this program] 이나 [Import this Library]를 클릭하여 자신의 Web Compiler로 Loading 한다.

블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

ioLibrary 100% 활용하기 (1)


ioLibray ?

ioLibrary는 WIZnet의 W5XXX(W5100,W5200,W5300,W5500) 기반의 통합 BSD socket Library를 제공한다.
칩별로 차이가 있는 Hardware dependent code들을 Driver로 분리하여 각각 구현되었고, 이를 이용하여 BSD Socket API를 구현함으로써, Webserver, FTP와 같은 Application Protocol을 구현함에 있어 Hardware적 제약 조건으로부터 자유로워질 수 있으며, Application의 최소한의 수정으로 쉽게 원하는 WIZnet Chip들로 Porting이 가능하다.

ioLibrary 특징

  • DRIVER 분리
    • Basic IO function
      1. WIZCHIP_READ and WIZCHIP_WRITE
      2. 모든 Register & Memory Access를 WIZCHIP_READ & WIZCHIP_WRITE로 통일
      3. Hardware dependent I/F code는 Callback Function으로 분리
      4. Driver 수정없이 callback function 등록만으로 바로 사용
    • Extra Function
      1. Optional : Omissble for code optimization
      2. User-freindly name : 같은 기능 다른 이름의 Register 들을 통일
  • SOCKET API
    • Berkeley Socket API와 유사
    • 네트워크 응용 개발 경험자들은 쉽게 ioLibrary 활용 가능
    • 모든 함수의 상황별 Error Code 지원
    • Blocked or Non-Blocked function 지원
    • Datagram Data 처리의 유연성 : 한 Packet을 원하는 크기로 나누어 수신 가능
  • APPLICATIION PROTOCOL
    • 더욱 풍부해지는 Standard application protocol
    • WIZnet Chip별로 각각 제공되는 Application protocol을 Chip에 관계없이 재사용 가능
  • User Application
    • Easy to migration
    • Easy to upgrade
    • Easy to Maintainment
  • The smallest resouces usage for TCP/IP stack
  • The highest performance at the same board

ioLibrary Version 3.0 Directory 구조

  • [ioLibrary]
    • [Ethernet]
      • wizchip_conf.h & wizchip_conf.c
      • socket.h & socket.c
      • [W5100]
        • w5100.h & w5100.c
      • [W5200]
        • W5200.h & W5200.c
      • [W5300]
        • w5300.h & w5300.c
      • [W5500]
        • w5500.h & w5500.c
    • [Internet]
      • [DHCP]
        • DHCP.h & DHCP.c
      • [DNS]
        • dns.h & dns.c
      • [FTPClient]
        • ftpc.h & ftpc.c
        • stdio_private.h
      • [FTPServer]
        • ftpd.h & ftpd.c
        • stdio_private.h
      • [httpServer]
        • httpParser.h & httpParser.c
        • httpServer.h & httpServer.c
        • httpUtil.h & httpUtil.c
      • [SNMP]
        • snmp.h & snmap.c
        • snmap_custom.h & smtp_custom.c
      • [SNTP]
        • sntp.h & sntp.c
      • [TFTP]
        • tftp.h & tftp.c
      • [Others Will be Added]

Download

[Download on GitHub]

How to Porting into your application

  • TODO
  • How to Register your call-back functions

Refer to My post - W5500 ioLibrary_BSD를 MCU 8051에 포팅하기(1)~(8)

목차

  1. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(1)
  2. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(2)
  3. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(3)
  4. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(4)
  5. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(5)
  6. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(6)
  7. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(7)
  8. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(8)

블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

Using the Arduino Ethernet shield with AMICUS18 (Part 1~4)

by HenrikOlsson

저자는 http://www.picbasic.uk 의 Forum에 적극적으로 활동하고 있으며, picbasic의 Forum에서 PIC 기반의 AMICUS18 Open source hardware board에 Arduino Ethernet Shield를 사용하는 방법을 공유하였다. pisbasic에서 그의 Forum 내용을 총 4회 걸쳐 기사화 하였다.


AMICUS18 board

PIC 기반의 Arduino Comapatible board로 Crownhill’s Proton BASIC 언어의 개발환경을 제공한다.


Part 1

Part 1에서는 Arduino Ethernet Board를 AMICU18 Board에 연결하기 위해 SPI 신호 핀을 연결하는 방법을 설명한다.

  • AMICUS18 board는 ICSP HEADER가 없으므로, SD 카드와 Ehternet을 사용하기 위해 Ethernet Shield를 수정하고 연결하는 방법을 설명한다.

[Learn More…]


Part 2

Part 2에서는 PIC MCU의 UART 및 SPI Interface 제어를 위한 코드와 W5100 Memory Map 정의 파일을 설명한다.

  • Code

    ' By default the AMICUS18 board uses the PIC18F25K20, make sure to
    ' set up MCSP or whatever IDE is being used to compile for the
    ' correct device.
    
    DEFINE OSC 64
    DEFINE LOADER_USED 1            ' We're using a bootloader.
    DEFINE HSER_RCSTA 90h           ' Enable serial port & continuous receive
    DEFINE HSER_TXSTA 24h           ' Enable transmit, BRGH = 1
    DEFINE HSER_CLROERR 1           ' Clear overflow automatically
    DEFINE HSER_SPBRG 138           ' 115200 Baud @ 64MHz, -0,08%
    
    SPBRGH = 0
    BAUDCON.3 = 1                   ' Enable 16 bit baudrate generator
    
    TRISC = %10010111
    ' RC7: USART RX
    ' RC6: USART TX
    ' RC5: ETHERNET SPI Data out (SDO/MOSI)
    ' RC4: ETHERNET SPI Data in (SDI/MISO)
    ' RC3: ETHERNET SPI clock (SCK) set to INPUT according to datasheet....
    ' RC2: N/U - currently
    ' RC2: N/U - currently
    ' RC1: N/U - currently
    
    TRISB = %11011011
    ' RB7: N/U - currently
    ' RB6: N/U - currently
    ' RB5: ETHERNET Chip select line to W5100
    ' RB4: N/U - currently
    ' RB3: N/U - currently
    ' RB2: ETHERNET Chip select line to SD-Card
    ' RB1: N/U and can not be used with the Ethernet shield
    ' RB0: ETHERNET Interrupt pin from W5100
    

[Learn More…]


Part 3

Part3에서는 WIZnet W5100 Interface Routine code를 작성하고, 이를 이용하여 Network Information을 설정 후 Ping test를 통해 W5100 Internet 통신을 확인한다.

  • Ping Test

[Learn More…]


Part 4

Part4에서는 WIZnet W5100 Internet 송수신을 위한 Routine을 작성하고 이를 이용하여, Web Client의 Request Message를 UART 출력을 통해 보여준다.

  • HTTP Request

[Learn More…]


[Goto Original Forum]

블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

ARM Cortex M3 Dev Board

by Nathan Zimmerman


Alt Text

Nathan Zimmermanl has been aiding in developing an Embedded 2 class of North Dakota State University(NDSU) . For the class he attempted to develop a flexible and cheap dev board that could host numerous advance applications such as Ethernet and USB.
He selected the WIZnet W5200 for cheaper & easiser Ethernet solution.


Dev Board Features:

  • LPC1768 ARM Cortex M3 MCU
  • W5200 SPI based Ethernet Controller
  • 160×128 Color LCD Display
  • FTDI FT232 VCP USB
  • 2nd USB port hooked directly to the LPC1768 for more advance USB applications
  • 6 LEDs, 4 push buttons, 1 potentiometer
  • NRF24L01 SPI Wireless Module
  • Can be powered via USB or wall-wart plugin
  • Micro is modular and thus can be easily replaced
  • Raw part costs for these boards at quantity x10 is roughly 70 usd.

The board is compatible with the following IDE’s / JTAG Programers:
LPC Xpresso Board & Code Red IDE (+ FreeRTOS)
Ulink2 Programer & Keil IDE


Learn More…
He made DIY Walking Desk using WIZnet Wifi solution WizFi210.


블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

Uber Home Automation

 

말그대로 Home-Automation 응용의 결정판을 보여주는 아주 좋은 Eric Tasi 님의 Project가 있어 소개합니다.

Auduino, Aurdion Ethernet Shield, Raspberry Pi를 이용하여 우리가 상상할 수 있는 대부분의 Home-automation 기능을 구현한 Project입니다.

 

Eric Tsai님의 시작 동기가 재미 있네요.

몇년전 개를 처음으로 키우기 시작했고, 개를 보기 위해 Webcam을 설치하였으나, 하루종일 Webcam을 볼수 없었기에, 개가 어떤 상황에 처해있는지 화재발생으로 위험하지 않는지 등을 고민하기 시작하면서 하나씩 완성해나간 Project 입니다. 

Eric Tsai님이 자신이  "개를 키우고 있으며, 전자기기를 만든 것을 좋아하며, Youtube의 동영상 제작 및 좋은 사진을 만들기 등을 천천히 배우며 익혀간다" 소개하고 있습니다. 개를 사랑하는 맘이 전해지네요.

 

전등 제어는 기본이고, 가스누출 및 화재 감지, 세탁실 누수 감지, Door Bell 및 메일박스 알림, 온 습도 모니터링, 주차장 제어, 애완견 소리 감지 뿐만 아니라 Smart-meter까지 구현되어있으며, 각 상황등을 Email 알림뿐만 아니라 Audio notification까지 제공하는 그야말로 Home-Automation의 결정판입니다.

중요한 것은 이 모든 것이 Open-source Hardware 기반으로 만들어졌다는 것이며, 사용된 모든 제원들이 다 Open되어 있다. 또한 OpenHAB 과 같은 Cloud service까지 연동된다는 것이다.

당장 제품화 시켜도 손색이 없을 정도의 Qaulity를 가지고 있다.

 

 

간략히 살펴보면,

Sensor 제어 및 Control을 하는 Node Device는 Arduino Board를 이용하였고,

각 Node 의 Sensor data gathering 및 Remote control을 Auduino Ethernet Shield를 이용하였으며,

Cloud Service를 위해 Raspberry Pi를 이용하였다.

 

 

Eric Tsai님은 자신이 구현한 모든 과정을 16단계로 소개하고 있으며, Taste (미각)을 제외한 센싱가능한 모든 Device를 활용하고 있습니다.

 

Hearing : Dog bark , Washer-dryer sensing

Sighting : Light sensor, Area intrusion monitor

Smell     :  Gas/Fire/Smoke Sensor

Touch    : 온습도 Sensor, 누수 감지

Taste    :  Sensor가 없어 구현하지 못함. 있으면 구현하겠다고 함.

Security : Door, Window, Drawer , Mail-box

Garage Monitor

 

Homeautomation에 관심있으신 분들은 많은 아이디어와 도움을 받을 수 있을 것입니다.

 

관련 링크

http://www.instructables.com/id/Uber-Home-Automation/?ALLSTEPS

https://github.com/homeautomationyay/OpenHab-RFM69

http://www.hackster.io/erictsai/uber-home-automation?ref=userrespected&ref_id=1326&offset=0

 

블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

 

고양이가 드나드는 출입문에 센서를 장착하여

고양이기 들어오면 twit을 해주고

깜직한 토끼가 반겨주는 것이 재미 있네요.

 

http://hackaday.com/2012/03/09/pushingbox-alerts-you-of-your-cats-roaming-habits/

 

 

 

블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

Notifying Doorbell with PushingBox

 

 

Notifying Doorbell with PushingBox

 

요즘 IOT와 Cloud Service가 접목된 다양한 응용을 볼 수 있습니다.

여기서 소개하고자 하는 것 또한 IOT Cloud 제품입니다. 본 제품은 방문자가 도어벨을 눌렀을 경우 사진과 함께 이메일로 알려주는 편리한 기능을 제공합니다.

IOT는 도어벨, 아두이노, 이더넷실드로 구성되어 있으며, Cloud Sevice는 PushingBox라는 무료서비스를 이용합니다. IOT와 Cloud의 접목를 잘 보여주는 예입니다.

PushingBox는 IOT의 request를 Push, Tweet, e-mail 등 다양한 알림서비스를 제공한다.

http://www.pushingbox.com/ 에 들어가면 자세히 설명되어 있으니 참고하라.

 

 

Makezine에 11가지 단계의 설명, 데모영상 뿐만 아니라 소스코드까지 자세히 포스트되어져 있으니 관심있는 분들은 참고하세요.

 

 

Nowadays, We can see a variety of applications that combine IOT with Cloud service.

We also introduce one of IOT-Cloud sevices that the door-bell notifies to you by  e-mail when visitor press your door-bell. These service provides a convenient when you are not in you home.

 

IOT consists of 11-steps tutorial, demo-movie, and source codes.

A Cloud sevice is provided by the PushingBox.

PushingBox is free software  that can send notifications based on API calls.
From one request, you can send several notifications like a Push, a Tweet, an Email... All this in real time.

For more detail, refer to http://www.pushingbox.com/.

.

 

This posted on the Makezine with 11-step tutorial, Demo-movie and source codes. If you interest in these product, visit on makine website.

 

http://makezine.com/projects/notifying-doorbell-with-pushingbox/

 

 

 

블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

<목차>

1. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(1)

2. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(2)

3. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(3)

4. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(4)

5. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(5)

6. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(6)

7. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(7)

8. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(8)

 

3. Test Board 만들기

 

먼저 SiLab사의 C8051F380-TB board와 WIZnet사의 WIZ550io 모듈을 준비하고, Breadboard나 만능키트, 점퍼선등을 준비해 둔다.

 

C8051F380-DK board는 다행히 모든 IO PIN들이 PIN Header (J2, J3,J4,J5,J6) 5개로 모두 나와있으며 또한 96PIN PCN connector(J13)에도 나와 있다. 다행이 PCN connector를 보유하고 있어 Breadboard와 연결하여 사용할 예정이다. 이 Connector가 없을 시는 J3~J6 PIN Header와 Jumper선을 사용하여 연결해도 무방하다.

 

http://www.silabs.com/Support%20Documents/TechnicalDocs/C8051F38x-DK.pdf 

 

 

 

C8051F380의 IO 핀들은 기본적으로 GPIO 핀으로 사용되며, CrossBar 를 통해 SPI나 UART 기타 Peri등의 IO 핀으로 Switching 될 수 있다. Crossbar 설정에 따라 PIN의 위치가 변경되므로 Test 보드를 만들기 전에 SPI IO 핀들이 어떤 포트로 연결되는지 숙지하여야 한다. 다행히 Simplicity Studio의 Configuration Wizard2라는 Tool을 지원한다.

 

Configuration Wizard2를 실행하여 C8051F380을 선택한다.

 

 

[OK] 버튼을 누르면 Menu에 Peripherals가 추가 되고 하위메뉴 Port I/O를 선택하면 다음처럼 Port I/O 핀을 설정할 수 있다.

 

 

Pin Skip Check Box를 이용해 SPI IO 핀들을 원하는 포트 핀으로 이동할 수 있는 장점이 있다.

여기서는 Serial Debugging Message 출력을 위해 UART0 을 P0_4(TXD), P0_5(RXD)로 선택하고, SPI IO는 Port Skip 없이 기본설정으로 P0_0(SCLK), P0_1(MISO), P0_2(MOSI), P0_3(NSS)로 설정한다.

Configuration Wizard2 가장 큰 매력은 설정된 핀에 따른 Register 설정 코드를 자동으로 생성해준다는 것이다. 이것은 UART & SPI 드라이버를 구현할 때 많은 도움이 된다. 이부분은 계속 언급될 것이므로 이정도만 알고 패스~~~!!!

 

 

WIZ550io는 WIZnet사의 W5500 칩을 기반을 하는 Network Module이다. WIZ550io는 SPI 인터페이스만을 지원하고, Open source hardaware platform인 Arduino, GR-Kurumi, LaunchPad에 장착될 수 있는 Shield I/F board도 함께 지원한다. 또한 Arduino Sketch Library 로 포팅되어 있어 손쉽게 개발할 수 있다.(http://wizwiki.net/wiki/doku.php?id=ioshield)

 

WIZ550io의 상세 스펙은 http://wizwiki.net/wiki/doku.php?id=products:wiz550io:allpages 를 참조한다.

 

 

 

자 그럼 이제부터 본격적인 Test Board를 만들어 보자.

보드 제작에 앞서 간단한 회로도를 만들어 보자. 물론 회로도 없이 간단히 만들수도 있지만, 시간이 지나면 어떻게 만들었는지 기억이 나지 않는 경우가 대부분이기 때문에 나중을 위해서라도 간단하게나마 회로도를 작성하는 습관을 가져야 한다.

 

 

 

WIZ550io의 RSTn과 INTn 핀들은 각각 C8051F380의 P1_0과 P0_6 핀들로 연결한다. 이때 WIZ550io RDY 핀은 사용하지않는다.

 

<주의> RDY핀은 WIZ550io 자체 MCU가 W5500의 Network configuration을 완료했을때  High로 된다. RDY PIN은 보다 안정적인 WIZ550io 제어를 위한 Option PIN이다. 개발코저하는 Target B/D의 GPIO 핀이 부족할 경우 GPIO 핀에 연결하지않고 대신 200ms 정도 Delay를 준 후 WIZ550io를 Access해도 무방하다.

 

핀 연결을 다시 한번 정리하면.... 

 

 Signal Name

C8051F380 PIN 위치

 WIZ550io PIN 위

SPI : SCLK

P0_0 (J13:C12, J2:1) 

J1:5

 SPI : MISO

P0_1 (J13:B12, J2:2)

J1:4 

SPI : MOSI

P0_2  (J13:A12, J2:3)

J1:3

 SPI : SCS

P0_3 (J13:C11, J2:4)

J1:6 

 Interrupt

P0_6 (J13:C10, J2:7)

J2:5 

 RESET

P1_0(J13:C21, J3:1)

J2:3 

 3.3 VDD

J13:A1  

J1:7, J1:8, J2:1 

 GND

J13:B1

 

 

자 이제 회로도가 완성되었으니, 점퍼선을 이용하여 실수 없이 납땜하여 잘 연결해 보도록 하자.

보드를 만들고 전원을 인가하기 전에 반드시 단선이 없는지 회로도대로 연결되었는지, VDD와 GND는 쇼트되지 않았는지 확인하자.

 

 

 

드디어 테스트 보드 완성.  짜잔 !!! (물론 이보드 제작는 Dokkodai님이 도와주셨슴돠!!!)

긴장된 맘으로 WIZ550io를 연결한 후 Power를 인가한다.  별 문제없으면 통과...휴==3

 

 

 

자 이제 MCU 8051에 ioLibrary_BSD 를 포팅할 모든 준비가 끝났다.

다음 연재에 계속 ~~~

 

 

< PREV                                                                                                          NEXT >

블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자