Forum: Mikrocontroller und Digitale Elektronik LwIp-Stack: Raw Ethernet Packete senden


von EmbeddedUser (Gast)


Lesenswert?

Guten Morgen,

ich verwende auf einem STM32 den LwIp-Stack. Eine Kommunikation mit UDP 
funktioniert soweit. Nun habe ich folgende Anforderung. Es sollen reine 
Ethernetpackete erzeugt und versendet werden. Mit welchen Funktionen 
kann dies mit dem LwIp-Stack realisiert werden ?

von EmbeddedUser (Gast)


Lesenswert?

Mit dieser Funktion funktioniert das Versenden von Ethernetpacketen 
nicht:
1
uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength)
2
{ 
3
  uint32_t offset = 0;
4
    
5
  /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
6
  if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET)
7
  {
8
    /* Return ERROR: OWN bit set */
9
    return ETH_ERROR;
10
  }
11
  
12
  /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */      
13
  for(offset=0; offset<FrameLength; offset++)       
14
  {
15
    (*(__IO uint8_t *)((DMATxDescToSet->Buffer1Addr) + offset)) = (*(ppkt + offset));
16
  }
17
        
18
  /* Setting the Frame Length: bits[12:0] */
19
  DMATxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1);
20
  /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */    
21
  DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS;
22
  /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
23
  DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
24
  /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
25
  if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET)
26
  {
27
    /* Clear TBUS ETHERNET DMA flag */
28
    ETH->DMASR = ETH_DMASR_TBUS;
29
    /* Resume DMA transmission*/
30
    ETH->DMATPDR = 0;
31
  }
32
  
33
  /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */  
34
  /* Chained Mode */
35
  if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET)
36
  {     
37
    /* Selects the next DMA Tx descriptor list for next buffer to send */ 
38
    DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr);    
39
  }
40
  else /* Ring Mode */
41
  {  
42
    if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET)
43
    {
44
      /* Selects the first DMA Tx descriptor for next buffer to send: last Tx descriptor was used */
45
      DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR);      
46
    }
47
    else
48
    {  
49
      /* Selects the next DMA Tx descriptor list for next buffer to send */
50
      DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2));      
51
    }
52
  }
53
  /* Return SUCCESS */
54
  return ETH_SUCCESS;   
55
}

von EmbeddedUser (Gast)


Lesenswert?

Ich hab den Fehler nun gefunden. Ich habe bei der Eingabe von der Ziel 
MAC Adresse einen Fehler gemacht. Die Funktion "ETH_HandleTxPkt" kann 
für das Versenden von Ethernet Packet benutzt werden

von Benjamin (Gast)


Lesenswert?

Hallo

Ich würde gerne wissen welchen stm32 du verwendest, da ich für meine 
Maturaarbeit einen Webserver auf meinem stm32f103rb realisieren muss und 
auch überlege den lwIP zu verwenden wobei ich nicht sicher bin ob das 
überhaupt geht da möglicherweise zu wenig Speicher vorhanden ist.

Da du dich da anscheinend schon ein bisschen auskennst hatte ich gehofft 
ob du mir möglicherweise sagen könntest ob das überhaupt möglich ist.

Schon mal Danke im vorraus.

lg
Benjamin

von EmbeddedUser (Gast)


Lesenswert?

Guten Morgen Benjamin,

der Mikrocontroller stm32f103rb besitzt keine Ethernetschnittstelle. Du 
müsstest einen STM32F207 benutzen. Der hat eine Ethernetschnittstelle. 
Da braucht man dann allerdings noch einen Ethernet Physical Transceiver.

von Benjamin (Gast)


Lesenswert?

ja ich hab die Ethernetschnittstelle mit dem enc28j60 reallisiert

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.