null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
임베디드 개발자를 위한 네트워크 기초 — IP 주소부터 PHY 레지스터까지
Structure
ip-addressing
•
공인 IP, 사설 IP, 그리고 NAT가 존재하는 이유
•
고정 IP vs 유동 IP — DHCP의 동작 원리
•
네트워크 클래스 — IP 주소를 나누는 논리
•
서브넷 마스크와 게이트웨이 — 네트워크를 쪼개는 방법
•
CIDR 표기법 — /24가 의미하는 것
•
DNS — 이름을 IP로, IP를 이름으로
mac-transmission
•
MAC 주소와 OUI — 하드웨어 식별의 기초
•
유니캐스트, 멀티캐스트, 브로드캐스트 — 전송 방식의 선택
•
멀티캐스트 MAC 주소 — IP에서 MAC으로의 변환 원리
•
VLAN — 하나의 스위치에서 여러 네트워크 분리하기
port-and-layer
•
포트(Port) — 하나의 IP에서 수천 개의 통신 채널을 분리하는 법
•
PDU — 프레임, 패킷, 세그먼트의 차이
•
OSI 7계층 vs TCP/IP 모델 — 두 모델이 공존하는 이유
physical-layer
•
NIC와 PHY — 임베디드 이더넷 하드웨어 구조
•
MDC/MDIO — PHY 레지스터를 제어하는 2-Wire 인터페이스
•
NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법
•
Extended Register — Clause 22의 32개 제한을 넘는 법
•
"Docker 기초 — 컨테이너의 모든 것"
•
Store-and-Forward vs Cut-through
wireshark-debug
•
Wireshark에서 IP Checksum이 0인 이유
•
"Docker Compose — 멀티 컨테이너 오케스트레이션"
•
FCS/CRC와 Wireshark의 4바이트 미스터리
•
"TypeScript 기초 — JavaScript에 타입을 더하다"
•
임베디드 이더넷 디버깅 — Wireshark 실전 사용법
Flow Structure
NIC와 PHY — 임베디드 이더넷 하드웨어 구조
15 / 24
NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법
☆ Star
↗ Full
MDC/MDIO — PHY 레지스터를 제어하는 2-Wire 인터페이스
#network
#mdc
#mdio
#phy
#ieee802
@devpc
|
2026-05-04 01:59:40
|
GET /api/v1/flows/23/nodes/415?fv=2&nv=1
Context:
Flow v2
→
Node v1
0
Views
1
Calls
# MDC/MDIO — PHY 레지스터를 제어하는 2-Wire 인터페이스 ## MDC/MDIO란 **MDC(Management Data Clock)** 와 **MDIO(Management Data Input/Output)** 는 MAC에서 PHY의 레지스터를 읽고 쓰기 위한 **2-Wire 직렬 인터페이스**다. I²C와 유사한 구조지만 이더넷 PHY 전용 표준이다. ``` MAC (또는 MCU) PHY │──── MDC (클럭) ────────────→│ │←─── MDIO (데이터, 양방향) ──│ ``` MDC는 최대 2.5 MHz까지 지원한다. --- ## Clause 22와 Clause 45 IEEE 802.3은 MDC/MDIO를 두 가지 방식으로 정의한다. | 구분 | PHY 개수 | 레지스터 수 | 주소 공간 | |------|---------|----------|---------| | **Clause 22** | 최대 32개 | 각 32개 | 5bit PHY addr + 5bit Reg addr | | **Clause 45** | 최대 32개 | 각 65,536개 | 5bit + 16bit (2단계 주소) | 차량용 PHY(예: TJA1100, BCM89810)는 레지스터가 많아 Clause 45를 주로 사용한다. --- ## Clause 22 프레임 구조 ``` PRE: 32비트 1로 채운 프리앰블 (동기화) ST: 시작 비트 (01) OP: 동작 코드 (Write: 01, Read: 10) PA: PHY 주소 (5bit) RA: 레지스터 주소 (5bit) TA: Turnaround (2bit, 읽기 시 버스 전환) D: 데이터 (16bit) Write: PRE | 01 | 01 | PHYADR | REGADR | 10 | DATA Read: PRE | 01 | 10 | PHYADR | REGADR | Z0 | DATA ``` --- ## 레지스터 읽기/쓰기 예 ```c // PHY 레지스터 쓰기 (Clause 22) void phy_write(uint8_t phy_addr, uint8_t reg_addr, uint16_t data) { uint32_t tmpreg = 0; tmpreg |= (phy_addr << 11); // PA: 5bit tmpreg |= (reg_addr << 6); // RA: 5bit tmpreg |= (data & 0xFFFF); // DATA: 16bit tmpreg |= ETH_MACMIIAR_MW; // Write 비트 tmpreg |= ETH_MACMIIAR_MB; // Busy 비트 (전송 시작) ETH->MACMIIAR = tmpreg; // Busy 비트 클리어 대기 while (ETH->MACMIIAR & ETH_MACMIIAR_MB); } // PHY 레지스터 읽기 (Clause 22) uint16_t phy_read(uint8_t phy_addr, uint8_t reg_addr) { uint32_t tmpreg = 0; tmpreg |= (phy_addr << 11); tmpreg |= (reg_addr << 6); tmpreg &= ~ETH_MACMIIAR_MW; // Read 비트 tmpreg |= ETH_MACMIIAR_MB; ETH->MACMIIAR = tmpreg; while (ETH->MACMIIAR & ETH_MACMIIAR_MB); return (uint16_t)(ETH->MACMIIDR & 0xFFFF); } ``` --- ## PHY 초기화 흐름 ```c void phy_init(uint8_t phy_addr) { uint16_t id1 = phy_read(phy_addr, PHY_REG_ID1); // 제조사 ID 확인 uint16_t id2 = phy_read(phy_addr, PHY_REG_ID2); // Soft Reset phy_write(phy_addr, PHY_REG_BCR, BCR_RESET); // Reset 완료 대기 while (phy_read(phy_addr, PHY_REG_BCR) & BCR_RESET); // Auto-negotiation 활성화 phy_write(phy_addr, PHY_REG_BCR, BCR_AUTONEG_ENABLE | BCR_AUTONEG_RESTART); // Link Up 대기 (타임아웃 포함) uint32_t timeout = 5000; while (!(phy_read(phy_addr, PHY_REG_BSR) & BSR_LINK_STATUS)) { if (--timeout == 0) { /* 에러 처리 */ break; } delay_ms(1); } } ``` --- ## 주의점 - **MDC 클럭 속도** — PHY 데이터시트에서 최대 MDC 주파수를 반드시 확인. 초과 시 오동작 - **PHY 주소 설정** — 하드웨어 핀(PHYAD[4:0])으로 결정되는 경우가 많음. 회로도 확인 필수 - **Clause 22 vs 45 선택** — PHY 데이터시트에서 어떤 방식을 쓰는지 확인 --- ## 정리 MDC/MDIO는 PHY를 소프트웨어로 제어하는 유일한 창구다. PHY ID를 읽어 올바른 칩이 인식됐는지 확인하는 것이 이더넷 초기화 디버깅의 첫 단계다. ID가 읽히지 않는다면 PHY 전원, 핀 연결, MDC 클럭, PHY 주소 설정을 순서대로 확인한다.
NIC와 PHY — 임베디드 이더넷 하드웨어 구조
NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법
// COMMENTS
Newest First
ON THIS PAGE
No content selected.