STM32F2: USART empfängt nur ein Byte

Gast #3290350
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
Gast #3290405
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
...
Gast #3290443
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.
Gast #3290482
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.
Gast #3290529
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!?

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