RS485 mit STM32 / Cortex M3

OP #2262660
Lesenswert?
• ▲
▼
Hi!

Ich wollte gestern auf die schnelle einem STM32F107 RS485 beibringen. 
UART entsprechend konfiguriert und den RE/WE-Pin des RS485-Treibers über 
einen zusätzlichen GPIO kitzeln.

Den GPIO vor dem Schreiben des UART2->DR auf HIGH (Treiber Aktiv) zu 
setzen ist ja kein Problem. Ihn auf LOW (Treiber inaktiv) zu setzen 
wollte ich mit dem TC-Interrupt TCIE (Transmit complete) machen. Leider 
scheint der interrupt bereits auszulösen wenn das letzte Bit aus dem 
Fifo raus ist und noch geschoben wird. Sprich während des letzten Bytes 
geht der GPIO wieder auf LOW und der treiber ist nicht mehr aktiv.

Jemand eine Idee?

Grüße
Robert
#2262951
Lesenswert?
• ▲
▼
Robert B. schrieb:

> Leider
> scheint der interrupt bereits auszulösen wenn das letzte Bit aus dem
> Fifo raus ist und noch geschoben wird. Sprich während des letzten Bytes
> geht der GPIO wieder auf LOW und der treiber ist nicht mehr aktiv.

Vermutung oder gemessen?

Doku sagt in Text und Bild, dass TC erst nach dem Stopbit ausgelöst 
wird: "If a frame is transmitted (after the stop bit) and the TXE bit is 
set, the TC bit goes high. An interrupt is generated if the TCIE bit is 
set in the USART_CR1 register."
Gast #2262973
Lesenswert?
• ▲
▼
A. K. schrieb:
> @Clipboard: Ist das wirklich in dieser Form nötig, evtl. aufgrund eines
> Fehlers? Denn laut Doku kommt das TC ohnehin erst, wenn TXE gesetzt ist
> und das Shiftregister leer läuft. Dieser Ablauf mit erst TXE dann TC
> erscheint also überflüssig.

@A.K.

Im Normalfall sendet man ja ganze RS485 Frames, deshalb ist nur
der letzte TC Interrupt interessant, wobei  die anderen TXE
Interrupts schon interessant sind um die Bytes aus einem evt. 
vorhandenen
SW-Fifo abzuholen.
#2262980
Lesenswert?
• ▲
▼
Clipboard schrieb:

> Im Normalfall sendet man ja ganze RS485 Frames, deshalb ist nur
> der letzte TC Interrupt interessant, wobei  die anderen TXE
> Interrupts schon interessant sind um die Bytes aus einem evt.
> vorhandenen SW-Fifo abzuholen.

Yep, so passt es. Vor dem Ende des Frames kommt ein TC nur dann, wenn 
man zwischendurch nicht fix genug Bytes nachgeschoben hat. In der oben 
verlinkten Appnote steht der Ablauf auch sauber drin: In dem Interrupt, 
in dem man das letzte Byte reinschreibt, löscht man TXE-Int und setzt 
TC-int.

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.