lwiplib.c 파일에서 bmsr을검색하면 link status를 감지하는 방법을 알 수있다.
먼저 이더넷 initialization 를 하면 Ethernet_getHandle() 함수 안에서 phy 설정을 하고 있긴한데, 그렇게 그냥 써도 이더넷통신은 되지만 phy 칩을 직접 다루려면 바깥에서 올바른 설정값으로 다시 설정해줄 필요가 있다.
#define EPHY_BMSR 0x00000001 // Ethernet PHY Basic Mode Status
#define EPHY_BMSR_LINKSTAT 0x00000004 // Link Status
//MDIO Configurations
Ethernet_configureMDIO(Ethernet_device_struct.baseAddresses.enet_base, 0U, 1U, 0U);
// phy address = 1, RX_D[0:3]-> PD, COL->PU
Ethernet_configurePHYAddress(Ethernet_device_struct.baseAddresses.enet_base, 1U);
// ...
if((Ethernet_readPHYRegister(EMAC_BASE, EPHY_BMSR) & EPHY_BMSR_LINKSTAT))
{
printf("There's a link");
}
else
{
printf("no link");
}
Ethernet_configureMDIO() 함수는 첫번째와 두번째 파라미터로 MDIO 클락 설정을 한다. MDIO 클락은 PHY 이더넷 데이터 전송 속도(10/100M bps)와는 별개이고 PHY 칩과 통신하여 레지스터 설정 등 관리 작업 수행시 사용되는 통신 인터페이스의 클락 주파수를 말한다.
그리고 Ethernet_configureMDIO() 함수의 세번째 파라미터는 0이면 Clause 22 mode로 1이면 Clause 45 mode로 작동한다.
그 다음 나오는 Ethernet_configurePHYAddress() 함수의 두번째 파라미터로 PHY address를 지정하는데 이땐 데이터 시트와 회로도를 같이 봐야 한다.
PHY 인터페이스는 I2C랑 비슷한 측면이 많다.
PHY칩을 구별하는데 5 bit Address가 사용되어서 0부터 31까지 최대 32개 PHY가 버스에 연결 될 수 있으며, 리셋 시 특정 핀의 PU/PD 상태에 의해 칩의 주소가 결정된다.
Address 설정 핀들이 external pullup/pulldown 처리가 안되어있으면 default PHY address는 0x01 이다.
아래 컨드롤카드의 회로도를 보면 이더캣 P1포트랑 연결된 PHY(아래)가 디폴트로 설치되어 있고 PHY address는 0x01이며, 이더캣 P0포트랑 연결된 PHY칩(위)의 PHY address가 0x00이다.
아래는 이더넷 포트인데 아래처럼 풀업/풀다운 처리가 안되어있으면 default address인 0x01이다. 이러면 EtherCAT P1 phy랑 충돌이 되는데 왜 이렇게 설계했는지는 모르겠다.
아무튼 설정 후 아래 함수를 통해 PHY 레지스터를 읽으면 Link Status를 확인할 수 있다.
Ethernet_readPHYRegister(EMAC_BASE, 0x0001) & 0x0004
PHY칩 데이터시트에서 레지스터맵을 확인해보자.
모든 제조사의 PHY가 동일한 것이 레지스터 주소 0x0000은 Basic Mode Control Register (BMCR)이고,
주소 0x0001이 Basic Mode Status Register (BMSR)이다.
그리고 BMSR레지스터의 두번째 bit에 Link Status라서 읽은 값에 0x4를 &연산하여 확인할 수 있다.
다만 특이한것은 타입이 RO(Read Only), LL(Latching Low)이어서 link-up 이후 두번째로 읽었을 때 1이 되기 때문에 주기적으로 체크하는게 아니라 단일 명령으로 읽었을 땐 정확한 결과가 안나올 수 있는 점을 고려해서 코드를 짜야한다. (혹은 두번읽으면 된다.)
BMSR레지스터의 값은 랜선이 안꼽혔을 땐 0x7849 꼽혔을 때는 0x784D로 읽힌다.
만약 PHY 주소설정을 잘못했으면 0xFFFF로 읽힐테니 0부터 31까지 다 체크해서 0xFFFF가 아닌 값이 읽히는 주소가 있는지 확인하는 것도 한 방법이다.
참고. BMCR 레지스터
'임베디드 개발 > TMS320F2838x (C28x)' 카테고리의 다른 글
TMS320F28388D ] Ethernet_resetModule() 무한루프 문제 (0) | 2023.03.31 |
---|---|
TMS320F28388D ] CM코어에 lwIP 포팅 (0) | 2023.03.31 |
변수를 특정 메모리 영역(섹션 또는 주소)에 배치하기 [공개] (0) | 2023.02.28 |
Interrupt Nesting & SW Priorization [공개] (2) | 2023.02.25 |
CANFD (MCAN) [공개] (0) | 2023.02.25 |