www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik uIP und LPC2368

Autor: Markus Müller (Firma MmVisual) (mmvisual)
Datum: 26.03.2008 16:08

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: Ernst Bachmann (ernst)
Datum: 26.03.2008 16:52

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 (Firma MmVisual) (mmvisual)
Datum: 26.03.2008 22:09

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net