[ mikikg @ 02.09.2017. 19:56 ] @
Pozdrav,

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]
[ scoolptor @ 02.09.2017. 20:20 ] @
Ne koristim STM-ove, a trebao bih. Trenutno ne koristim nista jer sam zauzet drugim stvarima.
Ali sam pogledao sta kaze ST.
DMA transmit complete interrupt u kombinaciji sa tim USART interaptom je najbrze resenje.
[ yugaja @ 02.09.2017. 20:27 ] @
Samo cu kratko ovaj put posto kucam s mob-a. Ja sam uvek isao na varijantu 2 tj koristio interrupte.
Slican problem sam npr imao kod upravljanja dds-a ad9951: slao sam 5 bajtova u burstu svakih 1/384khz i jos sam morao da kontrolisem cs liniju na prvi pogled sve je asinhrono ali... Koristio sam dma i tajmere- cs mi je bio u stvari pwm 384khz odredjene sirine tj dc....moze se to lepo sloziti na stm32...
Znaci interrupt a ako ima vise bajtova za slanje, probati sa dma streamom cisto da se ne trosi vreme na skakanje u interrupt vise nego sto treba
[ bogdan.kecman @ 02.09.2017. 20:29 ] @
V3 radi odlicno sa kondenzatorom, imas kond na de, diodu sa tx na de,
bleeder otpornik preko konda, otpornik i kond definises prema brzini
tx-a tako da mu treba da sidje sa high stanja 1bajt vremena.

V2 je ono sto ja koristim (ne uvek interapt, nekad provera samo flega),
znaci citas CT ili koji je vec flag za "send buffer empty" (pazi imas
razlicite za "imas slobodno mesto u baferu" i "bafer je prazan", treba
ti ovo drugo, negde se zove CT, negde TXE negde CTE .. zavisi od mcu do
mcu.. USART_FLAG_TXE je npr na bluepill )

v4 nisam probao, ne bi trebalo da je problem

[Ovu poruku je menjao bogdan.kecman dana 02.09.2017. u 21:44 GMT+1]
[ mikikg @ 02.09.2017. 23:42 ] @
Razmisljam i jos jednoj varijanti, slucajno mi slobodni pinovi od JATG koji ovde ne koristim T1C4 (Timer 1 Compare 4) i T1ETR (Timer 1 External Triger), sta mislite sta smeram? :)

Vezem triger tajmera T1ETR direktno sa UART-TX linijom : ), tajmer se na svaku ivicu resetuje, njegov compare izbacim na T1C4 i to mi je ustvari signal za DE liniju!
Ovo je ekvivalent spoljneg tajmer sa R/C kolom iz gore spomenute varijante 3.
Kod slanja prvo ocistim taj tajmer, tada se upali DE, odmah zatim krece transmisija koja ce fizicki da stalno resetuje Timer 1 i kad nema vise transmisije i tajmer odbrojio svoje gasi DE.

Izgleda kao trosenje resursa, ali meni nije vec nasuprot, ne koristim ni te nozice niti taj tajmer a za ovo je idealno + sam fleksibilan sa arbitracijom tog tajmera :)

Ovo mi lici kao mnogo robusnije resenje (potrosio jedan dodatni tajmer i jedan pin) jer ne moram da brinem da li sam zaboravio da iskljucim DE ili neki drugi problem koji ce da mi zakuca ceo bus sa XY uredjaja, tajmer ne moze da omasi, to radi na HW nivou.


[Ovu poruku je menjao mikikg dana 03.09.2017. u 01:00 GMT+1]
[ bogdan.kecman @ 02.09.2017. 23:52 ] @
pa da ali sta ti fali da pocistis po onom pdf-u kad zavrsis sa dma tamo
dizes/spustas de?
[ mikikg @ 03.09.2017. 00:56 ] @
Pa opet moram da hendlujem interapte, procitao sam, i moram da imam timeout za svaki slucaj sto opet povlaci da imam neki tajmer, tako da ovo reseno skroz na HW nivou koji jednom konfigurisem i ne pipram niti hendlujem nesto, radi samo, to mi je mnogo bolje resenje jer sam sinhronizaciju uradio na HW nivou a ne na hendlovanom SW nivou : )

