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

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