Ich habe mir vor kurzem das Olimex P107 dev board besorgt und versuche nun ein einfaches ethernet Frame mittels der integrierten MAC Einheit zu generieren, habe mir dazu auch die ethernet Codebeispiele angeschaut, werde darauß aber nicht schlau. Weiß vielleicht wer wie man die funktionen des STM32 Ethernet Treibers verwendet um ein frame zu empfangen und zu senden ? Die doku dazu ist leider etwas spärlich.. Mfg Lukas
Habe nun nochmal in den Ethernet Treiber vom STM32 reingeschaut, komme aber mit der Funktion zum Senden nicht zurecht, weiß wer welche Parameter man übergeben muss? Habe es mit einem Array versucht, haut aber nicht hin..
1 | /**
|
2 | * @brief Transmits a packet, from application buffer, pointed by ppkt.
|
3 | * @param ppkt: pointer to application packet buffer to transmit.
|
4 | * @param FrameLength: Tx Packet size.
|
5 | * @retval : ETH_ERROR: in case of Tx desc owned by DMA
|
6 | * ETH_SUCCESS: for correct transmission
|
7 | */
|
8 | uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength) |
9 | {
|
10 | uint32_t offset = 0; |
11 | |
12 | /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
|
13 | if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) |
14 | {
|
15 | /* Return ERROR: OWN bit set */
|
16 | return ETH_ERROR; |
17 | }
|
18 | |
19 | /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */
|
20 | for(offset=0; offset<FrameLength; offset++) |
21 | {
|
22 | (*(__IO uint8_t *)((DMATxDescToSet->Buffer1Addr) + offset)) = (*(ppkt + offset)); |
23 | }
|
24 | |
25 | /* Setting the Frame Length: bits[12:0] */
|
26 | DMATxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1); |
27 | /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */
|
28 | DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; |
29 | /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
|
30 | DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; |
31 | /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
|
32 | if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) |
33 | {
|
34 | /* Clear TBUS ETHERNET DMA flag */
|
35 | ETH->DMASR = ETH_DMASR_TBUS; |
36 | /* Resume DMA transmission*/
|
37 | ETH->DMATPDR = 0; |
38 | }
|
39 | |
40 | /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */
|
41 | /* Chained Mode */
|
42 | if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) |
43 | {
|
44 | /* Selects the next DMA Tx descriptor list for next buffer to send */
|
45 | DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr); |
46 | }
|
47 | else /* Ring Mode */ |
48 | {
|
49 | if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) |
50 | {
|
51 | /* Selects the first DMA Tx descriptor for next buffer to send: last Tx descriptor was used */
|
52 | DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); |
53 | }
|
54 | else
|
55 | {
|
56 | /* Selects the next DMA Tx descriptor list for next buffer to send */
|
57 | DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); |
58 | }
|
59 | }
|
60 | /* Return SUCCESS */
|
61 | return ETH_SUCCESS; |
62 | }
|
Im wesentlichen hilft hier (wie so oft beim STM32) wieder mal das Lesen des entsprechenden Kapitels im Reference Manual. Die ganz knappe Zusammenfassung: Um ein Paket zu versenden muss man sich eine zuerst jeweils eine Descriptor-Liste für RX und TX bauen, die wiederum Pointer auf die zu versendenden/empfangenen Daten enthält. Diese Descriptor-Liste kann entweder als Ring oder als Chain aufgebaut sein. Der eigentliche Versand erfolgt immer mit der DMA. Mit setzen des "OWN" bits übergibt man den Descriptor an die DMA: DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; Die DMA versendet dann die Daten und geht dann automatisch zum nächsten Eintrag in der Liste (sofern vorhanden). Das ganze ist ein wenig aufwändig, dafür aber recht performant. Ich hoffe, das hilft mal etwas für den Einstieg. Ethernet (und USB) sind die komplexesten Themen beim STM32 und da hilft dann halt nur lesen und duchbeissen.
Hallo Lukas, ich habe das gleiche Board und suche nach einem Projekt-Template für Eclipse+CodeSourcery+OpenOCD. Ich habe zwar ein Projekt für den STM32F103 aber ich weiss eben nicht genau, wie ich das anzupassen habe - ich bekomme es einfach nicht zum laufen. Kannst Du mir evtl. ein einfaches Projekt hochladen? Das würde mir sehr weiterhelfen! Danke schonmal im Voraus. Gruß Sammy
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.