Moglo bi preko DMA od seriske da se resetuje taj Timer i da se ustedi jedna nozica ali da ide preko tajmera.

Dakle to je po specifikaciji, timeout 1 byte koji mora da se ispostuje u svakom slucaju sto je idealna situacija za HW tajmer, ima jos 3-4 slobodna HW tajmera, sto zao mi da potrosim? :)
Ovo prati fizicko stanje ako se veze spolja pin sto je mnogo bitnija informacija nego interno u programu.
Mogu samo dodatno nesto da izmislim da skratim vreme manjeg od jednog byte koji ce opet uticati na timer nekako ali mislim da to nije vredno tog ulozenog rada i komplikacije glavnog programa, ako mi bude "zafalilo" to vreme jednog bajta smislicu vec nesto, dotle samo ja da poteram tajmer i to je to ...





[Ovu poruku je menjao mikikg dana 03.09.2017. u 03:06 GMT+1]
[ mikikg @ 04.09.2017. 06:34 ] @
Ahhhh, kakav bedak, STM32F1 kontroler NEMA retriggerable One Pulse Mode : (((
Nema to ni F4, tek F7 serija kontrolera to ima ... F7 ima i "fast trigger" koji reaguje odmah na spoljni dogadjaj ...
Jbg, pada u vodu cela ova moja ideja za DE kontrolu samo zbog manjka te opcije : ( ...
Inace radi OPM lepo, radi i N-pulseva, "samo" sto ne moze da se retrigeruje a to je od vitalne vaznosti za ovo sto sam hteo da odradim.

Vidim ja da cu da predjem na MAX13487! Pin kompatibilan sa MAX485 osim onih DE ulaza ...
To cu da probam pod obavezno, ne vraca mi se na interapte nikako! :)
[ mikikg @ 05.09.2017. 12:09 ] @
Stvarno kakav bedak, jedna f**ing opcija fali, i to su kod F1 "rezervisali" taj bit (mozda je i namerno maskiran/zabranjen), probao na "kvarno" ipak da upisem "1000" ali ne prolazi :)
Cak i u dokumentaciji za F7 postoji greska, trebali su da napisu "Bits 3:0" ...
Nesto su tu "muckali" oko toga i iz komercialnih razloga verovatno to dodali/oduzeli.
Tako napredan tajmer sa preko 100 nekih bitova/registra za podesavanje da ne moze da radi tako jednu operaciju koju NE555 radi je malo debilno, ali sta da se radi, tako je ...

[ bogdan.kecman @ 05.09.2017. 12:22 ] @
vidim ja da ce padne RC resenje :D
[ mikikg @ 05.09.2017. 12:52 ] @
Ma jok, uzecu MAX13487 i to da resim jednom zauvek ;)
Taj MAX ima ovaj sporan tajmer u sebi ... :)
[ mikikg @ 10.09.2017. 14:57 ] @
Dok mi ne stigne spomenuti MAX, postavio sam TXEN za transiver da se gasi preko TC (Transmission Complete) flaga.

Usput mi iskocila jedna stvar samo koju hocu da proverim sa vama, naime kada se digne TXEN visoko i upali transmisija, tada na RX liniji dobijam ivicu sa High -> Low sto je u sustini Start dogadjaj za prijem jednog Byte i posledicno se dogodi da mi se aktivira RXNE interupt koga hendlujem preko globalnog ISR za USART.
Posto to nije bas "pravi" karakter koji se prima, posledicno se aktivira u status registru i FE (Framing Error) flag.

Moje pitanje je da li mogu slobodno da se baziram logici tog FE i odbacim takav primljen karakter?
Nisam vidjao po primerima da se bave tim flagom, mozda zato sto sam gledao primere za klasicne full-duplex seriske komunikacije, ne kao ovaj slucaj sa half-duplex RS-485 gde se to desava.