Einführung in ESP-UARTs

1 Einführung in UARTs

UART ist eine zeichenorientierte universelle Datenverbindung, die die Kommunikation zwischen Geräten ermöglicht. Durch die asynchrone Übertragung ist es nicht erforderlich, den gesendeten Daten Taktinformationen hinzuzufügen. Dies erfordert auch, dass die Rate, das Stoppbit, das Paritätsbit usw. des sendenden Endes und des empfangenden Endes gleich sein müssen, damit die Kommunikation erfolgreich sein kann.

1.1 UART-Kommunikationsprotokoll

Ein typischer UART-Frame beginnt mit einem Startbit, gefolgt von gültigen Daten, dann Paritätsbits (optional) und schließlich Stoppbits.

Das Paketformat ist wie folgt
Fügen Sie hier eine Bildbeschreibung ein

Startbit

UART-Datenübertragungsleitungen werden normalerweise auf einem hohen Spannungspegel gehalten, wenn keine Daten übertragen werden. Um mit der Datenübertragung zu beginnen, zieht der sendende UART die Übertragungsleitung für einen Taktzyklus von High auf Low. Wenn der empfangende UART einen Übergang von hoch nach niedrig erkennt, beginnt er, die Bits im Datenrahmen mit der Baudrate zu lesen.

Datenrahmen

Datenrahmen enthalten die tatsächlich übertragenen Daten. Wenn ein Paritätsbit verwendet wird, kann dieses 5 bis 8 Bit lang sein. Wenn kein Paritätsbit verwendet wird, kann der Datenrahmen 9 Bit lang sein.

Paritätsbits

Parität beschreibt, wie gerade oder ungerade eine Zahl ist. Mithilfe des Paritätsbits kann der empfangende UART feststellen, ob sich die Daten während der Übertragung geändert haben. Elektromagnetische Strahlung, nicht übereinstimmende Baudraten oder lange Datenübertragungen können Bits verändern.

Stopp-Bits

Um das Ende eines Pakets zu signalisieren, steuert der sendende UART die Datenleitung für eine Dauer von 1 bis 2 Bit von Low auf High.

Das Folgende ist die Wellenform der Baudrate: 115200, Datenbits: 8, Parität: Keine, Stoppbits: 1

[Bildübertragung mit externem Link fehlgeschlagen, die Quellseite verfügt möglicherweise über einen Anti-Leeching-Mechanismus. Es wird empfohlen, das Bild zu speichern und direkt hochzuladen (img-guzeCjUf-1678431851237)(res/uart waveform.png)]

2 Durchflusskontrolle

Streaming dient hauptsächlich dazu, das Problem der Geschwindigkeitsinkongruenz zwischen der sendenden und der empfangenden Partei zu lösen. Wenn die vom empfangenden Ende empfangenen Daten nicht verarbeitet werden können, sendet es ein Signal, das es nicht mehr an das sendende Ende empfängt. Nach dem Empfang dieses Signals stoppt das sendende Ende das Senden, bis es ein Signal empfängt, das weiterhin senden kann. Die Flusskontrolle kann den Fortschritt der Datenübertragung steuern und so Datenverlust verhindern.

2.1 Hardware-Flusskontrolle

Für die Hardware-Flusssteuerung sind neben RX und TX zwei zusätzliche Steuerleitungen erforderlich, eine heißt CTS (Clear To Send) und ist ein Eingangssignal; die andere heißt RTS (Require To Send) und ist ein Ausgangssignal. Eine dieser beiden Leitungen empfängt die Steuerung und die andere sendet die Steuerung. Ein niedriger Pegel zeigt an, dass Daten gesendet werden können, und ein hoher Pegel zeigt an, dass das sendende Ende warten muss.

2.2 Software-Flusskontrolle

Bei der Software-Flusskontrolle werden die Sonderzeichen XON(0x11) und XOFF(0x13) in die gesendeten Daten eingefügt, um die Übertragung zu steuern. Erzwingen Sie, dass der Sender mit dem Senden von Daten aufhört, indem Sie XOFF einfügen, und zwingen Sie den Sender, Daten zu senden, indem Sie XON einfügen.

2.3 Unterschiede

Hardware-Flusskontrolle Software-Flusskontrolle
Die Hardware muss zwei zusätzliche Drähte hinzufügen Hardware muss nicht geändert werden
Kann Transfers schnell stoppen Sie müssen warten, bis die vorherige Datenübertragung abgeschlossen ist, da es zu einer Verzögerung kommt
kein Missbrauch Möglicherweise liegt eine Fehlerkennung vor (die empfangenen Daten stimmen mit dem Steuerzeichen überein).

Im Allgemeinen wird in einer Umgebung, in der es zu einem Überlauf kommen kann, die Hardware-Flusskontrolle bevorzugt.

