Forum: Mikrocontroller und Digitale Elektronik RS485 mit STM32 / Cortex M3


von Robert B. (robertb)


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

von (prx) A. K. (prx)


Lesenswert?

Robert B. schrieb:

> Jemand eine Idee?

Ausreichend lange warten.

von ich (Gast)


Lesenswert?

TC-Interrupt startet timer

von Arno Nyhm (Gast)


Lesenswert?

Als Liebhaber schlanker, smarter Hardware-Lösungen: RC-Tiefpass und 
nachgeschalteter Schmitt-Trigger!

Grüße
Sascha

von Clipboard (Gast)


Lesenswert?

1 Byte mehr senden

von Clipboard (Gast)


Lesenswert?

- letztes Byte senden
- auf USART_IT_TXE Interrupt zu diesem Byte warten
- disable USART_IT_TXE Interrupt
- enable USART_IT_TC Interrupt
- auf USART_IT_TC Interrupt warten
- GPIO inactiv setzen

von (prx) A. K. (prx)


Lesenswert?

@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.

von Matthias K. (matthiask)


Lesenswert?

Bei STM gibt es ein App dazu:
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00249778.pdf

Als Quellcode finde ich dort nicht mehr, hätte es aber bei Bedarf noch 
auf der HD.

von (prx) A. K. (prx)


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."

von Arno Nyhm (Gast)


Lesenswert?

errata?

von (prx) A. K. (prx)


Lesenswert?

Arno Nyhm schrieb:

> errata?

Nichts.

von Clipboard (Gast)


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.

von (prx) A. K. (prx)


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.

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.