Forum: Mikrocontroller und Digitale Elektronik uIP und LPC2368


von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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

von Εrnst B. (ernst)


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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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
1
unsigned int PHY_id;  // ID from PHY
2
3
:  :  :  :  :
4
//--- in der Routine "Init_EMAC" ein paar Zeilen ändern (//<<<):
5
6
  PHY_id = (id1 << 16) | (id2 & 0xFFF0);   //<<<
7
  if ((PHY_id == DP83848C_ID) ||           //<<<
8
    (PHY_id == MII_KS8721_ID))             //<<<
9
  {
10
    /* Configure the PHY device */
11
12
    /* Use autonegotiation about the link speed. */
13
    write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
14
    /* Wait to complete Auto_Negotiation. */
15
    for (tout = 0; tout < 10; tout++) {
16
      vTaskDelay( 100 );
17
      regv = read_PHY (PHY_REG_BMSR);
18
      if (regv & 0x0020) {
19
        /* Autonegotiation Complete. */
20
        break;
21
      }
22
    }
23
  }
24
  else
25
  {
26
    xReturn = pdFAIL;
27
  }
28
29
  /* Check the link status. */
30
  if( xReturn == pdPASS )
31
  {
32
    xReturn = pdFAIL;
33
    for (tout = 0; tout < 10; tout++) {
34
      vTaskDelay( 100 );
35
      regv = read_PHY (PHY_REG_BMSR); // Bit exists in both PHY's   //<<<
36
      if (regv & 0x0004) {            //<<<
37
        /* Link is on. */
38
        xReturn = pdPASS;
39
        break;
40
      }
41
    }
42
  }

Datei: emac.h
1
#define MII_KS8721_ID     0x00221610  /* PHY Identifier                    */
2
3
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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.