본문 바로가기

RaspberryPi/RP2350

[RP2350 SM] W6300 테스트 개발환경 설정

RP2350을 이용하여 W6300을 테스트 해보자

먼저 하드웨어 적으로 QSPI로 연결한다.

 

[W6300 SSM] 보드는 표준 핀맵의 SPI로 할당되어 있고 나머지 핀에 QSPI 핀이 할당되어 있다.

 

RP2350은 QSPI 하드웨어 블록은 플래시 메모리에 할당되어 있기 때문에 PIO로 생성해 주어야 한다. 위즈넷에서 wizchip_qspi_pio.pio 형태로 제공하고 있다.

제공되는 pio핀맵 특성상 핀들은 연속되게 설정되어야 한다. 연속되지 않는다면 PIO관련 코드 수정이 필요하다. RP2350 SSM EXP 보드에선 GP12~19에 할당되어 있으므로 제공 코드를 수정해 주었다.

#elif (DEVICE_BOARD_NAME == W6300_EVB_PICO || DEVICE_BOARD_NAME == W6300_EVB_PICO2)
#define USE_PIO
/*
#define PIN_INT                 15
#define PIN_CS                  16
#define PIO_SPI_SCK_PIN         17
#define PIO_SPI_DATA_IO0_PIN    18
#define PIO_SPI_DATA_IO1_PIN    19
#define PIO_SPI_DATA_IO2_PIN    20
#define PIO_SPI_DATA_IO3_PIN    21
#define PIN_RST                 22
*/

#define PIN_INT                 12
#define PIN_CS                  13
#define PIO_SPI_SCK_PIN         14
#define PIO_SPI_DATA_IO0_PIN    15
#define PIO_SPI_DATA_IO1_PIN    16
#define PIO_SPI_DATA_IO2_PIN    17
#define PIO_SPI_DATA_IO3_PIN    18
#define PIN_RST                 19
#else

 


W6300을 사용하기 위해 최신의 ioLibrary Driver 라이브러리가 필요하다.

그리고 Raspberry Pi Pico(RP2350, RP2040) 에서 W6300의 QSPI로 제어 할수 있는 코드도 필요하다.

https://github.com/WIZnet-ioNIC/WIZnet-PICO-C/tree/main/port/ioLibrary_Driver/src

 

Pi Pico SDK 프로젝트를 생성하고 생성한다.

 

 

최신의 라이브러리와 QSPI 제어 함수를 Ethenet 폴더에 넣고 CMakeLists 파일에 등록해주면 된다.

 

 

CMakeLists.txt 파일 수정

W6300관련 라이브러리 파일을 임포트하고 헤더 파일을 설정해 주자.

# Add executable. Default name is the project name, version 0.1
add_executable(rp2350_w6300_test rp2350_w6300_test.c 
        Ethernet/socket.c
        Ethernet/wizchip_conf.c
        Ethernet/w6300/wizchip_spi.c  
        Ethernet/w6300/w6300.c 
        Ethernet/w6300/wizchip_qspi_pio.c
        Ethernet/w6300/wizchip_gpio_irq.c
)

# Add the standard include files to the build
target_include_directories(rp2350_w6300_test PRIVATE
        ${CMAKE_CURRENT_LIST_DIR}
        ${CMAKE_CURRENT_LIST_DIR}/Ethernet
        ${CMAKE_CURRENT_LIST_DIR}/Ethernet/w6300             
)

 

 

RP2350은 QSPI 하드웨어 블록이 없기 때문에 PIO기능을 이용하여 구현해야 하는데 wizchip_qspi_pio.pio 파일을 지정해 주면 된다.

# PIO 헤더 자동 생성
pico_generate_pio_header(rp2350_w6300_test ${CMAKE_CURRENT_LIST_DIR}//Ethernet/w6300/wizchip_qspi_pio.pio)

 

 

 WIZNET 칩 정보, W6300의 인터페이스 모드를 설정 해준다.

set(WIZNET_CHIP W6300)
add_definitions(-D_WIZCHIP_=W6300)

set(WIZCHIP_QSPI_MODE QSPI_QUAD_MODE)
add_definitions(-D_WIZCHIP_QSPI_MODE_=${WIZCHIP_QSPI_MODE})

 


RP2350 QSPI를 이용한 W6300 초기화 설정 및 ping 테스트 코드

개발환경 설정이 끝났다면 가장 간단히 W6300을 초기화 하고 네트웍 정보를 출력하고 테스트 해볼 수 있는 ping 테스트를 해보자

#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/spi.h"
#include "hardware/pio.h"
#include "hardware/timer.h"
#include "hardware/uart.h"
#include "hardware/clocks.h"
#include "hardware/pll.h"

#include "wizchip_spi.h"
#include "wizchip_conf.h"
#include "socket.h"
#include <arm_acle.h>  // __nop() 함수 정의


#define IPV4
// #define IPV6

/**
 * ----------------------------------------------------------------------------------------------------
 * Variables
 * ----------------------------------------------------------------------------------------------------
 */
/* Network */
static wiz_NetInfo g_net_info =
    {
        .mac = {0x00, 0x08, 0xDC, 0x12, 0x34, 0x56}, // MAC address
        .ip = {192, 168, 1, 104},                     // IP address
        .sn = {255, 255, 255, 0},                    // Subnet Mask
        .gw = {192, 168, 1, 1},                     // Gateway
        .dns = {8, 8, 8, 8},                         // DNS server
#if _WIZCHIP_ > W5500
        .lla = {0xfe, 0x80, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x02, 0x08, 0xdc, 0xff,
                0xfe, 0x57, 0x57, 0x25},             // Link Local Address
        .gua = {0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00},             // Global Unicast Address
        .sn6 = {0xff, 0xff, 0xff, 0xff,
                0xff, 0xff, 0xff, 0xff,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00},             // IPv6 Prefix
        .gw6 = {0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00},             // Gateway IPv6 Address
        .dns6 = {0x20, 0x01, 0x48, 0x60,
                0x48, 0x60, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x88, 0x88},             // DNS6 server
        .ipmode = NETINFO_STATIC_ALL
#else
        .dhcp = NETINFO_STATIC        
#endif
};

uint8_t tcp_client_destip[] = {
    192, 168, 1, 104
};



#define LED1_PIN            25
#define Led1Off()           gpio_put(LED1_PIN, 1);
#define Led1On()            gpio_put(LED1_PIN, 0);



int main()
{
    stdio_init_all();
    sleep_ms(3000);

    printf("==========================================================\n");
    printf("Compiled @ %s, %s\n", __DATE__, __TIME__);
    printf("==========================================================\n");

    wizchip_spi_initialize();
    wizchip_cris_initialize();
    wizchip_reset();
    wizchip_initialize();
    wizchip_check();

    network_initialize(g_net_info);

    /* Get network information */
    print_network_information(g_net_info);

    while (true) {

    }
}

 

코드 수행하면 W6300의 레지스터 정보를 읽어서 네트웍 정보를 표시하게 된다. 설정한 IP로 ping 테스트 하면 문제 없이 동작하는 것을 확인할 수 있다.

반응형