2.4 Beziehung zwischen UART und TTL, RS232

UART achtet stärker auf Standards, die das Codierungsformat angeben, z. B. Baudrate, Rahmenformat und Baudratenfehler usw., was eher einem spezifizierten Protokoll ähnelt. Serielle Kommunikationsschnittstellen wie RS232, TTL und RS485 definieren unterschiedliche elektrische Eigenschaften der Schnittstelle. Beispielsweise ist RS-232 ein Single-Ended-Ein- und -Ausgang, während RS-485 ein differenzieller Ein- und Ausgang ist. Hardware.

TTL RS232 RS485
Pegelsignal Das Pegelsignal beträgt 5 V oder 3,3 V Der Signalpegel der Schnittstelle ist relativ hoch, plus oder minus 6-15 V sind akzeptabel Hoher und niedriger Pegel werden durch die minimale Differenzspannung bestimmt
Übertragungsmethode Vollduplex Vollduplex Halbduplex
Übertragungsentfernung Theoretisch 10 Fuß (5 m), schlechte Störfestigkeit Bis zu 15 m Kommunikationsentfernung Differenzsignal, theoretische Kommunikationsentfernung bis zu 1200 Meter

Der Chip-UART ist im Allgemeinen auf TTL-Ebene.

2,5 USB-zu-TTL-Seriell-Chip

Im tatsächlichen Gebrauch verwenden wir den USB-Anschluss des Computers, um auf die UART-Peripheriegeräte des ESP32 zuzugreifen. In der Mitte benötigen wir einen seriellen USB-zu-TTL-Port-Chip. Im Folgenden sind einige derzeit gängige Typen aufgeführt. In einer Tabelle werden ihre verschiedenen Eigenschaften verglichen:

CP2102/2103 CH340-Serie FT232R PL2303HX
Hersteller Silizium Nanjing Qinheng FDTI Produktiv
Höchstsatz 1 M 2 M 3 M 12 M
Bit 5, 6, 7, 8 5, 6, 7, 8 7、8 5, 6, 7, 8
Prüfziffer ungerade/gerade/1/0/keine ungerade/gerade/1/0/keine ungerade/gerade/1/0/keine ungerade/gerade/1/0/keine
Stoppbit 1、1.5、2 1、2 1、2 1、1.5、2
Hardware-Flusskontrolle haben haben haben haben
Stabilität Gut Gut am meisten Unterschied
Preis Mitte Niedrig hoch Niedrig

Die meisten aktuellen Entwicklungsboards der ESP32-Serie integrieren CP2102.

3 ESP32 UART-Hardware

Die aktuellen Chips der ESP32-Serie integrieren alle mehrere UART-Peripheriegeräte und unterstützen asynchrone Kommunikation (RS232 und RS485) sowie IrDA.

Im Folgenden sind die Unterschiede zwischen UARTs verschiedener Chips aufgeführt.

ESP32 ESP32-S2 ESP32-S3 ESP32-C3 ESP32-C2
Anzahl der UARTs 3 2 3 2 2
Maximale Kommunikationsrate 5 Mbit/s 5 Mbit/s 5 Mbit/s 5 Mbit/s 2,5 Mbit/s
Ob DMA unterstützt werden soll Ja Ja Ja Ja NEIN

Aus dem Test auf der AT-Seite geht hervor, dass die maximale tatsächliche UART-Kommunikationsrate mit dem Dupont-Kabel 2 Mbit/s erreichen kann. Bei Überschreitung sind die Daten falsch. Wenn eine höhere Kommunikationsrate erforderlich ist, ist es am besten, das Kabel von der Leiterplatte zu verlegen .

3.1 Gemeinsame Interrupts

Interrupt-Name Einführung
UART_TX_DONE_INT Dieser Interrupt wird ausgelöst, wenn der Sender alle Daten im FIFO gesendet hat
UART_RXFIFO_TOUT_INT Dieser Interrupt wird ausgelöst, wenn der Empfänger ein Byte empfängt, das länger als UART_RX_TOUT_THRHD ist
UART_RXFIFO_OVF_INT Dieser Interrupt wird ausgelöst, wenn der Empfänger mehr Daten empfangen hat, als der FIFO speichern kann
UART_FRM_ERR_INT Dieser Interrupt wird ausgelöst, wenn der Empfänger einen Datenrahmenfehler erkennt
UART_PARITY_ERR_INT Dieser Interrupt wird ausgelöst, wenn der Empfänger einen Paritätsfehler erkennt
UART_TXFIFO_EMPTY_INT Dieser Interrupt wird ausgelöst, wenn die Datenmenge im Sende-FIFO kleiner ist als der durch UART_TXFIFO_EMPTY_THRHD angegebene Wert
UART_RXFIFO_FULL_INT Dieser Interrupt wird ausgelöst, wenn der Empfänger mehr Daten empfangen hat, als durch UART_RXFIFO_FULL_THRHD angegeben
UART_WAKEUP_INT Dieser Interrupt wird generiert, wenn der UART aufgeweckt wird
UART_BRK_DET_INT Dieser Interrupt wird ausgelöst, wenn der Empfänger nach dem Stoppbit einen NULL-Wert erkennt

