Wiznet makers

gunn

Published December 11, 2025 ©

42 UCC

0 VAR

0 Contests

0 Followers

0 Following

Original Link

Wiznet W5500 Datenübertragung via Ethernet

Wiznet W5500 Datenübertragung via Ethernet

COMPONENTS Hardware components

WIZnet - W5500

x 1

Software Apps and online services

Geral Combs - wireshark

x 1


PROJECT DESCRIPTION

내용 요약

MSP430(MSP430G2553) + W5500로 UDP 이더넷 통신을 하고 싶은 한 사용자가, Wiznet ioLibrary와 레지스터 직접 제어하다가 잘 안되서 여러 고수의 도움을 받는 내용입니다.


기본 상황

- 작성자(Uli)는 MSP430G2553 + W5500 조합으로 UDP 송신을 하려 하고, SPI 통신은 어느 정도 동작한다고 생각하지만 이더넷/UDP 쪽은 이해가 부족한 상태입니다.
- Wiznet의 ioLibrary_Driver(w5500.h, wizchip_conf.h 등)를 보았지만 구조가 복잡해 보이고, 컴파일 에러(shift count too large, 경로 문제 등) 때문에 제대로 활용을 못 하고 있습니다.

주요 논점과 조언

- 여러 답변자들이 “ioLibrary를 쓰려면 SPI 콜백 등록 등 C·SPI 기본기도 필요하고, 직접 레지스터 프로그래밍을 하려면 W5500·Ethernet 이해가 필요하니 둘 다 어느 정도 수준은 있어야 한다, 현재는 둘 다 부족해 보인다”고 지적합니다.
- 한 답변자는 “작은 MSP430에 ioLibrary 전체를 올리기보다는 W5500을 데이터시트 보면서 bare-metal로 직접 다루는 편이 낫다, 다만 소켓 인터페이스를 제대로 쓰려면 공식 라이브러리를 참고용으로 보라”고 조언합니다.
- 다른 답변자는 W5500용 SPI 저수준 코드(STM32F4용 예제)와, 그 위 레벨의 W5500 HAL 코드(w5500.c/.h, config 파일들)를 올려 주며, “매직 넘버 말고 Wiznet가 제공하는 define을 써라, 계층(SPI, W5500-HAL, 소켓, 어플리케이션)을 나눠서 생각하라”고 강조합니다.

디버깅 과정에서 나온 포인트

- 작성자는 SW 리셋, MAC/IP/서브넷/게이트웨이 설정, UDP 모드 설정, 포트 설정, 소켓 오픈, TX 포인터/버퍼 쓰기, SEND 명령 등 순서대로 레지스터를 건드리지만, Ping도 안 되고 UDP 패킷도 수신이 안 된다고 보고합니다.
- 답변자들은  
 - 리셋 후 최소 지연(데이터시트에 500 µs 이상)을 보장하라고 지적하고,  
 - Sn_SR, Sn_IR 등 상태 레지스터를 계속 읽어 실제로 소켓이 어떤 상태인지 확인하라고 합니다.
- SPI 읽기 테스트로 VERSIONR(버전 레지스터)을 읽는 예에서, 작성자가 SPI 프레임 길이를 잘못 잡아 바이트 수가 맞지 않는 문제를 지적하고, W5500 레지스터 Read 예제 코드(LoopBackTest)를 공유합니다.

MAC/IP/UDP 관련 논의

- MAC 주소는 로컬 네트워크 내에서만 유일하면 되며, W5500은 어떤 MAC을 써도 크게 상관 안 한다는 설명이 나옵니다.
- Locally administered MAC을 쓰려면 첫 바이트의 특정 비트를 어떻게 세팅해야 하는지(첫 바이트에서 bit1=1, bit0=0) 등 일반적인 MAC 규칙도 설명됩니다.
- UDP는 TCP처럼 “연결” 개념이 없으므로, TeraTerm 같은 TCP 기반 터미널로는 UDP를 테스트할 수 없고, PacketSender·Wireshark 등을 써서 패킷을 관찰해야 한다는 점을 지적합니다.

ioLibrary와 툴체인·하드웨어 문제

