Gedetailleerde inleiding tot seriële communicatie (UART) - IOTROUTER
Zweefanimatie

Gedetailleerde inleiding tot seriële communicatie (UART)

Universal Asynchronous Receiver/Transmitter, vaak UART genoemd, is een asynchrone ontvanger/zender.

Laten we eerst de volgende synchrone en asynchrone communicatie introduceren. Synchroon betekent dat nadat de zender de gegevens heeft verzonden, hij wacht tot de ontvanger een antwoord terugstuurt voordat hij het volgende gegevenspakket verzendt; asynchroon betekent dat nadat de zender de gegevens heeft verzonden, hij wacht tot de ontvanger de gegevens heeft verzonden. De partij stuurt een antwoord terug en stuurt vervolgens de communicatiemethode van het volgende gegevenspakket. Met andere woorden, synchrone communicatie is een blokkeringsmethode en asynchrone communicatie is een niet-blokkeringsmethode. Onder de gangbare communicatiebusprotocollen behoren I2C en SPI tot synchrone communicatie terwijl UART tot asynchrone communicatie behoort. Bij synchrone communicatie moeten de twee partijen eerst synchronisatie tot stand brengen, dat wil zeggen dat de klokken van beide partijen op dezelfde frequentie moeten worden ingesteld en dat de zender en ontvanger continu een continue synchronisatiebitsstroom moeten verzenden en ontvangen. Bij het verzenden van tekens in asynchrone communicatie kan de verzendende partij op elk moment beginnen met het verzenden van tekens. Daarom zijn in UART-communicatie het datastartbit en het stopbit essentieel.

hardwarelaag

De veelgebruikte RS-232 standaard wordt hier niet in detail uitgelegd. Het belangrijkste is dat de Tx-lijn en Rx-lijn van het overeenkomstige apparaat correct op elkaar zijn afgestemd.

Protocollaag

In de protocollaag wordt de inhoud van het gegevenspakket vastgelegd, dat bestaat uit een startbit, body data, checkbit en stopbit. Het formaat van het gegevenspakket van beide communicerende partijen moet worden overeengekomen om gegevens normaal te kunnen verzenden en ontvangen.

Baudrate: Aangezien er geen kloksignaal is bij asynchrone communicatie, moeten de twee communicatieapparaten het eens zijn over de baudsnelheid. Gebruikelijke zijn 4800, 9600, 115200, enz.

Start- en stopsignalen van communicatie: Een gegevenspakket in seriële communicatie begint met het startsignaal en eindigt met het stopsignaal. Het startsignaal van het gegevenspakket wordt vertegenwoordigd door een logische 0 gegevensbit, terwijl het stopsignaal van het gegevenspakket kan worden vertegenwoordigd door 0,5, 1, 1,5 of 2 logische 1 gegevensbits, zolang beide partijen hiermee instemmen.

Geldige gegevens: Onmiddellijk na het startbit van het gegevenspakket staat de belangrijkste gegevensinhoud die moet worden verzonden, ook wel geldige gegevens genoemd. De lengte van geldige gegevens is vaak 8 of 9 bits lang.

Gegevenscontrole: Na de geldige gegevens is er een optioneel cijfer voor gegevenscontrole. Aangezien datacommunicatie relatief gevoelig is voor externe interferentie, waardoor afwijkingen in de verzonden gegevens ontstaan, kan er een controlebit aan het transmissieproces worden toegevoegd om dit probleem op te lossen. De controlemethoden omvatten oneven pariteit (odd), even pariteit (even), 0 pariteit (space), 1 pariteit (mark) en geen pariteit (noparity).

Oneven pariteit vereist dat het aantal “1”s“ in de geldige data- en controlebits een oneven aantal is. Een 8-bits lange geldige data is bijvoorbeeld: 01101001. Op dit moment zijn er in totaal 4 ”1“s”. Om het oneven pariteitseffect te bereiken, is de pariteitscontrole De pariteitsbit is “1” en de uiteindelijk verzonden gegevens zullen 8 bits geldige gegevens plus 1 bit controlebit zijn, in totaal 9 bits. De vereisten voor even pariteit en oneven pariteit zijn precies omgekeerd. Het aantal “1”s“ in de gegevens- en pariteitsbits van het frame moet een even aantal zijn. Bijvoorbeeld, gegevensframe: 11001010. Op dit moment is het aantal ”1“s” in het gegevensframe 4, dus het is even. Het controlegetal is “0”. 0 pariteit betekent dat ongeacht de inhoud van de geldige gegevens, het controlecijfer altijd "0" is, 1 pariteit betekent dat het controlecijfer altijd "1" is.

