Wiznet makers

bruno

Published November 26, 2025 ©

129 UCC

14 WCC

30 VAR

0 Contests

0 Followers

0 Following

Original Link

Slow W5500 on RPi4B

RPi4B에서 W5500 이더넷 모듈 SPI 속도 저하 이슈

COMPONENTS
PROJECT DESCRIPTION

원문링크 : https://forums.raspberrypi.com/viewtopic.php?t=394077

1) Introduction

본 문서는 RPi4B 보드 위에 W5500 이더넷 컨트롤러를 SPI 방식으로 연결하여 네트워크 기능을 구현할 때 발생하는 속도 저하 문제를 정리합니다. 포럼 사용자에 따르면 SPI 클럭을 30 MHz까지 설정했음에도 실제 이더넷 속도가 약 15 Mbps 수준에 머무른다고 보고했습니다. forums.raspberrypi.com
이를 분석하고, 원인-해결 방안 및 참고 가능한 하드웨어/소프트웨어 구성을 제시합니다.


2) Required Components

RPi4B (예: 4GB 또는 8GB 모델)

W5500 이더넷 컨트롤러 모듈 또는 W5500 칩이 탑재된 HAT

SPI 연결용 점퍼 케이블 또는 납땜 패턴

적절한 전원 공급 및 연결 (RPi4B + W5500)

(옵션) 회로 보호 또는 수준 변환기 (만약 SPI 신호가 3.3V 넘어가면)

운영체제: Raspberry Pi OS (Lite 버전 등)

필요 시 Device Tree Overlay 설정 변경 가능성


3) Hardware Setup

사용자가 작성한 글에 따르면 HAT 설계를 통해 W5500을 SPI 1 CS3에 연결했다고 합니다. forums.raspberrypi.com 이때 사용된 SPI1의 특징이 문제의 핵심입니다.
RPi4B(SoC: BCM2711)에서 SPI1은 작은 FIFO와 DMA 부재로 인해 성능이 낮도록 설계되어 있다는 내부 문서 내용이 지적되었습니다. forums.raspberrypi.com
따라서 하드웨어 측면에서는 가능한 한 DMA가 지원되고 FIFO가 충분한 SPI 인터페이스로 W5500을 연결하는 것이 권장됩니다.


4) Interface Explanation (SPI)

SPI 개요

SPI는 마스터-슬레이브 방식의 직렬 통신 인터페이스로, 마스터(여기서는 RPi4B)가 슬레이브(W5500)를 지정하고 MOSI/MISO/SCLK/CS 라인을 통해 데이터를 주고받습니다.

RPi4B에서 SPI 인스턴스

글 중에서 RPi4B의 내부 문서를 인용한 답변에 따르면:

“Page 20 of the BCM2835 datasheet … which is relevant to BCM2711 … says that SPI1 is a low-performance interface owing to it having small FIFOs and no DMA support.” forums.raspberrypi.com
즉 SPI1을 사용하면 성능 제약이 존재합니다.

제안된 대안: SPI6

같은 답변에서는 다음과 같이 언급합니다:

“You would be better of using one of BCM2711’s other SPI instances. Luckily for you, SPI6 shares the same pin assignments as SPI1(*) …” forums.raspberrypi.com
따라서 SPI6(또는 DMA 지원하는 다른 SPI)로 변경하면 속도 향상을 기대할 수 있습니다.

왜 DMA와 FIFO가 중요한가

FIFO (First In First Out) 버퍼가 작으면 매번 CPU 개입이 많아지고 오버헤드가 커집니다.

**DMA (Direct Memory Access)**를 지원하면 CPU 개입을 줄이고 스트리밍 데이터 전송이 더 효율적으로 이뤄집니다.
W5500 같은 네트워크용 트래픽은 연속 전송이 많기 때문에 여기서 병목이 생길 수 있습니다.


5) Wiring Table

RPi4B 핀명 (BCM 방식)기능W5500 핀명설명
SPI_CLK (예: BCM21)SCLKSCKSPI 클럭
SPI_MOSI (예: BCM20)MOSIMOSI마스터 → 슬레이브 데이터
SPI_MISO (예: BCM19)MISOMISO슬레이브 → 마스터 데이터
SPI_CS0 (예: BCM18)CSCS칩 선택 신호
+3.3VVCCVCC전원 공급
GNDGNDGND접지

※ 실제 사용 시 HAT 또는 모듈 설계에 따라 핀 배치가 달라질 수 있으며, 여기서 언급된 SPI6 핀과 SPI1 핀의 동일 배치 여부를 반드시 확인해야 합니다.


6) Software Environment Setup

Raspberry Pi OS 설치 및 최신 커널/펌웨어 업데이트

 
sudo apt update && sudo apt full-upgrade

/boot/config.txt에 Device Tree Overlay 추가
예를 들어 SPI6를 사용하고 싶다면:

 
dtoverlay=spi6-1cs

또는 CS 라인이 여러 개일 경우:

 
dtoverlay=spi6-2cs,cs0_pin=18,cs1_pin=27

forums.raspberrypi.com

SPI 장치 활성화:

 
sudo raspi-config # Interface Options → SPI → Enable 

W5500 드라이버 혹은 네트워크 스택 설정: W5500이 SPI 이더넷 컨트롤러이므로 리눅스 내에서 사용할 경우 SPI 장치로 인식하고 네트워크 인터페이스(eth1 등)로 등록되도록 설정이 필요합니다.

통신 속도 조정: SPI 클럭 설정(예: max_speed_hz=30000000) 등 필요에 따라 조정해야 합니다.


7) Full Code Examples

