www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik uIP und LPC2368


Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte gerne in meinem LPC2368 einen TCP-IP Stack implementieren. 
Irgendwie fehlt mir noch der Bezug wie ich uIP (von www.sics.se) mit dem 
Enthernet-Modul des LPC's verbinde.

Es müssen doch die Register des LPC2368 benutzt werden. Ich habe einen 
Micrel KSZ8721BLI als PHY eingesetzt. Muss ich den auch parametrieren?

Für Tipps und Hinweise wäre ich Dankbar.

Grüße Markus

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uIP behandelt nur den (TCP/UDP)-IP Teil, den Hardwaretreiber muss man da 
selber dazubasteln.
Also uIP gibt dir ein Ethernet-Paket als char[], raussenden musst du 
selber.
und Andersherum: Du empfängst ein Ethernet-Paket, dieses musst du dann 
an uIP weitergeben.

Mit etwas Glück und Google findest du vielleicht jemanden, der den Teil 
schon programmiert hat.

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Info, ich denke das FreeRTOS (V4.8.0) ist eine gute 
Vorlage. Der Umbau auf den Micrel war recht einfach:

Datei: emac.c
unsigned int PHY_id;  // ID from PHY

:  :  :  :  :
//--- in der Routine "Init_EMAC" ein paar Zeilen ändern (//<<<):

  PHY_id = (id1 << 16) | (id2 & 0xFFF0);   //<<<
  if ((PHY_id == DP83848C_ID) ||           //<<<
    (PHY_id == MII_KS8721_ID))             //<<<
  {
    /* Configure the PHY device */

    /* Use autonegotiation about the link speed. */
    write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
    /* Wait to complete Auto_Negotiation. */
    for (tout = 0; tout < 10; tout++) {
      vTaskDelay( 100 );
      regv = read_PHY (PHY_REG_BMSR);
      if (regv & 0x0020) {
        /* Autonegotiation Complete. */
        break;
      }
    }
  }
  else
  {
    xReturn = pdFAIL;
  }

  /* Check the link status. */
  if( xReturn == pdPASS )
  {
    xReturn = pdFAIL;
    for (tout = 0; tout < 10; tout++) {
      vTaskDelay( 100 );
      regv = read_PHY (PHY_REG_BMSR); // Bit exists in both PHY's   //<<<
      if (regv & 0x0004) {            //<<<
        /* Link is on. */
        xReturn = pdPASS;
        break;
      }
    }
  }

Datei: emac.h
#define MII_KS8721_ID     0x00221610  /* PHY Identifier                    */

extern unsigned int PHY_id;  // ID from PHY (DP83848C_ID Or MII_KS8721_ID), read from Device

Die unteren Register sind bei beiden gleich daher gibt es keine 
Komplikationen. Nur musste ich bei "/* Link is on. */" ein anderes 
Register verwenden, da das der Micrel nicht hatte. Also der Code sollte 
bei beiden PHY's funktionieren. Hat jemand ein Keil Demo-Bord der das 
mal Testen kann?

Funktionieren tuts bei meinem Micrel dennoch nicht. :(

Kann mir jemand einen bitte Tipp geben?

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.