Forum: Mikrocontroller und Digitale Elektronik LPCOpen lwip lpc1768 AHB Schreiben


von Pascal H. (_pascal_)


Lesenswert?

Hallo,

ich versuche gerade das lpcopen echo server example auf meinem lpc1768 
zum laufen zu bekommen. Als dev Board habe ich ein mini-dk2 welches den 
gleichen ethernet phy lan8720a wie auf dem NXP_LPCXPRESSO board hat.

Mein Projekt habe ich soweit aufgesetzt und der compiler laeuft auch 
durch.

Ich habe jetzt nach und nach die funktionen zum Initialisieren von lwip 
in der main hinzugefuegt.

Nachdem ich das hinzugefuegt habe ging meine Systick LED nicht mehr...
1
netif_add(&lpc_netif, &ipaddr, &netmask, &gw, NULL, lpc_enetif_init, ethernet_input);

Ich habe mich auf die Suche gemacht...
lpc_enetif_init -> low_level_init -> Chip_ENET_Init(LPC_ETHERNET, true)

Hier drin wird der Peripherial Clock gesetzt und resetENET aufgerufen.
So und danach wird das pENET struct beschrieben ... genau da 
verabschiedet sich das Programm.
1
void Chip_ENET_Init(LPC_ENET_T *pENET, bool useRMII)
2
{
3
  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_ENET);
4
  resetENET(pENET);
5
6
  /* Initial MAC configuration for  full duplex,
7
     100Mbps, inter-frame gap use default values */
8
  pENET->MAC.MAC1 = ENET_MAC1_PARF;
9
  pENET->MAC.MAC2 = ENET_MAC2_FULLDUPLEX | ENET_MAC2_CRCEN | ENET_MAC2_PADCRCEN;
10
11
  Board_LED_Set(LEDS_LED1, 0);
12
13
  if (useRMII) {
14
    pENET->CONTROL.COMMAND = ENET_COMMAND_FULLDUPLEX | ENET_COMMAND_PASSRUNTFRAME | ENET_COMMAND_RMII;
15
  }
16
  else {
17
    pENET->CONTROL.COMMAND = ENET_COMMAND_FULLDUPLEX | ENET_COMMAND_PASSRUNTFRAME;
18
  }
19
20
  pENET->MAC.IPGT = ENET_IPGT_FULLDUPLEX;
21
  pENET->MAC.IPGR = ENET_IPGR_P2_DEF;
22
  pENET->MAC.SUPP = ENET_SUPP_100Mbps_SPEED;
23
  pENET->MAC.MAXF = ENET_ETH_MAX_FLEN;
24
  pENET->MAC.CLRT = ENET_CLRT_DEF;
25
26
  /* Setup default filter */
27
  pENET->CONTROL.COMMAND |= ENET_COMMAND_PASSRXFILTER;
28
29
  /* Clear all MAC interrupts */
30
  pENET->MODULE_CONTROL.INTCLEAR = 0xFFFF;
31
32
  /* Disable MAC interrupts */
33
  pENET->MODULE_CONTROL.INTENABLE = 0;
34
35
}

Ich habe mal geschaut wo hin dieser pointer zeigt.
1
/* AHB peripheral */
2
#define LPC_ENET_BASE             0x50000000

Das ist laut UM10360.pdf auch voellig richtig. Leider weis ich nicht 
warum ich da nichts schreiben darf :(

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Schau Dir mal an was Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_ENET); so 
treibt. Das Bit 30 in LPC_SC->PCONP muss danach gesetzt sein.

von Pascal H. (_pascal_)


Lesenswert?

Genau das was du gesagt hast ... SYSCTL_CLOCK_ENET = 30
1
/* Enables power and clocking for a peripheral */
2
void Chip_Clock_EnablePeriphClock(CHIP_SYSCTL_CLOCK_T clk) {
3
  uint32_t bs = (uint32_t) clk;
4
5
#if defined(CHIP_LPC40XX)
6
  if (bs >= 32) {
7
    LPC_SYSCTL->PCONP1 |= (1 << (bs - 32));
8
  }
9
  else {
10
    LPC_SYSCTL->PCONP |= (1 << bs);
11
  }
12
#else
13
  LPC_SYSCTL->PCONP |= (1 << bs);
14
#endif
15
}

und ein
1
LPC_SYSCTL->PCONP & (1 << 30);

Zeigt auch dass dies geschehen ist.

von Pascal H. (_pascal_)


Lesenswert?

Hat sich erledigt ...

Ich hatte die SystemInit function selbst implementiert am Anfang und 
etwas herumgespielt -> es wurde der interne Clock verwendet.

Jetzt funktioniert das Ganze und der Stack laeuft :)

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.