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 ?
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 | }
|
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.