Forum: Mikrocontroller und Digitale Elektronik STM32F2: USART empfängt nur ein Byte


von Th.Wüst (Gast)


Lesenswert?

Hallo!

Ich versuche gerade den USART des STM32F207 in betrieb zu nehmen.
Senden klappt ohne Probleme, das Empfangen jedoch nicht.

Es wird immer nur das erste Byte eines Datenstroms empfangen und meinem 
TX-Puffer hinzugefügt.

Eine Idee, woran das liegen kann?

Vielen Dank!

Grüße
Thomas

von Kindergärtner (Gast)


Lesenswert?

Zeile 42 natürlich.

von Moritz M. (Gast)


Lesenswert?

Idee: An deinem Code! :)

Bitte Poste doch mal dein Projekt. Die Glaskugel wurde leider noch nicht 
erfunden.

mfg.
Moritz.

von Th.Wüst (Gast)


Lesenswert?

Kindergärtner schrieb:
> Zeile 42 natürlich.

Die lasse ich bewusst immer blank. :-P

Moritz M. schrieb:
> Idee: An deinem Code! :)

Gute Idee!

Moritz M. schrieb:
> Die Glaskugel wurde leider noch nicht erfunden.

Eine Glaskugel schon, aber keine die funktioniert! ;)

Moritz M. schrieb:
> Bitte Poste doch mal dein Projekt.

Projekt ist zuviel, aber die wichtigsten Zeilen.
Aus der Init:
1
...
2
  /* Enable the USARTx Interrupt */
3
  NVIC_InitStructure.NVIC_IRQChannel                    = HAL_USART6_IRQ;
4
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority  = 0;
5
  NVIC_InitStructure.NVIC_IRQChannelSubPriority         = 7;
6
  NVIC_InitStructure.NVIC_IRQChannelCmd                 = ENABLE;
7
  NVIC_Init(&NVIC_InitStructure);
8
...
9
  USART_6->CR1 |= USART_CR1_RXNEIE;
10
...
ISR:
1
void USART6_IRQHandler(void)
2
{
3
  unsigned char rxdata;
4
  uint32_t tmp_USART6_SR;
5
  uint32_t tmp_USART6_DR;
6
7
  tmp_USART6_SR = HAL_USART6_SR_REG;
8
  tmp_USART6_DR = HAL_USART6_DR_REG;
9
  Buffer_AddByte(pRXBuffer_USART6, tmp_USART6_DR);
10
  rxdata = true;
11
12
  return;
13
}
14
...

von Th.Wüst (Gast)


Lesenswert?

Und ja, die Funktion
1
Buffer_AddByte(pRXBuffer_USART6, tmp_USART6_DR);
 funktioniert! Das ist 100% sicher.

von Kindergärtner (Gast)


Lesenswert?

Th.Wüst schrieb:
> void USART6_IRQHandler(void)
> {
>   unsigned char rxdata;
Diese Zeile ist unnötig.

>   uint32_t tmp_USART6_SR;
>   uint32_t tmp_USART6_DR;
>   tmp_USART6_SR = HAL_USART6_SR_REG;
>   tmp_USART6_DR = HAL_USART6_DR_REG;
Diese Register finden sich nicht in der Doku des STM32F207. Was auch 
immer das bewirken soll.
>   Buffer_AddByte(pRXBuffer_USART6, tmp_USART6_DR);
>   rxdata = true;
Diese Zeile ist auch unnötig.
>   return;
Und die auch.
> }
Außerdem schön wie du den UART zwar einschaltes, aber nicht 
konfigurierst.

von Th.Wüst (Gast)


Lesenswert?

Kindergärtner schrieb:
> Diese Register finden sich nicht in der Doku des STM32F207. Was auch
> immer das bewirken soll.

USART6->SR & USART6->DR

Die Konfiguration habe ich weg gelassen, da das Senden korrekt 
funktioniert.
Somit sind Baudrate, Parity & Co richtig gesetzt worden. TE und RE sind 
aktiv.

von Kindergärtner (Gast)


Lesenswert?

Th.Wüst schrieb:
> USART6->SR & USART6->DR
Und wie sieht der C-Code dafür aus?
> Die Konfiguration habe ich weg gelassen, da das Senden korrekt
> funktioniert.
Und das impliziert dass das Empfangen auch korrekt funktioniert?
> Somit sind Baudrate, Parity & Co richtig gesetzt worden. TE und RE sind
> aktiv.
Na dann klappt ja alles.

Naja, ohne Code (in mehr als homöopathischen Dosen) und 
Oszilloskopbilder des Transfers kann dir keiner helfen.

von Th.Wüst (Gast)


Lesenswert?

Das Lesen vom SR-Register ist schuld!
Dazwischen war noch Code zum Auswerten der gesetzten Flags, den ich aber 
schon auskommentiert hatte.
Habe ich in der ISR nur
1
...  tmp_USART6_DR = HAL_USART6_DR_REG;
2
  Buffer_AddByte(pRXBuffer_USART6, tmp_USART6_DR);
 stehen, funktioniert das erfolgreiche Empfangen des kompletten 
Antwortpakets!

Nur warum ist das so? Was hat das mit dem SR-Register zu tun?
Und wie kann ich mit der Funktion USART6_IRQHandler die RX-Fehler (PE, 
FE, NE, ORE) auswerten, wenn das lesen vom RX-Register dazu führt, dass 
da Empfangen überhaupt nicht geht!?

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.