아래는 기본적으로 Linux 사용자 공간에서 spidev 인터페이스를 통해 W5500 SPI 통신을 수행하는 예시입니다. (※ 실제 네트워크 드라이버가 아닌 테스트 목적 코드)

 
#include <fcntl.h> #include <linux/spi/spidev.h> #include <sys/ioctl.h> #include <stdio.h> #include <stdint.h> int main(void) {    int fd = open("/dev/spidev6.0", O_RDWR);    if (fd < 0) { perror("open"); return 1; }    uint32_t mode = SPI_MODE_0;    uint32_t speed = 30000000; // 30 MHz    ioctl(fd, SPI_IOC_WR_MODE, &mode);    ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);    uint8_t tx[] = { 0x00, 0x01, 0x02 }; // 예시    uint8_t rx[sizeof(tx)] = {0};    struct spi_ioc_transfer tr = {        .tx_buf = (unsigned long)tx,        .rx_buf = (unsigned long)rx,        .len = sizeof(tx),        .speed_hz = speed,    };    if (ioctl(fd, SPI_IOC_MESSAGE(1), &tr) < 0) {        perror("SPI transfer");        return 1;    }    printf("Received: %02x %02x %02x\n", rx[0], rx[1], rx[2]);    close(fd);    return 0; }

※ W5500의 실제 TCP/IP 동작을 위한 라이브러리나 드라이버 구성은 별도로 존재하며, 위 코드는 SPI 통신 확인용 예제입니다.


8) Testing Steps

SPI 인터페이스 활성화 후 /dev/spidev6.0 (또는 설정한 노드) 존재 확인

위 예제 코드 컴파일 및 실행하여 기본 SPI 통신 확인

W5500 모듈을 물리적으로 연결하고 네트워크 인터페이스가 생성되는지 확인 (ifconfig 또는 ip link)

네트워크 연결 후 파일 전송 또는 iperf/iperf3 등을 사용해 속도 측정

SPI 클럭을 30MHz 이상으로 설정해보고 안정성/속도 변화를 확인

SPI1을 사용한 경우 속도가 약 15Mbps 수준으로 머무른다면 SPI6로 전환 후 다시 테스트


9) Troubleshooting

속도가 15 Mbps 수준으로 머무르는 경우
→ 이는 SPI1이 내부적으로 FIFO가 작고 DMA를 지원하지 않는 인터페이스이기 때문입니다. forums.raspberrypi.com

SPI 클럭을 올려도 동작하지 않거나 오류가 발생하는 경우
→ 신호 무결성 문제(PCB 설계, 납땜 품질, 배선 길이 등) 또는 SPI 슬레이브(W5500)‐마스터(RPi) 간 전압/타이밍 문제일 수 있습니다.

네트워크 인터페이스가 생성되지 않거나 패킷 이상이 발생하는 경우
→ 드라이버/펌웨어 버전 확인, OS업데이트, Device Tree Overlay 설정 재검토 필요

HAT 설계가 SPI1 CS3에 고정되어 있을 경우
→ 가능하다면 설계를 수정해 SPI6 핀으로 변경하거나 배선이 가능한 설계여야 합니다.


10) Use Cases & Market Potential

임베디드 시스템, IoT 게이트웨이, 산업용 통신 장비 등에서 RPi4B + W5500 조합은 비용 효율적인 유선 이더넷 솔루션이 될 수 있습니다.

특히 WiFi 대신 안정적인 유선 네트워크가 필요한 환경(예: 공장 자동화, 로봇 제어, 데이터 로깅)에서 활용 가치가 높습니다.

다만 속도 요구가 높거나 대용량 데이터 스트리밍이 필요한 경우 본 사례처럼 인터페이스 병목이 생길 수 있으므로 설계 시 SPI 선택 및 성능 고려가 필수입니다.

향후 HAT 설계 시에는 SPI6 또는 DMA 지원 가능한 인터페이스를 기본으로 설계하는 것이 경쟁력 있는 제품 개발로 이어질 수 있습니다.


11) Module/Chip Technical Overview

W5500

TCP/IP 오프로드 지원 이더넷 컨트롤러 칩. SPI를 통해 MCU/SoC와 통신하며, 내장 TCP/IP 스택을 통해 애플리케이션 구현을 단순화할 수 있습니다.

W5500은 최대 80 MHz(?) SPI 클럭 지원 사양이 다양한 모듈에서 존재하고, 이론적으로 더 높은 네트워크 throughput을 기대할 수 있습니다.

RPi4B (SoC : BCM2711)

RPi4B는 다수의 SPI 인터페이스를 갖고 있으나, 내부 문서에 따르면 SPI1은 “low-performance interface”로 명시되어 있습니다. forums.raspberrypi.com

따라서 고성능 SPI가 필요한 애플리케이션에서는 SPI6 등 다른 SPI 인스턴스를 활용하는 것이 추천됩니다.


12) Conclusion

본 사례에서 보듯이, RPi4B + W5500 조합은 기술적으로 유용하지만 인터페이스 선정이 성능에 큰 영향을 미칩니다. 특히 SPI1을 사용했더니 속도가 약 15 Mbps 수준으로 제한됐고, 내부 문서 분석을 통해 SPI1이 DMA 없이 작은 FIFO 구조라는 원인이 밝혀졌습니다. 따라서 설계 초기 단계부터 고성능 SPI 인스턴스 선택(SPI6 등) 및 배선/펌웨어 설정을 고려하는 것이 중요합니다.
이를 통해 유선 이더넷 솔루션으로 RPi4B + W5500 조합을 보다 안정적이고 고성능으로 구현할 수 있습니다.

 

Documents
Comments Write