2017-10-25 22 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は、100BASE-T4モードで DM9161Aを行うことができない DM9161Aが可能な全二重モードで100BASE-TXを実行することが可能です半二重モードで100BASE-TXを実行する DM9161Aは全二重モードで10BASE-Tを実行できます DM9161Aは半二重モードで10BASE-Tを実行できます PHYはプリアンブルが抑制された管理フレームを受け入れます 自動ネゴシエーションプロセス完了 リモート障害状態が検出されました DM9161Aは自動ネゴシエーションを実行できます リンクが確立されていません いいえj abber 拡張レジスタ可能

ここで、リモートフォルト状態が存在する理由はわかりません。また、リンクが確立されない理由もわかりません。オートネゴシエーションをスキップして、10baseT(全二重または半二重)または100baseT(全二重または半二重)に強制しようとすると、同じ値が残っています。

マイクロチップ社ではループバックを実行して問題を特定しようとしましたが、これを行う方法がわかりません。私はネットワークコントロールレジスタを使ってMACレベルでそれを行うことができますが、これを実行した後 - それが動作しているかどうかを確認するためにこのレベルで送受信しますか?私は基本モード制御レジスタを使ってPHYレベルでそれを行うことができますが、これを設定した後に再びテストする方法は?

評価ボードにこれを実行するように指示しています。結果を私が見ているものと比較し、外挿してみることができます(インターフェイスは少し異なりますが、LQFPパッケージ、 BGAではなく、インターフェイスのその部分がうまくいけば同じです。

おそらくスタック交換で答えが出る可能性の低いその他の質問 - PHYに出入りする信号ハードウェアの問題であれば、何を探すべきかを知っておく必要があります。

これについての洞察を持っている人なら、どんな助力もありがとうございます。

答えて

1

回答は、RJ11コネクタをボードに接続すると問題が解決しました。

0

コードは(長い時間が経過するとタイムアウトチェックに失敗します)。 ul_valueの値は常に0x7859です。これは、わかっている限り、以下を意味します。

基本モード制御レジスタ(BMCR)の値を読んで、11ビット(IEEEパワーダウン)値をチェックしてください。そのゼロの値がPHYレジスタを意味する場合、我々はアクセスすることができるが、いくつかの動作またはリンクが確立できないか、または自動ネゲートタイムアウトが起こる。

これに対応して、INT/PWDNレジスタまたはストラップ構成を有効にする方法については、私のケースでは7番目のビットのCFG3レジスタを有効にしてください。 上記の問題を解決する可能性があります。

関連する問題