Wiznet makers

bruno

Published November 26, 2025 ©

127 UCC

14 WCC

29 VAR

0 Contests

0 Followers

0 Following

Original Link

STM32F103ZET6 + W5500 프로그래밍 중 발생한 문제 및 해결 과정

W5500+STM32 네트워크 문제와 해결 팁

COMPONENTS
PROJECT DESCRIPTION

1) Introduction

본 프로젝트는 MCU인 STM32F103ZET6와 W5500 네트워크 칩을 결합하여 이더넷 통신 기능을 구현한 데이터 수집 카드 개발 경험을 바탕으로, 실제 동작 과정에서 발생한 네트워크 안정성 문제들을 정리한 글입니다. 원문에서는 네트워크 단선 복구, 소켓 상태가 특정 상태에서 정체되는 문제 등 두 가지 주요 이슈를 다루고 있습니다. cnblogs.com
이 글을 통해 유사 설계 시 발생할 수 있는 문제들을 미리 인지하고 대응할 수 있도록 설명드립니다.

2) Required Components

MCU: STM32F103ZET6

Ethernet 컨트롤러: W5500 (WIZnet사)

SPI 통신 연결 구성

이더넷 케이블, RJ-45 커넥터 등 네트워크 물리계

적절한 개발 보드 또는 사용자 회로

통신 테스트용 PC 및 네트워크 환경

3) Hardware Setup

MCU와 W5500 칩은 SPI 방식으로 연결됩니다. W5500은 MAC/PHY 및 TCP/IP 스택을 내장하고 있으므로, MCU에서는 SPI 인터페이스를 통해 레지스터 제어 및 데이터 송수신을 수행합니다.
회로 설계 시에는 W5500의 PHYCFGR 레지스터 또는 인터럽트 상태 확인을 위한 핀 구성, PHY 링크 상태 감지용 핀 등이 고려되어야 합니다. 원문에서는 “NET_DISCONNECT” 매크로를 통해 PHY 링크 단선 여부를 확인하는 방식을 제시하고 있습니다. cnblogs.com

4) Interface Explanation (SPI)

MCU ↔ W5500 간: SPI 통신 (클록, MOSI, MISO, CS)

W5500 내부적으로 TCP/IP 스택이 작동하며, 소켓 상태 레지스터(Sn_SR)를 통해 상태 전이를 관리

네트워크 물리 단선 등의 이벤트는 PHYCFGR 레지스터 비트(예: LINK 상태 비트)를 통해 감지 가능 cnblogs.com

Keep-Alive 기능: W5500이 자동으로 연결 상태를 검사할 수 있는 기능으로, Sn_KPALVTR 레지스터를 통해 설정 가능. cnblogs.com

사용자 코드에서는 SOCK_SYNRECV 상태에서의 타임아웃 검사 루틴을 추가하여 소켓 상태가 정체되지 않도록 조치함. cnblogs.com

5) Wiring Table

MCU PinW5500 PinDescription
SPI-SCKSCLKSPI 클록 신호
SPI-MOSIMOSISPI 데이터 송신
SPI-MISOMISOSPI 데이터 수신
SPI-CSCS칩 선택 신호
GPIO (optional)INT/LinkGPIOPHY 링크 상태 확인용 GPIO
GNDGND공통 접지
3.3VVCC전원 공급 (W5500는 3.3V 기준)

※ 실제 핀 배치는 사용 보드 설계에 따라 달라질 수 있으며, 데이터시트 확인이 필요합니다.

6) Software Environment Setup

개발 툴: STM32CubeIDE 또는 Keil 등

HAL 또는 LL 드라이버를 사용하여 SPI 초기화

W5500용 레지스터 접근 함수(IINCHIP_WRITE/READ 등) 구현

TCP 또는 UDP 소켓 초기화 루틴 포함

에러 및 상태 체크 로직: PHY 링크 상태, 소켓 상태, Keep-Alive 설정 등

테스트용 PC 소프트웨어: Ping 및 TCP 클라이언트/서버 콘솔

7) Full Code Examples

원문에는 아래와 같은 주요 코드 스니펫이 포함되어 있습니다.

 
// Keep-Alive 설정 예 setSn_KPALVTR(0, 1);  // 소켓 0, 시간 단위 5 초 기준 검사 void setSn_KPALVTR(SOCKET s, uint8 times) {    IINCHIP_WRITE(Sn_KPALVTR(s), times); }
 
// PHY 링크 단선 감지 매크로 정의 #define NET_DISCONNECT ((IINCHIP_READ(PHYCFGR) & 0x01) == 0)
 
