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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.