Analyse van het functionele blokdiagram van UART

Deze afbeelding is een modulediagram van UART modellering met behulp van System C toen ik op school zat. Voor het interface gedeelte zijn de belangrijkste Tx, Rx data output, ontvangende interface en clk levert het initiële kloksignaal van de baudrate generatie module. Wat betreft het controller gedeelte, hier worden logische circuits gebruikt om specifieke besturing van output/ontvangst enable, device enable, etc. te implementeren.

Bij de huidige microcontrollers is het besturingsgedeelte van het digitale circuit ingekapseld en hoef je nu alleen nog maar de corresponderende bits van het corresponderende register te bedienen om de UART aan te sturen. Als we de chip STM32F411 als voorbeeld nemen, zien we in de volgende afbeelding het blokschema van de UART:

Baudrate generatie module:

De zender en ontvanger van de USART gebruiken dezelfde baudrate. Er is de volgende berekeningsformule

Daaronder is fck de USART-klok en USARTDIV een niet-getekend getal met vaste komma dat is opgeslagen in het baudrate-register (USART_BRR). De DIV_Mantissa[11:0] bits definiëren het gehele getal van USARTDIV en de DIV_Fraction[3:0] bits definiëren het fractionele deel van USARTDIV.

Bijvoorbeeld: DIV_Mantissa=24 (0x18), DIV_Fraction=10 (0x0A), dan is de USART_BRR waarde 0x18A; dan zijn de decimale cijfers van USARTDIV 10/16=0,625; de gehele cijfers zijn 24 en de uiteindelijke waarde van USARTDIV is 24,625.

Gebruikelijke waarden voor de baudrate zijn 2400, 9600, 19200 en 115200. Hieronder wordt aan de hand van een voorbeeld uitgelegd hoe de registerwaarde moet worden ingesteld om de baudrate-waarde te verkrijgen. We weten dat USART1 de APB2 busklok gebruikt, die maximaal 72MHz kan bereiken, en dat de andere USARTs een maximale frequentie van 36MHz hebben. We kiezen USART1 als voorbeeld om uit te leggen, dat wil zeggen fck=72MHz. Om de baudrate van 115200bps te krijgen, op dit moment: 115200=72000000/(16*USARTDIV), de oplossing is USARTDIV=39.0625, kan worden berekend dat DIV_Fraction=0.0625*16=1=0x01, DIV_Mantissa=39=0x27, dat wil zeggen, USART_BRR moet worden ingesteld De waarde is 0x171.

Gegevensregister:

Alleen de onderste 9 bits van het UART-dataregister (USART_DR) zijn geldig en of het 9e bit data geldig is, hangt af van de instelling van het M-bit in het UART-controleregister 1 (USART_CR1). Als het M-bit 0 is, betekent dit dat de 8-bits datawoordlengte Een waarde van 1 vertegenwoordigt een 9-bits datawoordlengte en we gebruiken over het algemeen een 8-bits datawoordlengte.

USART_DR bevat verzonden of ontvangen gegevens. USART_DR bevat in feite twee registers, een beschrijfbare TDR die speciaal wordt gebruikt voor verzenden en een leesbare RDR die speciaal wordt gebruikt voor ontvangen. Bij het uitvoeren van een verzendoperatie worden gegevens die naar USART_DR worden geschreven automatisch opgeslagen in TDR; bij het uitvoeren van een leesoperatie worden gegevens die naar USART_DR worden gelezen automatisch uit RDR-gegevens gehaald.

