2017-10-25 17 views
0

저는 마이크로 칩 (Atmel) SAM3X8C를 기반으로 한 디자인 작업을하고 있습니다. 디자인의 이더넷 부분은 ATSAM3S-EK2-ND 보드 (필자는 가지고 있지 않지만 그림은 레이아웃의 기초가 됨)에서 복사됩니다. 필자는 도면 (및 코드)을 살펴본 마이크로 칩과 연락을 취해 그것이 옳다고 생각했습니다.이더넷 PHY 문제

문제는 하드웨어 초기화를 완료 할 수 없어서 계속하는 방법이 손실되었습니다.

사용되는 PHY는 Davicom DS9161A이며 ASF에서 직접 지원됩니다 (이 부분은 평가 보드에서 사용 된 것과 동일하게 선택되었습니다). PHY에 대한 통신이 작동 중입니다. ASF에서 생성 된 코드에서 레지스터를 읽고 쓰고 있기 때문에이 값을 알고 있습니다. 그리고 값이 정확한 값을 읽는 것을 알고 있습니다 (예 : PHYID1 레지스터가 올바른 값을 제공하고 있습니다. 0x0181).

링크를 가져 오는 동안 문제가 발생합니다. 자동 구성을 시도하면 시간 초과로 실패합니다. 이것은 자동 협상을 시도하는 ASF 생성 코드에서 발생합니다. 그래서 나는이 시점까지 시도 무엇에 대한 몇 가지 의견을 만들 수 있습니다 여기에 코드를 포함하고있다 : (같이)

uint8_t ethernet_phy_auto_negotiate(Emac *p_emac, uint8_t uc_phy_addr) 
{ 
    uint32_t ul_retry_max = ETH_PHY_RETRY_MAX; 
    uint32_t ul_value; 
    uint32_t ul_phy_anar; 
    uint32_t ul_phy_analpar; 
    uint32_t ul_retry_count = 0; 
    uint8_t uc_fd = 0; 
    uint8_t uc_speed = 0; 
    uint8_t uc_rc = EMAC_TIMEOUT; 

    emac_enable_management(p_emac, true); 

    /* Set up control register */ 
    uc_rc = emac_phy_read(p_emac, uc_phy_addr, MII_BMCR, &ul_value); 
    if (uc_rc != EMAC_OK) { 
     emac_enable_management(p_emac, false); 
     return uc_rc; 
    } 

    ul_value &= ~MII_AUTONEG; /* Remove auto-negotiation enable */ 
    ul_value &= ~(MII_LOOPBACK | MII_POWER_DOWN); 
    ul_value |= MII_ISOLATE; /* Electrically isolate PHY */ 
    uc_rc = emac_phy_write(p_emac, uc_phy_addr, MII_BMCR, ul_value); 
    if (uc_rc != EMAC_OK) { 
     emac_enable_management(p_emac, false); 
     return uc_rc; 
    } 

    /* 
    * Set the Auto_negotiation Advertisement Register. 
    * MII advertising for Next page. 
    * 100BaseTxFD and HD, 10BaseTFD and HD, IEEE 802.3. 
    */ 
    ul_phy_anar = MII_TX_FDX | MII_TX_HDX | MII_10_FDX | MII_10_HDX | 
      MII_AN_IEEE_802_3; 
    uc_rc = emac_phy_write(p_emac, uc_phy_addr, MII_ANAR, ul_phy_anar); 
    if (uc_rc != EMAC_OK) { 
     emac_enable_management(p_emac, false); 
     return uc_rc; 
    } 

    /* Read & modify control register */ 
    uc_rc = emac_phy_read(p_emac, uc_phy_addr, MII_BMCR, &ul_value); 
    if (uc_rc != EMAC_OK) { 
     emac_enable_management(p_emac, false); 
     return uc_rc; 
    } 

    ul_value |= MII_SPEED_SELECT | MII_AUTONEG | MII_DUPLEX_MODE; 
    uc_rc = emac_phy_write(p_emac, uc_phy_addr, MII_BMCR, ul_value); 
    if (uc_rc != EMAC_OK) { 
     emac_enable_management(p_emac, false); 
     return uc_rc; 
    } 

    /* Restart auto negotiation */ 
    ul_value |= MII_RESTART_AUTONEG; 
    ul_value &= ~MII_ISOLATE; 
    uc_rc = emac_phy_write(p_emac, uc_phy_addr, MII_BMCR, ul_value); 
    if (uc_rc != EMAC_OK) { 
     emac_enable_management(p_emac, false); 
     return uc_rc; 
    } 

    /* Check if auto negotiation is completed */ 
    while (1) { 
     uc_rc = emac_phy_read(p_emac, uc_phy_addr, MII_BMSR, &ul_value); 
     if (uc_rc != EMAC_OK) { 
      emac_enable_management(p_emac, false); 
      return uc_rc; 
     } 
     /* Done successfully */ 
     if (ul_value & MII_AUTONEG_COMP) { 
      break; 
     } 

     /* Timeout check */ 
     if (ul_retry_max) { 
      if (++ul_retry_count >= ul_retry_max) { 
       emac_enable_management(p_emac, false); 
       return EMAC_TIMEOUT; 
      } 
     } 
    } 

    /* Get the auto negotiate link partner base page */ 
    uc_rc = emac_phy_read(p_emac, uc_phy_addr, MII_ANLPAR, &ul_phy_analpar); 
    if (uc_rc != EMAC_OK) { 
     emac_enable_management(p_emac, false); 
     return uc_rc; 
    } 

    /* Set up the EMAC link speed */ 
    if ((ul_phy_anar & ul_phy_analpar) & MII_TX_FDX) { 
     /* Set MII for 100BaseTX and Full Duplex */ 
     uc_speed = true; 
     uc_fd = true; 
    } else if ((ul_phy_anar & ul_phy_analpar) & MII_10_FDX) { 
     /* Set MII for 10BaseT and Full Duplex */ 
     uc_speed = false; 
     uc_fd = true; 
    } else if ((ul_phy_anar & ul_phy_analpar) & MII_TX_HDX) { 
     /* Set MII for 100BaseTX and half Duplex */ 
     uc_speed = true; 
     uc_fd = false; 
    } else if ((ul_phy_anar & ul_phy_analpar) & MII_10_HDX) { 
     /* Set MII for 10BaseT and half Duplex */ 
     uc_speed = false; 
     uc_fd = false; 
    } 

    emac_set_speed(p_emac, uc_speed); 
    emac_enable_full_duplex(p_emac, uc_fd); 

    emac_enable_rmii(p_emac, ETH_PHY_MODE); 
    emac_enable_transceiver_clock(p_emac, true); 

    emac_enable_management(p_emac, false); 
    return uc_rc; 
} 