- Uli는 ioLibrary를 쓰려다 include 경로(W5500/w5500.h) 문제, 컴파일 오류 등으로 막히고, 구조를 이해 못 하겠다고 토로합니다.
- 한 답변자는 직접 IAR MSP430 프로젝트(W5500_Project.zip)를 만들어 주고, W5500 SPI 드라이버 및 초기화 코드를 짜서 “여기에 delay, UART 출력만 채우면 Ping까지는 갈 것”이라고 할 정도로 구체적으로 도와줍니다.
- 하지만 나중에 확인해 보니 MSP430G2553의 RAM(512B)이 너무 작아서 W5500 관련 코드 전체를 돌리기엔 메모리가 부족하다는 결론이 나오고, “이 칩으로는 현실적으로 어렵다, STM32나 최소한 RAM이 큰 MCU/Arduino 계열로 넘어가는 게 낫다”는 조언이 반복됩니다.

전체적인 분위기

- 초기에는 상세한 기술 조언과 예제 코드 공유가 활발하지만, 작성자가 라이브러리 구조 이해·소스 공유·조언 수용에 서툰 부분이 있어 답변자들이 답답해하는 장면도 나옵니다.
- 마지막 쪽에서는 “이 정도 난이도면 MSP430G2553 + W5500 조합 자체가 무리, MCU를 바꾸거나 프로젝트 방향을 재고하라”는 현실적인 결론으로 정리되는 흐름입니다.

댓글이 56개나 달린 글 (10일 동안)

참여자

댓글 수

비율

Wastl

18

32.7%

Uli D. (질문자)

16

29.1%

Cyblord

5

9.1%

Harald K.

3

5.5%

Ozvald K.

2

3.6%

Hmmm

2

3.6%

Frank K.

2

3.6%

Arduino F.

1

1.8%

Martin S.

1

1.8%

Michael

1

1.8%

Richard W.

1

1.8%

Thomas T.

1

1.8%

Spess53

1

1.8%

해결과정

1. 출발점: MSP430 + W5500로 센서 데이타를 UDP 통신 하고 싶다

SPI 통신은 어느 정도 되는데,
Wiznet ioLibrary_Driver(공식 라이브러리) 구조가 너무 복잡해서
어디서부터 어떻게 써야 할지 모르겠다고 하소연합니다.

“UDP로 보내는 게 맞는지, 예제 코드(C로 된 것) 있으면 좋겠다” 하고 질문.

2. 첫 번째 조언들:
“라이브러리를 쓰든, 데이터시트를 보든 기본 실력이 좀 필요하다”

어떤 사람은

“W5500은 라이브러리 없이도 데이터시트만 보고 레지스터로 직접 제어 가능하다. 나도 그렇게 여러 애플리케이션 만들었다.”

하지만 제대로 된 소켓 인터페이스가 필요하면 라이브러리 사용하는 게 낫다고 함.

다른 사람은

“두 방식 다 일정 수준의 실력이 필요하다.
컨트롤러, SPI, Ethernet, W5500, C, 라이브러리 사용법 등 기초가 부족해 보인다.
지금은 너무 큰 걸 한 번에 하려는 것 같다. 좀 더 작은 것부터 시작해라.” 라고 직설적으로 이야기.

3. Bare-metal 시도: 레지스터 직접 만지며 UDP 송신 도전

Uli가 라이브러리 포기하고 레지스터 직접 제어로 UDP 송신을 시도하면서:

소프트웨어 리셋

MAC, IP, 서브넷, 게이트웨이 설정

소켓 UDP 모드 설정

포트 설정 (예: 5000, 80 등)

소켓 open 명령

TX 버퍼에 데이터 쓰기

송신 명령(SEND)
… 이런 흐름으로 구현.

그런데 PC에서 데이터가 전혀 보이지 않음.

또,

SPI로 읽은 값들이 0x01, 0x02, 0x03…처럼 계속 증가하는 이상한 패턴 →
SPI 프레임 길이/방식이 잘못되었을 가능성이 지적됨.

VERSIONR(버전 레지스터) 읽을 때도 헤더 바이트 수가 1바이트 많다는 지적을 받음
→ W5500은 4바이트 헤더 + 마지막 바이트에서 데이터 읽기가 맞는데, Uli는 5바이트를 보내고 있었음.

4. 여러 고수들의 디버깅 팁

여러 사람이 디버깅 팁을 줍니다.

SPI 레벨부터 확실히 검증해라

WIZnet가 제공한 VERSIONR 같은 고정값 레지스터를 읽어서
항상 동일한 값이 나오는지 확인할 것.

SPI 함수는 “쓰기/읽기를 동시에 하는 transfer 함수 하나”로 구성하는 게 일반적.

Ping / ARP / Wireshark / PacketSender 활용

IP와 MAC이 제대로 설정되면 PC에서 ping이 가능해야 한다.

arp -a 명령으로 MAC을 확인해볼 수 있다.

Wireshark, PacketSender로 패킷이 실제로 나가는지, IP/MAC이 제대로 보이는지 모니터링.

MAC 주소 규칙

이론적으로 MAC 주소는 네트워크 내에서만 유일하면 되므로,
“대충 하나 골라도” 큰 문제는 없다.

그래도 깔끔하게 하려면 Locally Administered Address 규칙을 따르는 것이 좋다
(첫 바이트에서 bit1=1, bit0=0).

UDP의 특성 이해

UDP에는 TCP처럼 “연결(Connect)” 개념이 없다.
→ TeraTerm 같은 TCP 전용 툴로는 테스트가 안 된다.

UDP에서는 소켓이 “LISTEN/CONNECTED” 상태로 잡혀 있는 게 아니라,
정상 초기화 후 데이터 프레임만 잘 내보내면 끝.

Sn_SR, Sn_IR, Sn_CR 등 상태 레지스터를 계속 체크하라

소켓 open 후 Sn_SR 값이 0x00이면 제대로 안 열린 것.

명령 후 Sn_CR은 0x00으로 자동 클리어되지만, 완료 여부는 Sn_SR 또는 Sn_IR로 판단해야 한다.

5. ioLibrary_Driver / Wiznet HAL 사용 vs 직접 작성

한 고수(Wastl)가 계속 강조:

“데이터시트에만 매달려서 매직 넘버로 레지스터 직접 두드리지 말고,
Wiznet가 제공하는 헤더/소스의 #define과 함수 구조를 기반으로 해라.”

SPI 레벨, W5500 HAL 레벨, 소켓 레벨, 애플리케이션 레벨을 층별로 분리해서 생각해야 한다.

Uli는

ioLibrary_Driver의 구조와 코드가 너무 복잡하게 보이고

컴파일 시 헤더 경로(W5500/w5500.h) 문제, shift count too large 등의 오류도 만나면서

“도대체 어디서부터 손대야 할지 모르겠다”고 계속 호소.

6. Wastl이 직접 MSP430 + W5500 프로젝트 골격을 만들어 줌

Wastl이 결국 IAR MSP430 프로젝트까지 직접 만들어서 올려줌:

W5500_SPI.c/.h 등 SPI 기본 함수

W5500 레지스터 접근 코드

초기화 루틴

나중에는 ZIP으로 전체 프로젝트 골격까지 제공

“이걸로 적절한 delay, UART 출력 함수만 붙이면 곧 ping은 될 것이다”라고 설명.

하지만 나중에 분석해보니,

MSP430G2553는 RAM이 512바이트뿐이라
Wiznet 라이브러리와 버퍼들을 제대로 쓰기에는 용량이 너무 부족하다는 결론.

링크는 되지만, 실제 런타임에서 RAM이 넘친다고 언급.

그래서 “이 칩으로는 이 프로젝트가 구조적으로 무리다. STM32나 다른 MCU로 가라.”고 강하게 권고.

나의 조언

독일에 W5500 을 만든 WIZnet의 유럽 관계사가 존재한다.
그 회사에서 한번 연락해 봐라.

독일어 : 

Es gibt eine europäische Niederlassung von WIZnet, dem Hersteller des W5500, in Deutschland. Versuchen Sie, diese zu kontaktieren.

 Adresse: Kirchgasse 5, 67259 Kleinniedesheim, Germany
 Mail : shop@wiznet.de
 Telefonanruf: +49-6239-809880

Documents
Comments Write