Forum: Mikrocontroller und Digitale Elektronik STM32F4x7, Ethernet, DP83848I


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hendrik K. (hendrik2021)


Lesenswert?

Servus,

folgende Frage:
ich würde gerne meinen PHY(DP83848) mit dem MAC/uC betreiben. Ich nutze 
RMII und mein PHY stellt mir meine 50Mhz. Jetzt möchte ich die 50MHZ 
doch als Input an PA1 (ETH_RMII_REF_CLK oder so) haben.
Oder sehe ich hier etwas falsch?
Wie kann ich in der Cube IDE meinen PIN als Input labeln und einen 
zusätzlichen Takt in der Clock Configuartion hinzufügen?

Hier sind grad nur die vorgefertigten clocks (...) ich nutze das 
STM32F407VG Disco Kit.

Oder wird der PA1/ETH_RMII_REF_CLK sobald ich mein ETH eibinde als INPUT 
gelabeld? Steht aber wenn nirgends... oder zumindest habe ich das nicht 
gefunden. Wie würde ich dann meinem MAC sagen, dass ich einen 50Mhz 
Clock nutzen möchte?

Bin neu in dem Bereich :-)
Hoffe mir kann jemand von Euch helfen!
Danke im Voraus! :D

von Frank K. (fchk)


Lesenswert?

Hendrik K. schrieb:

> Oder wird der PA1/ETH_RMII_REF_CLK sobald ich mein ETH eibinde als INPUT
> gelabeld? Steht aber wenn nirgends... oder zumindest habe ich das nicht
> gefunden. Wie würde ich dann meinem MAC sagen, dass ich einen 50Mhz
> Clock nutzen möchte?

Zwei Schritte:

1. Pin PA1 auf die Alternate Function 11 stellen - damit hat er 
automatisch entweder die Funktion ETH_MII_RX_CLK oder ETH_RMII_REF_CLK. 
Diese Funktion ist immer ein Eingang.

2. Den Ethernet MAC per MII_RMII_SEL Bit auf RMII stellen. RMII 
erfordert grundsätzlich einen 50 MHz Takt, MII 25 MHz bei 100 MBit/s 
oder 2.5 MHz bei 10 MBit/s.
Siehe RM0090, 33.4.4 MII/RMII selection

fchk

von Wastl (hartundweichware)


Lesenswert?

Wenn du in CubeMX unter Connectivity "ETH" auswählst/aktivierst
bekommst du einen Satz von GPIOs konfiguriert wo der RefClock
dabei ist. Der Codegenerator erzeugt dir einen Satz von Pins
zu Initialisierung für deinen PHY.

Der Code steht dann in <ethernetif.c>
Damit deine Frage(n) beantwortet?
1
void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
2
{
3
  GPIO_InitTypeDef GPIO_InitStruct = {0};
4
  if(ethHandle->Instance==ETH)
5
  {
6
  /* USER CODE BEGIN ETH_MspInit 0 */
7
8
  /* USER CODE END ETH_MspInit 0 */
9
    /* Enable Peripheral clock */
10
    __HAL_RCC_ETH_CLK_ENABLE();
11
  
12
    __HAL_RCC_GPIOC_CLK_ENABLE();
13
    __HAL_RCC_GPIOA_CLK_ENABLE();
14
    __HAL_RCC_GPIOB_CLK_ENABLE();
15
    /**ETH GPIO Configuration    
16
    PC1     ------> ETH_MDC
17
    PA1     ------> ETH_REF_CLK
18
    PA2     ------> ETH_MDIO
19
    PA7     ------> ETH_CRS_DV
20
    PC4     ------> ETH_RXD0
21
    PC5     ------> ETH_RXD1
22
    PB11     ------> ETH_TX_EN
23
    PB12     ------> ETH_TXD0
24
    PB13     ------> ETH_TXD1 
25
    */
26
    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
27
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
28
    GPIO_InitStruct.Pull = GPIO_NOPULL;
29
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
30
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
31
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
32
33
    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
34
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
35
    GPIO_InitStruct.Pull = GPIO_NOPULL;
36
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
37
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
38
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
39
40
    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13;
41
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
42
    GPIO_InitStruct.Pull = GPIO_NOPULL;
43
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
44
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
45
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
46
47
  /* USER CODE BEGIN ETH_MspInit 1 */
48
49
  /* USER CODE END ETH_MspInit 1 */
50
  }
51
}

von Wastl (hartundweichware)


Lesenswert?

Hendrik K. schrieb:
> Ich nutze RMII und mein PHY stellt mir meine 50Mhz.

Nein! Dein PHY erzeugt keinen Referenzclock! Du brauchst einen
externen Oszillator. Empfehlung: nimm nicht die Clock-Erzeugung
deines F407 sondern spendiere einen eigenen Oszillator fürs
Ethernet. Sparsame Gesellen verwenden 50MHz generiert aus einer
PLL im F407, das ist nicht günstig und fehleranfällig wegen hohem
Jitter.

von Hendrik K. (hendrik2021)


Lesenswert?

ich meine damit, dass auf dem PCB wo der PHY sitzt auch ein cmos oszi 
sitzt der mir meinen Takt generiert :D.

Danke für die Posts sitze grad noch im Zug! Sobald ich daheim bin 
probiere ich das mal aus!

Danke!

von Wastl (hartundweichware)


Lesenswert?

Hendrik K. schrieb:
> ich meine damit, dass auf dem PCB wo der PHY sitzt auch ein cmos oszi
> sitzt der mir meinen Takt generiert

Tja, wenn man sich nich klar ausdrückt dann kommt es zu solchen
Misverständnissen. Die Version mit dem PHY-Modul mit Oszillator
ist natürlich die optimale für den RefClock.

von Hendrik K. (hendrik2021)


Lesenswert?

Frank K. schrieb:
> Hendrik K. schrieb:
>
>> Oder wird der PA1/ETH_RMII_REF_CLK sobald ich mein ETH eibinde als INPUT
>> gelabeld? Steht aber wenn nirgends... oder zumindest habe ich das nicht
>> gefunden. Wie würde ich dann meinem MAC sagen, dass ich einen 50Mhz
>> Clock nutzen möchte?
>
> Zwei Schritte:
>
> 1. Pin PA1 auf die Alternate Function 11 stellen - damit hat er
> automatisch entweder die Funktion ETH_MII_RX_CLK oder ETH_RMII_REF_CLK.
> Diese Funktion ist immer ein Eingang.
>
> 2. Den Ethernet MAC per MII_RMII_SEL Bit auf RMII stellen. RMII
> erfordert grundsätzlich einen 50 MHz Takt, MII 25 MHz bei 100 MBit/s
> oder 2.5 MHz bei 10 MBit/s.
> Siehe RM0090, 33.4.4 MII/RMII selection
>
> fchk

okay, der PHY befindet sich im RMII Modus - logisch.
PIN PA1 ist als ETH_RMII_REF_CLK gelabeld als "Alternate Function". 
Alternate Function 11 bedeutet ja, dass der GPIO als ETH_RMII_REF_CLk 
genutzt wird, oder muss ich hier noch etwas in den Registern ändern?

Der PIN ist also ein Input, oder?

Mein PHY und MAC sollen (müssen) doch synchron laufen, d.h. beide 
brauchen doch auch die gleiche Quelle für die Referenzclock, oder nicht 
(also meine 50Mhz)?

Wie konfiguriere ich das in der Clock Config?

Grüße,
Hendrik

von Hendrik K. (hendrik2021)


Lesenswert?

da hast du wohl Recht! :D

von Wastl (hartundweichware)


Angehängte Dateien:

Lesenswert?

Hendrik K. schrieb:
> Mein PHY und MAC sollen (müssen) doch synchron laufen, d.h. beide
> brauchen doch auch die gleiche Quelle für die Referenzclock, oder nicht
> (also meine 50Mhz)?

Steht alles im Datenblatt.

von Wastl (hartundweichware)


Lesenswert?

Hendrik K. schrieb:
> okay, der PHY befindet sich im RMII Modus - logisch.
> PIN PA1 ist als ETH_RMII_REF_CLK gelabeld als "Alternate Function".
> Alternate Function 11 bedeutet ja, dass der GPIO als ETH_RMII_REF_CLk
> genutzt wird, oder muss ich hier noch etwas in den Registern ändern?
>
> Der PIN ist also ein Input, oder?

Steht in der Source die ich gepostet habe.

Hendrik K. schrieb:
> Wie konfiguriere ich das in der Clock Config?

Der RefClock ist Input ("alternate") und geht direkt zu MAC.
Da braucht man nichts weiter konfigurieren.

Der Controller selbst läuft mit dem Takt was du in CubeMx
konfiguriert hast.

Machst du jetzt CubeMx oder gehst du zu Fuss? Hardcore
bare-metal low-level Computing? ääähhh Programming ....

: Bearbeitet durch User
von Wastl (hartundweichware)


Lesenswert?

Wastl schrieb:
> Der RefClock ist Input ("alternate") und geht direkt zu MAC.
> Da braucht man nichts weiter konfigurieren.

Das ist allerdings etwas verwirrend, offensichtlich überstimmt
"alternate" die anderen GPIO-Attribute (Input). Jedenfalls
funktioniert das so, ich habe das am F407 explizit schon gemacht.

von Hendrik K. (hendrik2021)


Lesenswert?

