이더넷은 Xerox PARC에서 개발된 네트워킹 기술로, 원래는 로컬 에어리어 네트워크 (LAN)를 위해 설계되었습니다. 이더넷은 그 이후로 많은 변화를 겪었지만, 오늘날에는 가장 널리 사용되는 유선 네트워크 기술 중 하나입니다.
10Mbps 이더넷은 가장 초기의 이더넷 표준 중 하나로, 초당 10 백만 비트의 데이터 전송 속도를 제공합니다. 이는 당시에는 매우 빠른 속도였으며, 이더넷이 넓게 채택되는 데 크게 기여하였습니다. 10Mbps 이더넷은 일반적으로 10Base-T라는 이름으로 알려져 있습니다.
100Mbps 이더넷은 10Mbps 이더넷에 비해 10배 더 빠른 데이터 전송 속도를 제공합니다. 이 표준은 1995년에 IEEE 802.3u로 발표되었으며, Fast Ethernet라고도 불립니다. 100Mbps 이더넷은 일반적으로 100Base-TX라는 이름으로 알려져 있습니다.
10Mbps 이더넷은 비교적 단순한 네트워킹 환경에서 사용되며, 작은 사무실이나 가정에서의 사용을 목표로 합니다. 이 표준은 UTP 케이블을 사용하여 데이터를 전송하며, 최대 100미터까지의 거리를 두고 장치를 연결할 수 있습니다.
100Mbps 이더넷은 더 큰 네트워크와 더 높은 대역폭이 필요한 환경에서 사용되는 것을 목표로 합니다. 이 표준은 10Mbps 이더넷과 같은 UTP 케이블을 사용하지만, 더 높은 전송 속도를 지원하기 위해 더 진보된 신호 처리 기술을 사용합니다. 또한, 이 표준은 10Mbps 이더넷과 마찬가지로 최대 100미터까지의 거리를 두고 장치를 연결할 수 있습니다.
공통점:
차이점:
Ethernet PHY를 특정 속도로 고정하는 것은 네트워크의 성능과 안정성을 조절하고, 특정 환경이나 요구 사항에 맞추기 위한 조치입니다. 자동 협상 기능을 통해 다양한 속도와 듀플렉스 설정 사이에서 최적의 구성을 자동으로 선택할 수 있지만, 특정 상황에서는 수동 설정이 더 바람직할 수 있습니다.
예를 들어, 레거시 시스템이나 덜 발전된 네트워크 기기는 자동 협상이 지원되지 않거나 잘못 구현되어 있을 수 있습니다. 이러한 경우, 미리 정해진 속도로 PHY를 설정하는 것이 연결의 안정성을 보장할 수 있습니다. 또한, 네트워크 트래픽이 많은 환경에서는 자동 협상 과정에서 발생할 수 있는 지연이나 불안정을 방지하기 위해 속도를 고정할 필요가 있습니다.
물론, 이러한 상황은 네트워크의 설계, 구성, 사용하는 장비의 종류 및 기능에 따라 달라질 수 있습니다. 현대의 네트워크 장비는 대부분 자동 협상 기능(Auto-Negotiation)을 지원하며, 잘 작동하지만 특수한 경우를 제외하고는 수동으로 속도를 설정할 필요는 점점 줄어들고 있습니다.
IEEE 802.3u는 이전에 10Mb/s에 불과했던 이더넷 속도는 100Mb/s의 도입과 1000Mb/s 의 상용화로 인해 장치간의 속도, 이중 모드, Flow control과 같은 전송 매개변수를 Physical Layer에서 결정하는 절차는 중요한 요소입니다. 디바이스와 허브(스위치)등의 양쪽 Node를 연결하고자 할 때 사용하는 이더넷 속도를 모르는 상태에서 Ethernet Cable을 연결했을 때 전송 속도를 결정하기 위해 플러그 앤 플레이(PnP)와 자동 협상 프로토콜이 생성되었습니다.
자세한 내용 : https://maker.wiznet.io/jaden/projects/auto%2Dnegotiation%2Danalysis/?page=2&serob=rd&serterm=all
W5100S, W5500 Auto-Negotiation analysis
Auto-Negotiation analysis
maker.wiznet.io
임베디드 시스템에서 Ethernet PHY를 100Mbps 또는 10Mbps로 고정하는 방법은 HOST system을 통해서 PHY를 컨트롤하는 것입니다. 테스트에서 사용된 임베디드 시스템은 32bit ARM Cortex-M3가 탑재된 STM32F103 시리즈 MCU를 사용하고 있는 WIZnet의 W6100-EVB 보드입니다. 해당 EVB 보드에는 W6100 Ethernet IC가 장착되어 있고 내부에 10/100 Ethernet PHY가 내장되어 있습니다.
기본적으로 PHY의 특정 레지스터를 Access 하거나 Register를 컨트롤 하기 위해서는 PHY에서 제공하는 표준 MDC/MDIO 인터페이스를 통해 접근해야 하지만 Ethernet PHY가 내장된 W6100은 사용자 컨트롤에 용이하도록 wiz_mdio_write() 함수 및 wiz_mdio_read() 함수를 통해 PHY Register에 r/w access가 가능하도록 io6Library에서 제공하고 있습니다.
https://github.com/Wiznet/io6Library/tree/master
GitHub - Wiznet/io6Library: io6Library is the integrated library for dual TCP/IP statck contorller such as W6100.
io6Library is the integrated library for dual TCP/IP statck contorller such as W6100. - Wiznet/io6Library
github.com
해당 함수를 사용하기 위해서는 다음의 경로( io6Library/Ethernet/wizchip_conf.h )에서 _PHY_IO_MODE_ 가 _PHY_IO_MODE_MII_ 로 설정되어 있어야 합니다.
/**
* @brief Select PHY Access Mode
* @details @ref _PHY_IO_MODE_ selects PHY access method.
* @todo You should select one of @ref _PHY_IO_MODE_PHYCR_ or @ref _PHY_IO_MODE_MII_.
* @sa ctlwizchip()
*/
#define _PHY_IO_MODE_ _PHY_IO_MODE_MII_ //_PHY_IO_MODE_PHYCR_
또한 아래와 같이 W6100 Datasheet의 6.8.2 Ethernet PHY Operation Mode Configuration 에 따르면 PHYCR 을 통해 Mode를 변경하기전에 PHYLCKR(PHY Lock Register)로 해당 Register 접근을 Unlock 해주고, Mode 설정 이후, PHY 를 Reset 후 재가동시켜야 Mode 설정이 완료되는 것을 확인할 수 있습니다.
해당 내용은 하기의 W6100-EVB Github 레포지토리에서 wizchip_conf.c 에서 ctlwizchip() 함수를 사용하여 PHY Mode를 설정할 수 있으며, main.c에서 아래 코드를 작성하면 됩니다.
https://github.com/Wiznet/W6100-EVB/tree/master
GitHub - Wiznet/W6100-EVB: W6100-EVB Library and Example,
W6100-EVB Library and Example,. Contribute to Wiznet/W6100-EVB development by creating an account on GitHub.
github.com
ctlwizchip() 함수에서 정의된 구조체를 사용하여 사용자 임의의 PHY Mode를 정의할 수 있습니다.
typedef struct wiz_PhyConf_t
{
uint8_t mode; ///< set by @ref PHY_MODE_MANUAL ,@ref PHY_MODE_AUTONEGO, or @ref PHY_MODE_TE
uint8_t speed; ///< set by @ref PHY_SPEED_10 or @ref PHY_SPEED_100
uint8_t duplex; ///< set by @ref PHY_DUPLEX_HALF @ref PHY_DUPLEX_FULL
}wiz_PhyConf;
아래와 같이 해당 구조체에 100FDX 또는 10FDX를 정의하고 ctlwizchip() 함수를 통해서 PHY Mode 설정 및 PHY Reset을 수행하며 W6100에 내장된 PHY의 Speed 및 Duplex 가 설정이 완료됩니다.
/* PHY configuration Register Unlock */
uint8_t phylock = SYS_PHY_LOCK;
ctlwizchip(CW_SYS_UNLOCK,&SYS_PHY_LOCK);
/* PHY configuration structure */
wiz_PhyConf phy_conf;
/* Configure PHY */
phy_conf.mode = PHY_MODE_MANUAL;
//phy_conf.mode = PHY_MODE_AUTONEGO;
if(phy_conf.mode == PHY_MODE_MANUAL)
{
phy_conf.speed = PHY_SPEED_100; // PHY_SPEED_10
phy_conf.duplex = PHY_DUPLEX_FULL; // PHY_DUPLEX_HALF
}
/* Set PHY configuration */
ctlwizchip(CW_SET_PHYPOWMODE, &phy_conf);
/* Reset PHY */
ctlwizchip(CW_RESET_PHY, &phy_conf);
delay(1000*3); // more than 1000ms
/* Get PHY configuration */
ctlwizchip(CW_GET_PHYPOWMODE, &phy_conf);
printf("\r\nMode : %s\r\n", phy_conf.mode ? "AUTO" : "MANUAL");
if(phy_conf.mode == PHY_MODE_MANUAL)
{
printf("Speed : %s\r\n", phy_conf.speed ? "100M" : "10M");
printf("Duplex : %s\r\n", phy_conf.duplex ? "FULL" : "HALF");
}
설정이 완료되면 아래와 같이 기존 Auto-Negotiation(자동 협상)을 통한 100FDX 우선결정이 아니라 사용자가 임의로 설정한 PHY Mode에 따라서 PHY Speed 및 Duplex가 변경되는 것을 확인할 수 있습니다.
댓글 영역