Code-Strukturen in stm32f4xx_hal_eth

OP #5509160
Lesenswert?

Hallo zusammen,

ich habe mich gefragt warum in der HAL-Bibliothek für den STM32F4 
beispielsweise folgende Funktion genau so geschrieben ist wie sie es 
ist:
1
static void ETH_MACTransmissionEnable(ETH_HandleTypeDef *heth)
2
{ 
3
  __IO uint32_t tmpreg1 = 0U;
4
  
5
  /* Enable the MAC transmission */
6
  (heth->Instance)->MACCR |= ETH_MACCR_TE;
7
  
8
  /* Wait until the write operation will be taken into account:
9
     at least four TX_CLK/RX_CLK clock cycles */
10
  tmpreg1 = (heth->Instance)->MACCR;
11
  ETH_Delay(ETH_REG_WRITE_DELAY);
12
  (heth->Instance)->MACCR = tmpreg1;
13
}

Ganz genau geht es mir um folgendes:
In der Zeile
1
(heth->Instance)->MACCR |= ETH_MACCR_TE
 wir das Register MACCR bearbeitet und direkt beschrieben. Anschließend 
wird mit
1
tmpreg1 = (heth->Instance)->MACCR
 der geschriebene Wert ausgelesen, nur um ihn nach einer kurzen 
Wartezeit mit
1
(heth->Instance)->MACCR = tmpreg1
 erneut in das Register zu schreiben.

Ich habe keine Ahnung warum das so geschrieben ist wie es ist und was 
das genau soll. Hat jemand von euch eine plausible Erklärung dafür?

Viele Grüße
Michael
#5509226
Lesenswert?

Das ist ein Workaround fuer ein Erratum des Ethernet-Peripherals:

2.10.5
Successive write operations to the same register might not be fully 
taken into account

Falls mehrere Schreiboperationen direkt hintereinander in bestimmte 
Ethernet-Register erfolgen, uebernimmt das Ethernet-Peripheral die neuen 
Werte nicht, obwohl beim Auslesen des Registers der richtige Wert 
ausgelesen wird.

Daher: Schreiben (beliebig oft), letzten Wert auslesen, 4 
Ethernet-Clocks warten, gelesenen Wert nochmal schreiben.

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