imam par pitanja oko RS485 mreze.
Trazim najefekasniji nacin da neki slave uredjaj prozove preko mreze i da on odgovori, u pitanju je half-duplex komunikacija.
Ta procedura odgovora (kada slave radi transmit) povlaci logiku za upravljanje DE (Driver Enable) signalom, digne se visoko i transceiver IC onda salje ali zbog efektivnog zauzeca linije taj signal treba da se spusti cim su svi podaci iz paketa informacija poslati.
Medjutim, tu nastaju razni problemi koji su vezani za USART u STM32 koji je kao i kod vecine MCU poseban modul koji najcesce imaju buffere za podatke i dolazi do problema sinhronizacije DE signala sa krajem prenosa.
Dakle tipican scenario slanja poruka preko RS485 bi trebao da izgleda ovako:
1) podigni DE na HIGH
2) posalji poruku (promenljive duzine)
3) spusti DE na LOW
Konkretan problem je u tome sto se stavke 1,2 i 3 prakitcno dogode "odmah", upali se DE, program posalje poruku tj samo je smesti u TX buffer od USART i odmah nastavi izvrsavanje dalje programa, ne ceka se fizicki da se ti podaci posalju (to je asinhron dogadjaj za program) i onda se izvrsi stavka 3.
Rezultat je da je DE bio aktivan jedan vrlo kratak period koji ne pokriva celu poruku koja se salje.
Postavlja se pitanje kako onda efektivno kontrolisati DE signal?
1. varijanta
Moguce je upotrebiti razne tajmere pa da se prebrojava duzina poruke i onda da se nadamo da ce DE uvek ispravno da se ukalkulise/dogodi.
2. varijanta
Druga varijanta je pratiti interapt koji se trigeruje kada je TX buffer prazan ali i to ima svoje mane i komplikacije.
3. varijanta
Postoji i glupa varijanta koju su recimo koristili u jeftinim kinesmim USB-RS485 interfejsima tako su su DE signal drajvovali istim signalom koji ulazi u TX, tj na svaku logicku jedinicu od podatka se i pali DE pa onda dobijamo situaciju da se prakticno samo logicke jedinice prenose preko mreze a logicke nule se ne prenose tj tada je bus slobodan.
U sustini to moze da prodje ali to nije po RS485 standardu, za logicke jedinice ce postojati fin diferencialni signal na liniji ali ne i za logicke nule (na bus tada treba biti invertovan diferencialni signal).
4. varijanta
Posto svi STM32 imaju bar jedan USART koji imaju i dodatne HW linije za Flow Control, da li je moguce onda iskoristiti CTS (Clear To Send) signal koji bi pokretao DE?
Tehnicki to bi bila idealna varijanta za ovaj slucaj, HW u kontroleru totalno onda upravlja nezavisno sa tom DE linijom i ne treba u programu nista oko toga raditi.
---
Probao 4. varijantu tako sto sam nakon standardne inicializacije USART-a za 8N1/no-parity ukljucio i "samo" CTSE (CTS flow control enable), RTSE nisam ukljucio, ostao je po default iskljucen.
Medjutim cim dodam ovu liniju za konfiguraciju a nisam jos ni prikljucio fizicki CTS na DE (trenutno je kontrola sa varijantom 1.) pocne program da mi brljavi, nesto salje/prima sam od sebe??
USART1->regs->CR3 |= USART_CRT3_RTSE_BIT
Da li neko zna nesto vise o ovome?
[Ovu poruku je menjao mikikg dana 02.09.2017. u 21:15 GMT+1]
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator