Generating Unique MAC Addresses for RP2040 W5500
Generating Unique MAC Addresses for RP2040 W5500
This article covers the MAC address duplication issue and its solution that arises when deploying multiple IoT devices using the RP2040 (Raspberry Pi Pico) + W5500 combination.
Key Problem: Since the W5500 does not have pre-assigned MAC addresses, hardcoding the same MAC address across multiple devices results in ARP conflicts and database errors.
Recommended Solution: Read the factory-programmed 64-bit unique hardware ID (pico/unique_id.h) from within the RP2040 and convert it into a 6-byte MAC address. Set the first byte to 0x02 to set the LAA (Locally Administered Address) bit, preventing conflicts with OUI-registered addresses. The generated MAC address remains the same upon booting but is unique to each device, allowing it to be used as a device identification key in Django/PostgreSQL backends.
Alternatives introduced include external MAC EEPROM ICs, hash-based generation, DHCP hostnames, and LittleFS file storage methods.
Definition of the Role of the W5500
The W5500 is a hardwired TCP/IP offload Ethernet controller. To summarize its role in this document:
**Role Description**
**Network Interface**
**Provides wired Ethernet connection capabilities to the RP2040 (MCU)**
**Hardware Processing**
**Hardware Processing**
**Processing TCP/IP protocols directly within the chip without burdening the MCU's software**
**MAC Address Receptor**
**Since it does not possess a proprietary MAC address, it receives a MAC address assigned by the firmware and uses it for device identification on the network**
**SPI Interface**
**Communicates with the RP2040 via SPI (CS pin, etc.) to transmit and receive data**
In a single line: "The W5500 is a controller that provides the Ethernet MAC/PHY and TCP/IP stack in hardware so that the RP2040 can communicate with the Internet." It does not possess a MAC address internally, so developers must assign one directly at the firmware level. This is the characteristic of the WIZnet W5500 and the starting point for the issues raised in this article.
======
이 글은 Raspberry Pi Pico(RP2040)와 W5500 이더넷 컨트롤러를 사용할 때, 각 기기에 고유한 MAC 주소를 자동으로 할당하는 방법을 다루고 있습니다. (주소 중복 문제와 그 해결책)
핵심 문제: W5500에는 사전 할당된 MAC 주소가 없어, 여러 기기에 동일한 MAC을 하드코딩하면 ARP 충돌 및 DB 오류가 발생합니다. (MAC 주소를 직접 입력하면 관리 효율이 떨어짐)
권장 해결책: RP2040 칩 자체에 내장된 8바이트 고유 ID(Unique Board ID)를 추출하여 6바이트 MAC 주소로 변환하는 방식을 제안 (pico/unique_id.h)
RP2040 내부에 공장 프로그래밍된 64-bit 고유 하드웨어 ID(pico/unique_id.h)를 읽어와 6바이트 MAC 주소로 변환합니다. 이때 첫 번째 바이트를 0x02로 설정해 LAA(Locally Administered Address) 비트를 세팅, OUI 등록 주소와의 충돌을 방지합니다. 이렇게 생성된 MAC은 부팅할 때마다 동일하지만 기기마다 고유하여, Django/PostgreSQL 백엔드에서 기기 식별 키로 활용 가능합니다.
대안으로는 외부 MAC EEPROM IC, 해시 기반 생성, DHCP 호스트네임, LittleFS 파일 저장 방식 등이 소개됩니다.
W5500의 역할 정의
W5500은 하드와이어드(Hardwired) TCP/IP 오프로드 이더넷 컨트롤러입니다. 이 문서에서의 역할을 정리하면:
역할설명네트워크 인터페이스RP2040(MCU)에 유선 이더넷 연결 기능을 부여TCP/IP 스택 하드웨어 처리MCU의 소프트웨어 부담 없이 TCP/IP 프로토콜을 칩 내부에서 직접 처리MAC 주소 수용체자체 고유 MAC이 없으므로, 펌웨어가 부여한 MAC을 받아 네트워크 상에서 기기 식별에 사용SPI 인터페이스 연결RP2040과 SPI(CS핀 등)로 통신하며 데이터 송수신
한 줄로 정의하면: "W5500은 RP2040이 인터넷과 통신할 수 있도록 이더넷 MAC/PHY 및 TCP/IP 스택을 하드웨어로 제공하는 컨트롤러"이며, MAC 주소는 자체 보유하지 않아 개발자가 펌웨어 단에서 직접 할당해야 합니다. 이것이 WIZnet W5500의 특성이자, 이 글의 문제 제기 출발점입니다.
[Q&A 1]
[Q&A 2]
Q: 이 글대로 코딩하면 W5500 에 자동으로 mac address 를 중복되지 않게 포팅해 줄 수 있나요?
A: 이 글의 방식을 사용하면 여러 대의 기기를 배포하더라도 MAC 주소가 중복되지 않게 자동으로 할당할 수 있습니다.
1) 어떻게 중복을 피하나요?
이 코드는 W5500 내부가 아니라, 메인 두뇌인 RP2040(Raspberry Pi Pico) 칩의 '주민등록번호'를 이용합니다.
모든 RP2040 칩은 공장에서 만들어질 때 고유한 64비트(8바이트) ID를 부여받습니다.
이 ID는 전 세계에서 단 하나뿐이므로, 이를 기반으로 MAC 주소를 생성하면 이론적으로 중복이 발생할 수 없습니다.
2) 코드의 핵심 로직 (왜 0x02를 쓰나요?)
제공된 소스 코드에서 가장 중요한 부분은 이 줄입니다:
macArray[0] = 0x02;
LAA (Locally Administered Address): MAC 주소의 첫 번째 바이트의 특정 비트를 1로 설정하면, "이 주소는 전 세계 표준 기구가 부여한 게 아니라, 관리자가 임의로 만든 주소다"라고 선언하는 것입니다.
이렇게 하면 삼성, 인텔 같은 대기업이 만든 제품의 고유 MAC 주소와 우연히 겹치더라도 네트워크 장비(공유기 등)가 이를 구분할 수 있게 해줍니다.
3) 주의사항 및 한계점
이 방식이 매우 효율적이지만, 100% 완벽을 기하려면 다음을 체크하세요:
ID의 일부만 사용: RP2040의 고유 ID는 8바이트인데, MAC 주소는 6바이트입니다. 코드에서는 ID의 뒷부분 5바이트만 가져다 씁니다. 아주 희박한 확률(수조 분의 일)로 뒷부분만 겹칠 가능성이 이론적으로는 존재하지만, 일반적인 IoT 프로젝트에서는 무시해도 될 수준입니다.
하드웨어 변경 시 주소 변경: 만약 Pico 보드가 고장 나서 새 보드로 교체하면, MAC 주소도 바뀝니다. 만약 데이터베이스에서 MAC 주소를 기기 식별자로 쓰고 있다면, 보드 교체 시 새로운 기기로 인식된다는 점을 기억해야 합니다.
라이브러리 호환성: 해당 코드는 Earle Philhower의 RP2040 코어를 사용할 때 가장 잘 작동합니다. 공식 Arduino Mbed 코어를 사용한다면 고유 ID를 읽어오는 함수명이 다를 수 있으니 확인이 필요합니다.
[Q&A 3]
Q: Mac 주소를 어디서 사오는 것이 아니라, 무료로 임의로 중복되지 않게만 할당하면 되나요?
A: 결론부터 말씀드리면 로컬 네트워크(집, 사무실, 공장 내부) 안에서만 사용한다면 공짜로 직접 만들어 쓰셔도 무방합니다. 단, 전 세계적인 표준과 충돌하지 않기 위해 지켜야 할 '약속'이 하나 있는데, 그것이 바로 본문에도 언급된 LAA(Locally Administered Address) 설정입니다.

