Kysymys:
RX vs TX -toiminto Software UART -ohjelmassa
alt-rose
2019-10-14 14:17:39 UTC
view on stackexchange narkive permalink

Minulla on vähän UART: ta MCU: sta.Tarvitsin 4, mutta toistaiseksi olen löytänyt sopivan MCU: n, jossa on 3 UART: ta, STM32F103.Joten neljäs, joka minun on pantava täytäntöön SW: ssä.

Jokainen yksittäinen UART-tietokoneeni tekee joko vain RX- tai TX-toimintoja.Joten nyt minulla on mahdollisuus ottaa SW UART käyttöön VAIN RX- tai VAIN TX-toiminnassa.

Mikä näistä kahdesta tulisi toteuttaa SW: ssä, UART, joka suorittaa vain RX-toimintaa, tai UART, joka tekee vain TX-toimintoa?

Miksi vain ei käytettäisi uudelleen hw uartin TX- tai RX-puolta, jota ei käytetä muissa porteissa?
Wowowooo tuo ihana asia.Hyvä, peukkua.Jos pystyt vastaamaan siihen, se olisi vielä parempi.
Se toimii, jos TX- ja RX-kanavien nopeudet ovat samat, ja se on jo osa @MichelKeijers-vastausta.
On olemassa monia STM32-malleja, joissa on 4 (tai enemmän) USART-laitetta (USART-laitteessa on lisäksi valinnainen kellotappi; jos se on pois käytöstä, se vastaa UART-mallia).Esimerkiksi STM32F072RB: llä on 4 USART-korttia.
Kolme vastused:
Michel Keijzers
2019-10-14 14:25:08 UTC
view on stackexchange narkive permalink

En ole elektroniikkainsinööri, mutta haluaisin käyttää TX-toimintoa UART-ohjelmistona.

RX-toimintoa varten tarvitaan puskurointi ja keskeytyksiä tarvitaan, jotta tiedot eivät menetä.Tämän hoitaa yleensä laitteiston UART.

Lähetystoimintaa varten sinun on lähetettävä vain tietoja, jotka tapahtuvat silloin, kun haluat (vastaanottamista varten et tiedä etukäteen, milloin tietoja vastaanotetaan). Katso hooskworksin kommentti (oikea termi on, jos puhelu onnistuuUART-ohjelmisto on helppo estää).

Jos UART-nopeudet ovat samat, voit käyttää yhtä UART: ta sekä RX: lle että TX: lle.Vaikka nopeudet eivät olisikaan samat ja tiedät, ettet saa mitään lähettämisen aikana, voit todennäköisesti vaihtaa nopeutta.

Se olisi myös minun analyysini ongelmasta, joten mielestäni TX: n kysyntä, varsinkin jos pystyt lähettämään estolla tarvittaessa, on helpompaa ohjelmistojen kannalta.
Onneksi RX- ja TX UART -laitteiden nopeudet ovat samat.Joten on hyvä käyttää käyttämätöntä TX-nastaa 4. UART-porttini.
Kyllä, voit jopa jatkaa jaetun UART: n vastaanottamista lähettämisen aikana.
Andy aka
2019-10-14 14:28:14 UTC
view on stackexchange narkive permalink

UART-lähetyksen toteuttaminen ohjelmistossa on huomattavasti yksinkertaisempaa, koska vain lyö bittiä lähtöporttiin, kunnes tavut lähetetään. Vastaanottimen käyttöönottamiseksi sinun on tehtävä useita tarkistuksia biteille niiden saapuessa (kuten odottamalla aloitusbittiä) ja pariteettitarkistus. Tavallisesti joudut suorittamaan paljon nopeammalla käsittelynopeudella, jotta voit selviytyä kellonopeudesta vaihtelut etäsiirtolähteen ja paikallisen vastaanottimen välillä.

Tämän jälkimmäisen osan tarkoituksena on välttää tietojen väärinkäsitys; tyypillinen vastaanottojärjestelmä ajaa kellonsa noin 16 kertaa tunnetulla tiedonsiirtonopeudella ja ottaa näytteen datavirran keskisymbolista maksimaalisen datan eheyden varmistamiseksi. Lähetys- ja vastaanottokellojen on oltava kohtuullisen samanlaisia, jos datasiirtoja on vähän. Tietosiirtymät auttavat synkronoimaan keskisymbolilaskurin. Alla on esimerkkejä RX-TX-kellotaajuuksien hyvästä samankaltaisuudesta, jota seuraa skenaario, jossa vastaanottokello käy aivan liian hitaasti: -