코드는 한참 후에 시간 초과 확인에 실패합니다. ul_value의 값은 지금까지 내가 이해, 의미, 항상 0x7859입니다 :

DM9161A는 DM9161A는 DM9161A는 수 전이중 모드에서 100BASE-TX를 수행 할 수 100BASE-T4 모드에서 수행 할 수 없습니다 반이중 모드에서 100BASE-TX를 수행하는 방법 DM9161A는 전이중 모드에서 10BASE-T를 수행 할 수 있습니다. DM9161A는 반이중 모드에서 10BASE-T를 수행 할 수 있습니다. PHY는 프리앰블이 억제 된 관리 프레임을 수신합니다. 자동 협상 프로세스가 아닙니다. 완료 원격 결함 상태가 감지 됨 DM9161A가 자동 협상을 수행 할 수 있습니다. 링크가 설정되지 않았습니다. 아니오 abber 확장 등록 가능

이제 원격 장애 상태가있는 이유를 알 수 없으며 링크가 설정되지 않은 이유를 이해할 수 없습니다. 자동 협상을 건너 뛰고 10baseT (전이중 또는 반이중) 또는 100baseT (전이중 또는 반이중)로 강제 설정하려고해도 동일한 값을 유지합니다.

마이크로 칩은 루프백을 통해 문제를 격리하려고 시도했지만이 방법은 확실하지 않습니다. 네트워크 제어 레지스터를 사용하여 MAC 레벨에서 수행 할 수 있습니다. 그러나이 작업을 수행 한 후 -이 레벨에서 작동하는지 확인하려면 어떻게 보내고받을 수 있습니까? 기본 모드 제어 레지스터를 사용하여 PHY 레벨에서 수행 할 수 있지만 다시 설정해야합니다.

평가 보드에이 작업을 시도해달라고 요청합니다. 결과를 내가보고있는 것과 비교하고, (인터페이스가 약간 다르지만 LQFP 패키지를 사용하고 있지만, BGA가 아니지만 인터페이스의 해당 부분은 희망적으로 동일합니다.

스택 교환에 대한 답변을 얻지 못할 가능성이있는 기타 질문 - PHY에 들어갔다 나오는 신호 하드웨어 문제 일 경우 무엇을 찾아야 할지를 알아야합니다.

아무런 통찰력이있는 사람이라면 도움이 될 것입니다.

답변

1

응답이 문제가 해결되면 보드에 RJ11 커넥터가 잘못 연결되었습니다.

0

코드가 (있는 그대로) 오랫동안 시간 초과 후 시간 초과 확인에 실패합니다. ul_value의 값은 항상 0x7859입니다. 이해할 수있는 한 다음을 의미합니다.

기본 모드 제어 레지스터 (BMCR)의 값을 읽고 11 비트 (IEEE 전원 차단) 값을 확인하십시오. 그것의 제로 thats는 PHY 레지스터를 의미하지만 우리는 액세스 할 수 있지만 어떤 동작이나 링크는 설정 될 수 없거나 자동 네거티브 타임 아웃이 일어날 것입니다.

데이터 시트에서 INT/PWDN 레지스터 또는 스트랩 구성을 활성화하는 방법을 확인하십시오. 제 7 번째 비트 CFG3 레지스터를 활성화하십시오. 위의 문제가 해결 될 수 있습니다.