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 테스트 하면 문제 없이 동작하는 것을 확인할 수 있다.