Zowel TDR als RDR bevinden zich tussen de systeembus en het schuifregister. Seriële communicatie wordt bit voor bit verzonden. Bij zenden wordt de TDR-inhoud overgebracht naar het zendende schuifregister en vervolgens wordt elke bit van de gegevens in het schuifregister verzonden. Bij het ontvangen wordt elke ontvangen bit sequentieel opgeslagen in het ontvangende schuifregister. register en vervolgens overgebracht naar RDR.

UART ondersteunt DMA-transmissie, wat gegevensoverdracht op hoge snelheid (zonder door de CPU te gaan) mogelijk maakt. Om de DMA-functie van UART in te schakelen, moet het DMAT-bit van het USART_CR1-register op 1 worden gezet.

Controleur:

UART heeft een zender die specifiek het zenden regelt, een ontvanger die het ontvangen regelt, evenals een wake-up unit, interruptregeling, enz. Voordat u UART gebruikt, moet u UART inschakelen door het UE-bit van het USART_CR1-register op 1 te zetten. Het UE-bit wordt gebruikt om de klok in te schakelen die aan de seriële poort wordt geleverd. De lengte van de verzonden of ontvangen gegevens kan 8 of 9 bits zijn, geregeld door het M-bit van USARTT_CR1.

1) Zender

Als het transmissie-inschakelbit TE van het USART_CR1-register op 1 wordt gezet, wordt de datatransmissie gestart en worden de gegevens in het transmissieschuifregister uitgevoerd op de TX-pin, met het lage bit eerst en het hoge bit als laatste.

Een karakterframe-overdracht bestaat uit drie delen: startbit, gegevensframe en stopbit. Het startbit is het lage niveau van een bitperiode en de bitperiode is de tijd die elk bit in beslag neemt; het gegevensframe is de 8- of 9-bits gegevens die we willen verzenden en de gegevens worden verzonden beginnend bij het laagste bit; het stopbit is een bepaald hoog niveau van een tijdsperiode.

De lengte van de stopbits kan worden geregeld door de STOP[1:0]-bits van UART-controleregister 2 (USART_CR2) en 0,5, 1, 1,5 en 2 stopbits zijn optioneel. Standaard wordt 1 stopbit gebruikt. 2 stopbits zijn beschikbaar voor normale USART-modus, enkeldraadsmodus en modemmodus. 0,5 en 1,5 stopbits worden gebruikt in smartcardmodus.

Wanneer het zendinschakelbit TE op 1 wordt gezet, begint de zender met het zenden van een idle frame (een frame met een grote datalengte), waarna de te zenden data in het USART_DR register kunnen worden geschreven. Na het schrijven van de laatste gegevens moet worden gewacht tot de TC-bit van het UART statusregister (USART_SR) op 1 staat, wat aangeeft dat de gegevensoverdracht is voltooid. Als de TCIE bit van het USART_CR1 register op 1 wordt gezet, wordt een interrupt gegenereerd.

Bij het verzenden van gegevens zijn de volgende vlaggen belangrijk:

TE: Zendvrijgave.

TXE: Het zendregister is leeg, gebruikt bij het verzenden van een enkele byte.

TC: Verzending voltooid, gebruikt bij het verzenden van meerdere bytes aan gegevens.

TXIE: Zend voltooiing interrupt inschakelen.

2) Ontvanger

Zet het RE-bit van het CR1-register op 1 om USART-ontvangst mogelijk te maken, waardoor de ontvanger begint te zoeken naar het startbit op de RX-lijn. Na het bepalen van het startbit wordt de data opgeslagen in het ontvangende schuifregister volgens de status van het RX-lijnniveau. Nadat de ontvangst is voltooid, worden de gegevens in het ontvangende schuifregister verplaatst naar het PDR en wordt de RXNE-positie van het USART_SR-register gewijzigd. Er kan een interrupt worden gegenereerd als RXNEIE in het USART_CR2-register op 1 wordt gezet.

Bij het ontvangen van gegevens zijn de volgende vlaggen belangrijk:

RE: ontvangst inschakelen.

RXNE: Read data register is niet leeg.

RXNEIE: Zend voltooiing interrupt inschakelen.

USART_CR1 register:

USART_CR2 register:

USART_CR3 register:

Trefwoorden: seriële poortmodule

Neem contact met ons op