null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법
#network
#phy
#autoneg
#nlp
#flp
@devpc
|
2026-05-04 01:59:40
|
GET /api/v1/nodes/416?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법 ## Auto-negotiation이란 이더넷 케이블 양쪽 끝에 서로 다른 속도/Duplex 를 지원하는 장치가 연결됐을 때, 자동으로 최적의 통신 조건을 협상하는 기능이다. ``` PHY A: 10/100/1000 Mbps Full-duplex 지원 PHY B: 10/100 Mbps Half/Full-duplex 지원 ↓ Auto-negotiation 결과: 100 Mbps Full-duplex (최대 공통 조건) ``` 협상 실패 시 link가 올라오지 않거나, 의도하지 않은 Half-duplex로 동작해 성능 저하가 발생한다. --- ## NLP (Normal Link Pulse) 10BASE-T에서 사용하는 링크 유지 신호다. - **주기**: 16ms - **펄스 폭**: 100ns - **용도**: 링크가 살아있음을 알리는 heartbeat 수신 후 150ms 내에 다음 펄스나 프레임이 없으면 링크 에러로 판단한다. 4번 연속 수신하거나 프레임을 수신하면 복구된다. --- ## FLP (Fast Link Pulse) 100BASE-TX 이상에서 NLP를 확장한 신호다. 단순한 heartbeat 역할 외에 **자신의 능력(capability)을 상대에게 광고**한다. ``` FLP 구조: 33개의 NLP로 구성 ├── 17개 Clock Pulse (동기화) └── 16개 Data Pulse (Auto-negotiation 정보 포함) 주기: 16 ± 8 ms ``` 16개의 Data Pulse가 담는 정보(Advertisement 레지스터): | 비트 | 의미 | |------|------| | [4:0] | 기술 필드 (0x01 = IEEE 802.3) | | [8:5] | 속도/Duplex 지원 목록 | | [9] | Pause 기능 | | [10] | Asymmetric Pause | | [13] | 원격 결함 감지 | | [15] | Next Page 지원 | --- ## Auto-negotiation 흐름 ``` PHY A → FLP(자신의 capability) → PHY B PHY B → FLP(자신의 capability) → PHY A ↓ 양쪽 capability의 교집합 계산 (우선순위: 1000 FD > 100 FD > 100 HD > 10 FD > 10 HD) ↓ Parallel Detection 또는 협상 결과로 링크 설정 ``` --- ## 코드에서 Auto-negotiation 설정 ```c // PHY BCR(Basic Control Register)에서 Auto-negotiation 설정 #define BCR_REG 0x00 #define BCR_RESET (1 << 15) #define BCR_AUTONEG_EN (1 << 12) #define BCR_AUTONEG_RS (1 << 9) // Restart Auto-negotiation // Auto-negotiation 활성화 + 재시작 phy_write(phy_addr, BCR_REG, BCR_AUTONEG_EN | BCR_AUTONEG_RS); // 협상 완료 확인 (BSR bit 5) #define BSR_REG 0x01 #define BSR_AUTONEG_DONE (1 << 5) #define BSR_LINK_STATUS (1 << 2) while (!(phy_read(phy_addr, BSR_REG) & BSR_AUTONEG_DONE)); // 협상 결과 확인 (PHY별 Extended Register에서) // Aurix TC3xx 예: PHYSTS 레지스터 uint16_t physts = phy_read(phy_addr, 0x10); uint8_t speed = (physts >> 1) & 0x3; // 0=10M, 1=100M, 2=1000M uint8_t duplex = (physts >> 0) & 0x1; // 0=Half, 1=Full ``` --- ## Auto-negotiation 비활성화 — 언제? 자동차 이더넷(100BASE-T1, 1000BASE-T1)은 **Auto-negotiation을 지원하지 않는다.** 단선 설계로 단순화됐기 때문이다. 속도와 마스터/슬레이브 역할을 **고정 설정**으로 지정해야 한다. ```c // 100BASE-T1: Master 모드, 100Mbps 강제 설정 (PHY 전용 레지스터) phy_write(phy_addr, EXTENDED_CTRL_REG, MASTER_MODE | SPEED_100M); ``` --- ## 정리 Auto-negotiation이 실패하는 주요 원인은 세 가지다. 1. **FLP를 수신하지 못함** — 케이블 불량, 핀 연결 오류 2. **공통 capability 없음** — 양쪽 지원 목록이 겹치지 않음 3. **협상 타임아웃** — PHY 초기화 후 충분한 대기 시간 미확보 링크가 올라오지 않을 때 MDC/MDIO로 PHY 상태 레지스터를 읽으면 어느 단계에서 멈춰있는지 파악할 수 있다.
// COMMENTS
Newest First
ON THIS PAGE