www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91SAM9260 Auto-negotiation


Autor: Hans N. (j_n)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein (etwas seltsames) Problem mit der Auto negotiation meines 
Olimex Boards (AT91SAM9260).

Wenn ich das Board mit dem Netzwerk oder PC (egal ob gekreuztes Kabel 
oder nicht) funktioniert die Auto negotiation nicht. Die Verbindung 
bricht in jener Zeile ab, wo ich das Autonegotiation enable Bit setze.

Das seltsame ist, wenn ich das Board über einen ASUS (Gigabit) Switch 
verbinde, funktioniert die Auto negotiation und der Code einwandfrei.
Schlussendlich habe ich es noch mit einem Synergy-Switch versucht, aber 
dies funktioniert dann wieder nicht.

Hat jemand eine Idee woran das liegen könnte? Das Board hat einen Micrel 
KSZ8721 PHY drauf. Gibt es vl mit diesem Probleme in Bezug auf Auto 
negotiation? Oder fällt jemand ein Codefehler auf.

Gruß
unsigned char KS8721_AutoNegotiate(Ks8721 *pKs)
{
    unsigned int retryMax;
    unsigned int value;
  unsigned int value2;
    unsigned int phyAnar;
    unsigned int phyAnalpar;
    unsigned int retryCount= 0;
    unsigned char phyAddress;
    unsigned char rc = 1;
  int auto_neg_configure = 1;

    ASSERT(pKs, "-F- KS8721_AutoNegotiate\n\r");
    phyAddress = pKs->phyAddress;
    retryMax = pKs->retryMax;

    EMAC_EnableMdio();

    if (!EMAC_ReadPhy(phyAddress, KS8721_PHYID1, &value, retryMax)) 
   {
      TRACE_ERROR("Pb EMAC_ReadPhy Id1\n\r");
      rc = 0;
      goto AutoNegotiateExit;
     }

    if (!EMAC_ReadPhy(phyAddress, KS8721_PHYID2, &phyAnar, retryMax)) 
   {
      TRACE_ERROR("Pb EMAC_ReadPhy Id2\n\r");
      rc = 0;
      goto AutoNegotiateExit;
     }
  value2 = ((phyAnar>>10) & KS8721_LSB_MASK);

    if( ( value == KS8721_OUI_MSB ) && ( value2 == KS8721_OUI_LSB)) 
   {
//    TRACE_DEBUG("Vendor Number Model = 0x%X\n\r", ((phyAnar>>4)&0x3F));
//      TRACE_DEBUG("Model Revision Number = 0x%X\n\r", (phyAnar&0x7));
     }
    else 
   {
      TRACE_ERROR("Problem OUI value -> no Micrel PHY found\n\r");
     }        

     // Setup control register
     rc  = EMAC_ReadPhy(phyAddress, KS8721_BMCR, &value, retryMax);
     if (rc == 0) 
    {
     goto AutoNegotiateExit;
      }

     value &= ~KS8721_AUTONEG;                                    // Remove autonegotiation enable
     value &= ~(KS8721_LOOPBACK|KS8721_POWER_DOWN);
     value |=  KS8721_ISOLATE;                                    // Electrically isolate PHY
     rc = EMAC_WritePhy(phyAddress, KS8721_BMCR, value, retryMax);
     if (rc == 0) 
    {
     goto AutoNegotiateExit;
      }

    // Set the Auto_negotiation Advertisement Register
    // MII advertising for Next page
    // 100BaseTxFD and HD, 10BaseTFD and HD, IEEE 802.3
    phyAnar = KS8721_NP | KS8721_TX_FDX | KS8721_TX_HDX |
              KS8721_10_FDX | KS8721_10_HDX | KS8721_AN_IEEE_802_3;
    rc = EMAC_WritePhy(phyAddress, KS8721_ANAR, phyAnar, retryMax);
    if (rc == 0) 
   {
    goto AutoNegotiateExit;
     }

    // Read & modify control register
    rc  = EMAC_ReadPhy(phyAddress, KS8721_BMCR, &value, retryMax);
    if (rc == 0) 
   {
    goto AutoNegotiateExit;
     }

    value |= KS8721_SPEED_SELECT | KS8721_AUTONEG | KS8721_DUPLEX_MODE;
    rc = EMAC_WritePhy(phyAddress, KS8721_BMCR, value, retryMax);            //Set Autonegotiate enable; CONNECTION ABORTED
    if (rc == 0) 
   {
    goto AutoNegotiateExit;
     }   

    // Restart Auto_negotiation
    value |=  KS8721_RESTART_AUTONEG;                      // Restart Auto negotiate
    value &= ~KS8721_ISOLATE;
    rc = EMAC_WritePhy(phyAddress, KS8721_BMCR, value, retryMax);
    if (rc == 0) 
   {
    goto AutoNegotiateExit;
     }
    // Check AutoNegotiate complete
    while (1) 
   {
    rc  = EMAC_ReadPhy(phyAddress, KS8721_BMSR, &value, retryMax);
      if (rc == 0) 
     {
      TRACE_ERROR("rc==0\n\r");
        goto AutoNegotiateExit;
       }
      //TRACE_DEBUG(" _BMSR: 0x%X\n\r", value);
      // Done successfully
      if (value & KS8721_AUTONEG_COMP) 
     {
      TRACE_INFO("AutoNegotiate complete\n\r");
        //     rc = EMAC_WritePhy(phyAddress, DM9161_BMCR, value, retryMax);
        //    TRACE_DEBUG(" _BMCR: 0x%X\n\r", value);
        break;
       }

        // Timeout check
      if (retryMax)
     {
      if (++ retryCount >= retryMax) 
       {
      KS8721_DumpRegisters(pKs);
          TRACE_INFO("no AutoNeg link partner found -> set 100Base HalfDuplex\n\r");

//          TRACE_FATAL("TimeOut\n\r");
        auto_neg_configure = 0;
      break;
         }
       }
    }

Autor: Hans N. (j_n)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt rausgefunden, dass sobald das Auto negotiation Bit 
gesetzt oder neu gestartet wird, die Verbindung abbricht. Beim ASUS 
Switch wird die Verbindung jeweils kurz zurückgesetzt, startet dann 
automatisch wieder.

Somit sollte das Problem entweder beim Switch liegen oder beim PHY. Hat 
jemand einen konrekteren Verdacht?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.