// SOCK_SYNRECV 상태 타임아웃 검사 uint8 SYNRECVTimeOut(uint8 resetTime, uint16 timeOutMS) {    static uint64_t lastMS = 0;    if (resetTime) {        lastMS = get_ms();    } else {        if (get_ms() - lastMS > timeOutMS)            return 1;    }    return 0; } // 사용 코드 내부 case SOCK_SYNRECV:    if (SYNRECVTimeOut(0, 1000))        close(SOCK_TCPS);    break;

이처럼, 소켓이 일정 시간 동안 변화 없이 SYN_RECV 상태에 머무를 경우 강제 종료하여 재시작할 수 있도록 설계하였습니다. cnblogs.com

8) Testing Steps

MCU-W5500 회로 연결 완료 및 전원 인가

SPI 통신 드라이버 및 W5500 초기화 수행

네트워크 케이블 연결 후 PC에서 Ping 테스트 → 응답 확인

TCP 연결을 구축한 후 정상 통신 확인

네트워크 케이블을 물리적으로 拔插(뽑았다가 다시 꽂는) 동작 수행

재연결 시간 측정: Keep-Alive 설정 적용 전후 비교 → 원문에서는 적용 후 약 1초 이내 재연결 성공 보고됨. cnblogs.com

대기 상태에서 ‘SOCK_SYNRECV’ 상태 대기 문제를 유도하고, 타임아웃 로직이 잘 작동하는지 확인

9) Troubleshooting

문제 1: 拔插网线后无法再次连接 (케이블 뽑았다가 다시 꽂은 후 재연결 실패)

원인: W5500이 링크 단선 이벤트를 제대로 감지하지 않고 SOCK_ESTABLISHED 상태에 머무름. cnblogs.com

해결: Keep-Alive 기능 활성화 및 PHY 링크 상태 매크로로 단선 감지 → 소켓 강제 종료.

문제 2: 卡在SOCK_SYNRECV很长时间 (소켓이 SYN_RECV 상태에 오랫동안 머무름)

원인: 상위 PC가 연결 요청을 보내고 있는데 W5500이 응답을 못 받아 SYN_RECV 상태에 정체됨. cnblogs.com

해결: SYN_RECV 상태에서 타임아웃을 체크하고 정해진 시간 이상 머무르면 소켓을 닫고 재시도.

10) Use Cases & Market Potential

본 설계는 산업용 데이터 수집 카드, 원격 감시 장비, IoT 게이트웨이 등 MCU에 이더넷 기능을 간편히 추가해야 하는 시스템에 적합합니다. W5500은 TCP/IP 스택을 내장하고 있어 MCU 쪽 부담이 적고 설계 복잡도가 낮다는 장점이 있습니다.
특히 안정성이 중요한 산업용 환경에서는 위와 같은 네트워크 단선 복구 로직과 소켓 상태 제어 로직이 큰 강점이 될 수 있습니다.

11) Module/Chip Technical Overview

W5500: SPI 인터페이스를 통해 최대 8개의 소켓을 지원하며, MAC/PHY 및 TCP/IP 스택을 내부에 포함한 이더넷 컨트롤러입니다.

주요 특징: 하드웨어 버퍼 방식, 다양한 소켓 모드, Keep-Alive 및 핑 응답 기능 등.

STM32F103ZET6: 고성능 ARM Cortex-M3 기반 MCU로, 충분한 SPI 및 GPIO 자원을 갖추고 있으며 산업용이나 임베디드 애플리케이션에 적합합니다.

통신 구조: MCU → SPI → W5500 → 물리 네트워크 → 상위 시스템(PC 등)

12) Conclusion

MCU 기반 임베디드 시스템에서 이더넷 기능을 구현할 때는 단순히 초기 설정이 끝났다고 해서 끝나는 게 아닙니다. 실제 운영 시에는 케이블 탈착, 네트워크 장애, 소켓 상태 정체 등 다양한 문제가 발생할 수 있습니다.
본 사례에서는 W5500의 Keep-Alive 기능과 PHY 링크 상태 감지를 통한 소켓 재시작 로직을 활용하여 재연결 속도를 크게 개선하였으며, 소켓 상태 타임아웃 로직을 통해 SYN_RECV 상태에 머무는 현상을 해결하였습니다. 이러한 설계 요소들은 산업용-상용 네트워크 장비에서 안정성을 확보하는 데 매우 유용합니다.
향후에는 더 복잡한 네트워크 환경(예: DHCP, IPv6, TLS 등)에서도 유사한 안정성 로직을 확장 적용할 수 있을 것입니다.

Documents
Comments Write