enter image description here

Jälkimmäisessä esimerkissä sinun pitäisi pystyä näkemään, että symbolinäyte on ajautunut pisteeseen, jossa näytteistetään 4. bitti kolmannen bitin sijaan. Tietysti, jos bittisiirtymiä on paljon, vastaanottokello voidaan synkronoida uudelleen lennossa ja tämä ongelma vähenee, mutta UART-lähetyksen avulla et voi välttää kaikkien bittien (paitsi alusta) olevan korkeita tai, mikä pahinta silti kaikki bitit ovat alhaiset.

jhnlmn
2019-11-09 07:05:20 UTC
view on stackexchange narkive permalink

Kokemukseni mukaan UART RX: n tai TX: n toteuttamisen välillä ei ole juurikaan eroa. UART on vaikeimmin toteutettava protokolla bittihakemisen kautta, koska se on erittäin aikaherkkä. SPI ja I2C sallivat kellon venyttämisen, mutta UART: ssa jokainen bitti on lähetettävä tai luettava tarkkaan aikaan korruption välttämiseksi. Keskeytykset, putkilinjojen pysähtyminen ja välimuistihäiriöt saattavat vääristää ajoitustasi ja aiheuttaa korruptiota.

Luotettavin tapa toteuttaa UART bittihakemisen avulla on poistaa keskeytykset käytöstä ja istua tiukassa silmukassa. TX: lle silmukka kysyy joitain tarkkoja ajastimia, kuten DWT_CYCCNT, ja vaihtaa sitten GPIOa vaadittavina aikoina. RX: lle silmukka tekee saman, paitsi että se lukee GPIO: n vaadittavina aikoina. TX: llä on tässä tapauksessa yksi etu: se voi ottaa keskeytykset uudelleen käyttöön tavujen välillä, mutta RX: n on pysyttävä lukusilmukassa ikuisesti. Mutta keskeytettyjen pitäminen vammaisina niin kauan on erittäin huono idea. Järjestelmäsi ei voi tehdä muuta kuin lukea / kirjoittaa UART: ia.

Voit yrittää suorittaa RX / TX-silmukan keskeytysten ollessa käytössä, ja silloin tällöin tapahtuu keskeytys, mikä johtaa vioittuneeseen tavuun. Lähetettäessä saatat havaita niin huonoja tapauksia (mittaamalla aikaa, joka kului koko tavun lähettämiseen). Jos kyseinen aika ylittää odotetun ajan, tiedät, että keskeytit ja voit sitten lähettää koko paketin uudelleen. Suunnittele protokolla vioittumisen havaitsemiseksi.

Verkossa näen esimerkkejä, jotka toteuttavat UART: n keskeytysten kautta. TX: ssä he käyttävät ajastimen keskeytystä ja kirjoittavat bittiä ISR: stä. RX: lle ne mahdollistavat reunan tunnistuksen keskeytyksen ja tallentavat ajan ISR: ään. Mutta tämä lähestymistapa voi epäonnistua niin monella tavalla: muut keskeytykset tapahtuvat, koodin suorittaminen keskeytettyjen ollessa poissa käytöstä jne.

Mutta kaikkea yllä olevaa ei tarvita, koska käytät STM32: tä. STM32: ssä voit käyttää ajastimia yhdessä DMA: n kanssa UART: n simuloimiseksi. Esimerkiksi: "Emuloidun UART: n käyttöönotto STM32F4-mikrokontrollereissa" https://www.st.com/content/ccc/resource/technical/document/application_note/1d/61/52/64/ea/ee/42/4e/DM00110292.pdf/files/DM00110292.pdf/jcr:content/translations/en.DM00110292.pdf Täällä he käyttävät ajastinta ajamaan DMA: ta lähettämään / vastaanottamaan bittiä tarkkoina ajankohtina.

On toinenkin tapa: määritä ajastintallennus / vertaa kanavia ja liitä DMA. RX: ajastin tallentaa tarkat ajanhetket, kun tulosignaali vaihdettiin, ja DMA tallentaa nämä aika-arvot puskuriin. TX: DMA lukee aika-arvot puskurista ja ajastin vaihtaa lähtöä näinä hetkinä. Henkilökohtaisesti en kokeillut tätä viimeisintä lähestymistapaa, mutta tein jotain vastaavaa, joten myös tämän pitäisi toimia.



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 4.0-lisenssistä, jolla sitä jaetaan.
Loading...