Der UART-RF-FIFO und der TX-FIFO des ESP-Chips teilen sich einen Teil des RAM-Speicherplatzes. Bei der Implementierung von IDF sind der RX-FIFO und der TX-FIFO unabhängig voneinander und die Länge beträgt 128 Byte. Der Überlauf-Interrupt von OVF wird ausgelöst, nachdem der Empfang den Maximalwert von FIFO überschreitet.

3.2 Implementierung von ESP-IDF

Derzeit verwendet ESP-IDF UART RF FIFO zum internen Lesen und Schreiben und verwendet kein UART DMA. Aber im UART-Treiber werden TX-FIFO und RX-FIFO jeweils mit dem entsprechenden Ringpuffer verbunden.

  1. Nachdem der RX-FIFO die Daten empfangen hat, wirft er die Daten an den RX-Ringpuffer und löst das UART_DATA-Ereignis aus
  2. Der Ringpuffer von TX beginnt mit dem Senden von Daten an den TX-FIFO, nachdem er Daten der Anwendungsschicht empfangen hat

Während dieser Zeit wird der aktuelle Status durch UART-Ereignisse und die Entsprechung zwischen UART-Ereignissen und Interrupts identifiziert

Fall Unterbrechen Kommentar
UART_DATA 1. UART_RXFIFO_TOUT_INT
2. UART_RXFIFO_FULL_INT
1. Timeout: 10 Byte Übertragungszeit
2. Vollständiger Thresh: 120 Byte
UART_FIFO_OVF UART_RXFIFO_OVF_INT Der FIFO-Überlaufschwellenwert beträgt 128 Byte
UART_BUFFER_FULL / Der anfängliche UART-RX-Ringpufferwert ist voll
UART_PATTERN_DET UART_INTR_CMD_CHAR_DEF Es wird eine bestimmte Anzahl von Sonderzeichen empfangen, z. B. „+++“ in AT
UART_BREAK UART_INTR_BRK_DEF erhaltenBREAK
UART_FRAME_ERR UART_FRM_ERR_INT
UART_PARITY_ERR UART_PARITY_ERR_INT
UART_DATA_BREAK / uart_write_bytes_with_breakSenden Sie BREAK, nachdem die Daten gesendet wurden
UART_WAKEUP UART_WAKEUP_INT

Hinweis: Das BREAK-Signal hat einen niedrigen Pegel, der für einen bestimmten Zeitraum anhält (länger als ein UART-Frame).

3.3 Häufige Problemanalyse

  1. Die Länge der beim Aufruf uart_read_bytesder Schnittstelle gelesenen Daten ist kürzer als die tatsächlich gesendeten Daten

    • Chips der ESP32-Serie verwenden FIFO zum Lesen und Schreiben von UART-Daten. Standardmäßig wird bei 120 Byte ein Interrupt generiert, um den blockierten Zustand uart_read_byteszu entfernen Wenn die Sendelänge mehr als 122 Byte beträgt, kann es erforderlich sein, die UART_READ-Schnittstelle mehrmals aufzurufen lesen
  2. Die während der UART-Initialisierung konfigurierte rx_buffer_size ist offensichtlich sehr groß, es kommt jedoch zu Datenverlust

    • Der Datenverlust wird dadurch verursacht, dass der FIFO voll ist. Zu diesem Zeitpunkt werden die Daten nicht rechtzeitig in den Empfangspuffer übertragen. Im Allgemeinen wird UART_FIFO_OVF ausgelöst. Zu diesem Zeitpunkt wird empfohlen, eine Flusskontrolle hinzuzufügen oder den Schwellenwert FULL_THRESH zu senken.
  3. Nachdem der ESP32 die Schlafschnittstelle aufgerufen hat, ist die UART-Kommunikation abnormal

    • ESP32 UART unterstützt zwei Taktquellen, 80 MHz APB_CLK und Referenztakt REF_TICK. APB_CLK wird standardmäßig verwendet und diese Taktquelle funktioniert im Ruhezustand nicht mehr. Wenn Sie den Ruhezustand unterstützen müssen, müssen Sie daher REF_TICK konfigurieren, wenn UART initialisiert wird. Beachten Sie, dass diese Taktquelle nur mit einer Baudrate ausgeführt werden kann von 115200.

Guess you like

Origin blog.csdn.net/Marchtwentytwo/article/details/129443137