LwIp-Stack: Raw Ethernet Packete senden

Gast #2849362
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 ?
Gast #2849373
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
}
Gast #2849427
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
Gast #2850701
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
Gast #2850910
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren