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
Als Liebhaber schlanker, smarter Hardware-Lösungen: RC-Tiefpass und nachgeschalteter Schmitt-Trigger! Grüße Sascha
- 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
@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.
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.
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."
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.