ja, ich weiß. Aber genau daher ja meine Frage. Die 50 Mhz bekommt der 
PHY und der STM32, die 50Mhz liegen am MAC/STM32 nur am PA1 Pin an, 
oder?

Auf dem Datenblatt sieht es ja so aus, als würden die 50Mhz einmal durch 
ETH_RMII_REF_CLK kommen, aber auch durch einen anderen "PIN" um den HCLK 
mit einem PLL zu "gestalten".

Wie konfiguriere ich das nun in der Clock Config die 50MHz, ich muss das 
ja irgendwie definieren, oder wird direkt davon ausgangen das am PA1 Pin 
im RMII Mode die 50MHz anliegen und ich muss nicht mehr machen?

Der STM würde doch immernoch mit den Frequenzen laufen, die ich im 
CubeMX konfiguiert habe. Beim STM32F407VG Disco Board also 8MHz HSE oder 
32.768KHz LSE.

Ich möchte hier aber doch meine 50Mhz anliegen haben. Der STM32 soll 
diese ja auch als Takt "benutzen".

Also quasi statt dem HSE mit 8MHz meine 50MHz, oder nicht?

Sorry für so etwaige "dumme" Fragen. :)

von Wastl (hartundweichware)


Lesenswert?

Hendrik K. schrieb:
> Wie konfiguriere ich das nun in der Clock Config die 50MHz, ich muss das
> ja irgendwie definieren, oder wird direkt davon ausgangen das am PA1 Pin
> im RMII Mode die 50MHz anliegen und ich muss nicht mehr machen?

Liest du meine Beiträge, oder ist dir das egal?

Wastl schrieb:
> Der RefClock ist Input ("alternate") und geht direkt zu MAC.
> Da braucht man nichts weiter konfigurieren.

von Wastl (hartundweichware)


Lesenswert?

Hendrik K. schrieb:
> Der STM würde doch immernoch mit den Frequenzen laufen, die ich im
> CubeMX konfiguiert habe. Beim STM32F407VG Disco Board also 8MHz HSE oder
> 32.768KHz LSE.

Ja.

Hendrik K. schrieb:
> Ich möchte hier aber doch meine 50Mhz anliegen haben. Der STM32 soll
> diese ja auch als Takt "benutzen".

Das geht nicht, und wozu soll das gut sein?

Hendrik K. schrieb:
> Also quasi statt dem HSE mit 8MHz meine 50MHz, oder nicht?

Nein. Liest du meine Beiträge, oder ist dir das egal?

Wastl schrieb:
> Der Controller selbst läuft mit dem Takt was du in CubeMx
> konfiguriert hast.

Dazu dient die Clock-Konfiguration von CubeMX. Die 8 MHz sind
nur die Ausgangsbasis für die PLLs um auf die hohen Frequenzen
(üblicherweise 168 MHz) zu kommen.

von Wastl (hartundweichware)


Lesenswert?

Vielleicht wäre es auch angebracht auf meine Gegenfragen
mal zu antworten. Vielleicht erklärst du dabei auch was
genau du nicht verstehst.

Wastl schrieb:
> Liest du meine Beiträge, oder ist dir das egal?

Wastl schrieb:
> und wozu soll das gut sein?

Wastl schrieb:
> Nein. Liest du meine Beiträge, oder ist dir das egal?

von Frank K. (fchk)


Lesenswert?

Hendrik K. schrieb:

> okay, der PHY befindet sich im RMII Modus - logisch.
> PIN PA1 ist als ETH_RMII_REF_CLK gelabeld als "Alternate Function".
> Alternate Function 11 bedeutet ja, dass der GPIO als ETH_RMII_REF_CLk
> genutzt wird, oder muss ich hier noch etwas in den Registern ändern?

nein, das reicht.

> Der PIN ist also ein Input, oder?
ja, und das unabhängig von der GPIO Config.

> Mein PHY und MAC sollen (müssen) doch synchron laufen, d.h. beide
> brauchen doch auch die gleiche Quelle für die Referenzclock, oder nicht
> (also meine 50Mhz)?
>
> Wie konfiguriere ich das in der Clock Config?

gar nicht, das ist fest verdrahtet. Bei RMII braucht der MAC immer einen 
Takt an ETH_RMII_REF_CLK, und das sind auch immer 50 MHz.

fchk

von Hendrik K. (hendrik2021)


Lesenswert?

Ich lese alle Beiträge. Hab es nur anders verstanden.

Also muss ich am Ende in der Clock Configuartion garnichts mehr 
zusätzlich konfiguriueren, wenn ETH im RMII Mode aktiviert ist, oder?

PTP muss nicht den 50Mhz entsprechen, oder? Sollte rechnerisch auch 
garnicht gehen mit meinen Clocks die ich habe (glaube ich).

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.