Kommunikationsprotokolle in Embedded Systems
In modernen Embedded Systems spielen Kommunikationsprotokolle eine zentrale Rolle, da sie den Datenaustausch zwischen Mikrocontrollern, Sensoren, Aktoren und anderen Systemkomponenten ermöglichen. Ob in industriellen Anwendungen, Fahrzeugsteuerungen oder IoT-Geräten – zuverlässige und effiziente Kommunikation ist essenziell.
Zu den wichtigsten seriellen Schnittstellen zählen UART (Universal Asynchronous Receiver-Transmitter), I²C (Inter-Integrated Circuit), SPI (Serial Peripheral Interface) und CAN (Controller Area Network). Jedes dieser Protokolle hat spezifische Eigenschaften und Anwendungsbereiche: Während I²C häufig für die Verbindung von Sensoren und Peripheriegeräten genutzt wird, kommt CAN vor allem in Automobil- und Industrieanwendungen zum Einsatz. UART hingegen dient als einfache serielle Schnittstelle für die Punkt-zu-Punkt-Kommunikation.
Dieser Beitrag gibt einen Überblick über die Funktionsweise und Einsatzgebiete dieser Protokolle und zeigt, wie sie in Embedded Systems implementiert werden können. Zudem wird das Entwicklungswerkzeug DAVE vorgestellt, das die Konfiguration und Programmierung von Mikrocontrollern wie dem Infineon XMC4700 erleichtert.
Table of Contents
UART - Universal Asynchronous Receiver-Transmitter
UART (Universal Asynchronous Receiver-Transmitter) ist ein serielles Kommunikationsprotokoll, das den Datenaustausch zwischen zwei Geräten ermöglicht. Es arbeitet asynchron, das heißt, es benötigt keine gemeinsame Taktleitung. Stattdessen wird die Datenübertragung durch Start- und Stop-Bits strukturiert.
Das Protokoll nutzt nur zwei Drähte, wobei das TX-Signal (Transmit) eines Geräts mit dem RX-Signal (Receive) des anderen verbunden wird. Dadurch können Daten in beide Richtungen übertragen werden. Abhängig von der Konfiguration kann UART als Simplex-, Halbduplex- oder Vollduplex-Schnittstelle arbeiten.
- Simplex: Ein Gerät sendet nur, das andere empfängt nur.
- Halbduplex: Geräte können abwechselnd senden und empfangen.
- Vollduplex: Beide Geräte können gleichzeitig Daten austauschen
Da UART asynchron arbeitet, teilen sich Sender und Empfänger keinen gemeinsamen Takt. Dadurch müssen beide Geräte auf die gleiche Übertragungsgeschwindigkeit (Baudrate) eingestellt sein und dieselbe Frame-Struktur verwenden. Andernfalls können Daten fehlerhaft oder gar nicht übertragen werden.
Typische Baudraten für UART sind 4800, 9600, 19200, 57600 und 115200 Baud.
Bei der Datenübertragung erfolgt die Übertragung der Bits in einer bestimmten Reihenfolge. Dabei wird das Least Significant Bit (LSB) zuerst gesendet, gefolgt von den restlichen Bits bis hin zum Most Significant Bit (MSB). Diese sogenannte „Little-Endian“-Reihenfolge ist ein typisches Merkmal der UART-Kommunikation.
Die Datenübertragung erfolgt in einem bestimmten Format, das meist aus Start-Bit, Datenbits (z. B. 8 Bit), optionalem Paritätsbit und einem oder mehreren Stoppbits besteht. Dieses Format muss bei Sender und Empfänger identisch sein, um eine fehlerfreie Kommunikation zu gewährleisten.
Das Paritätsbit ist eine Fehlererkennungsmaßnahme, die bei der UART-Kommunikation verwendet wird. Es wird zusätzlich zu den Datenbits gesendet, um sicherzustellen, dass die übertragenen Daten korrekt sind.
Das Paritätsbit überprüft, ob die Anzahl der 1-Bits in einem Datenwort gerade oder ungerade ist. Es gibt verschiedene Arten von Parität:
- Gerade Parität: Das Paritätsbit wird so gesetzt, dass die Gesamtzahl der 1-Bits im Datenwort (einschließlich des Paritätsbits) gerade ist.
- Ungerade Parität: Das Paritätsbit wird so gesetzt, dass die Gesamtzahl der 1-Bits im Datenwort (einschließlich des Paritätsbits) ungerade ist.
- Keine Parität: Es wird kein Paritätsbit verwendet, daher erfolgt keine Fehlererkennung auf Basis der Parität.
In diesem Beispiel versenden wir die Hex-Zahl 0x8B mit gerader Parität.
Wenn wir das Signal messen würden, sähe es ungefähr so aus
Das Universal Asynchronous Receiver Transmitter (UART)-Protokoll ist eine weit verbreitete serielle Kommunikationsmethode, die besonders für einfache Punkt-zu-Punkt-Verbindungen zwischen zwei Geräten genutzt wird. Es hat sowohl Vorteile als auch Einschränkungen, die je nach Anwendung berücksichtigt werden sollten.
Vorteile von UART
- Benötigt nur zwei Leitungen (TX für das Senden, RX für das Empfangen).
- Kein Taktsignal erforderlich, da Sender und Empfänger sich auf eine gemeinsame Baudrate einigen.
- Fehlererkennung durch Paritätsbit, das Übertragungsfehler identifizieren kann.
- Flexible Datenstruktur, da das Datenpaket angepasst werden kann, solange Sender und Empfänger entsprechend konfiguriert sind.
- Weit verbreitet und gut dokumentiert, wodurch es in vielen Mikrocontrollern und eingebetteten Systemen leicht einsetzbar ist.
Nachteile von UART
- Datenrahmen ist auf maximal 9 Bits begrenzt, was für einige Anwendungen eine Einschränkung darstellen kann.
- Unterstützt keine Mehrfach-Master- oder Mehrfach-Slave-Systeme, da es nur für direkte Punkt-zu-Punkt-Verbindungen ausgelegt ist.
- Die Baudraten der beiden Geräte müssen aufeinander abgestimmt sein (Abweichung darf maximal 10 % betragen), um eine zuverlässige Kommunikation zu gewährleisten.
UART eignet sich besonders für einfache, robuste und störungsresistente Verbindungen, z. B. für serielle Konsolen, GPS-Module oder Bluetooth-Module. Es ist jedoch weniger geeignet für Anwendungen, bei denen mehrere Geräte gleichzeitig kommunizieren müssen.
I²C - Inter-Integrated Circuit
I²C (Inter-Integrated Circuit) ist ein synchrones Master-Slave-Protokoll, das eine bidirektionale, halbduplex Kommunikation ermöglicht. Sowohl der Master als auch die Slaves können Daten senden und empfangen. Der Bus kann mit unterschiedlichen Geschwindigkeiten betrieben werden, abhängig von der unterstützten Übertragungsrate der Geräte.
I²C benötigt nur zwei Leitungen:
- SCL (Serial Clock) – zur Synchronisation der Kommunikation
- SDA (Serial Data) – für den eigentlichen Datentransfer
Dank der Adressierung der Slaves können mehrere Geräte über denselben Bus verbunden und gezielt angesprochen werden.
In dieser Schaltung stellt VCC die Versorgungsspannung für die Pull-Up-Widerstände R1 und R2 dar.
Die Widerstände ziehen die SDA– (Datenleitung) und SCL– (Taktleitung) des I²C-Busses auf ein definiertes High-Level, wenn kein Gerät aktiv den Bus auf Low zieht. Das ist eine typische Implementierung des I²C-Protokolls, bei dem die Kommunikation über Open-Drain- oder Open-Collector-Ausgänge erfolgt.
Ohne diese Pull-up-Widerstände würde der Bus nicht korrekt funktionieren, da sich die Leitungen in einem undefinierten Zustand befinden würden, wenn kein Teilnehmer aktiv ein Signal setzt.
So sieht das vollständige I²C-Protokoll aus:
Jeder Slave im I²C-Bus besitzt eine eindeutige Adresse, die es dem Master ermöglicht, gezielt mit einem bestimmten Gerät zu kommunizieren. Beim Senden von Daten adressiert der Master zunächst den gewünschten Slave, bevor die eigentliche Datenübertragung beginnt. Diese Adressierung macht es möglich, mehrere Slaves an denselben Bus anzuschließen, ohne dass es zu Kollisionen kommt.
Beim I²C-Protokoll werden die Start- und Stop-Bits verwendet, um eine Datenübertragung zu kennzeichnen.
- Start-Bit: Der Master beginnt eine Übertragung, indem er die SDA-Leitung von HIGH nach LOW zieht, während SCL HIGH ist. Dies signalisiert allen Slaves den Beginn einer neuen Kommunikation.
- Stop-Bit: Am Ende der Übertragung wechselt der Master die SDA-Leitung von LOW nach HIGH, während SCL HIGH bleibt. Dadurch wird die Kommunikation beendet, und der Bus ist wieder frei für eine neue Übertragung.
Hier sieht man die korrekte Ansteuerung des Slaves mit der Adresse 0x27. In diesem Beispiel setzen wir das R/W-Bit (Read/Write-Bit) auf 0, da wir hier ein Bit verschicken möchten.
Nach der Ansteuerung warten wir auf das Acknowledge-Bit (ACK) des anzusteuernden Slaves. Standardmäßig bleibt die Leitung auf 1 (High). Wird das Datenbyte korrekt empfangen, wird die Leitung auf 0 (Low) gezogen, und wir erhalten ein ACK (Acknowledge). Wenn es einen Fehler gibt, bleibt die Leitung auf 1 (High), und wir erhalten ein NACK (Negative Acknowledge).
Dafür sendet der Master die Adresse sowie die Intention, also ob gelesen oder geschrieben werden soll, an alle Slaves. Die Slaves gleichen die empfangene Adresse mit ihrer eigenen ab. Der Slave, bei dem die empfangene Adresse mit der eigenen übereinstimmt – also der angesprochene Slave – sendet daraufhin ein ACK zurück.
Wir nehmen zur Datenübertragung unser Beispiel von UART. Hier möchten wir das Paket 0x8B übertragen.
Anders als bei UART wird hier das MSB zuerst gesendet.
Nach dem ACK können wir beliebig viele 8-Bit-Sequenzen verschicken, solange die Kommunikation fortgesetzt wird. Die Kommunikation wird jedoch immer mit dem Stopbit beendet, um den Datentransfer ordnungsgemäß abzuschließen.
So funktioniert das Senden von Daten an einen Slave, aber wie funktioniert das Auslesen von Registern eines Slaves?
Daten aus einem Slave auslesen: Funktionsweise und Ablauf
Das Auslesen von Daten läuft etwas anders ab. Hier ist eine kurze Zusammenfassung des Ablaufs:
- Start Condition: Master initiiert die Kommunikation.
- Slave-Adresse mit Write-Bit (0): Master teilt dem Slave mit, dass er die Daten lesen möchte.
- Register-Adresse (optional): Master gibt an, von welchem Register er die Daten lesen möchte.
- Repeated Start oder Stop: Master setzt die Kommunikation fort oder beendet sie.
- Slave-Adresse mit Read-Bit (1): Master fordert Daten vom Slave an.
- Datenempfang: Slave sendet die angeforderten Daten.
- ACK/NACK: Master bestätigt oder beendet die Übertragung der Daten.
- Stop Condition: Master beendet die Kommunikation.
Zusammenfassend lässt sich sagen, dass I²C ein synchrones Protokoll ist, das für die Kommunikation mit mehreren Geräten über eine gemeinsame Leitung ausgelegt ist, während UART ein asynchrones Protokoll für einfache Punkt-zu-Punkt-Verbindungen zwischen zwei Geräten darstellt. I²C erfordert eine Taktleitung und eine Adressierung der Geräte, während UART ohne Takt und ohne Adressierung funktioniert. I²C eignet sich besonders für Anwendungen, bei denen mehrere Geräte miteinander kommunizieren müssen, während UART in einfacheren, direkten Verbindungen verwendet wird.
Vorteile von I²C
- Benötigt nur zwei Leitungen (SDA, SCL)
- Unterstützt mehrere Master- und Slave-Geräte
- ACK/NACK-Bit bestätigt die erfolgreiche Übertragung jedes Datenframes
- Weniger komplexe Hardware im Vergleich zu UART
- Gut etabliertes und weit verbreitetes Protokoll
Nachteile von I²C
- Langsamere Datenübertragungsrate als SPI
- Datenrahmen sind auf 8 Bit begrenzt
- Komplexere Hardware-Implementierung im Vergleich zu SPI
SPI - Serial Peripheral Interface
Das SPI ist ein schnelles, synchrones Kommunikationsprotokoll, das häufig für die Datenübertragung zwischen Mikrocontrollern und Peripheriegeräten wie Sensoren, Displays und Speicherchips verwendet wird. Im Gegensatz zu I²C nutzt SPI eine vollduplexfähige Datenübertragung, bei der Daten gleichzeitig in beide Richtungen fließen können.
SPI basiert auf einem Master-Slave-Prinzip und verwendet mindestens vier Leitungen:
- MOSI (Master Out, Slave In) – Datenleitung vom Master zum Slave
- MISO (Master In, Slave Out) – Datenleitung vom Slave zum Master
- SCLK (Serial Clock) – Taktleitung, die vom Master gesteuert wird
- CS (Chip Select) – zur Auswahl des gewünschten Slave-Geräts
Das Protokoll zeichnet sich durch seine hohe Geschwindigkeit, einfache Implementierung und geringe Latenz aus, benötigt aber im Vergleich zu I²C mehr Verbindungen, insbesondere bei mehreren Slaves. SPI eignet sich besonders für Anwendungen, die eine schnelle und zuverlässige Kommunikation erfordern, wie z. B. in der industriellen Automatisierung, der Sensorik oder bei Speichermodulen wie SD-Karten.
Die Slaves können auf zwei verschiedene Arten miteinander verbunden werden:
Daisy-Chain-Verbindung
- Hier sind die Slaves in einer Reihenschaltung miteinander verbunden.
- Der erste Slave empfängt die Daten vom Master, verarbeitet sie und gibt sie an den nächsten Slave weiter.
- Dieses Verfahren wird häufig bei SPI eingesetzt, wenn alle Slaves die gleichen Daten verarbeiten oder weiterleiten sollen.
- Vorteil: Weniger Chip-Select-Leitungen erforderlich.
- Nachteil: Jeder Slave muss die Daten korrekt weitergeben, sonst kann es zu Fehlern in der Kommunikation kommen.
Parallel-Verbindung (über individuelle Chip-Select-Leitungen)
- Jeder Slave ist direkt mit dem Master verbunden und hat eine eigene Chip-Select-Leitung (CS/SS).
- Der Master wählt den jeweiligen Slave durch Aktivieren seiner CS-Leitung aus.
- Vorteil: Unabhängige Kommunikation mit jedem Slave möglich.
- Nachteil: Erhöhter Verkabelungsaufwand, da für jeden Slave eine separate CS-Leitung benötigt wird.
Die Wahl der Verbindungsart hängt von der Anwendung ab – Daisy-Chaining eignet sich für serielle Verarbeitung von Daten, während die parallele Anbindung mehr Flexibilität bietet, aber mehr GPIO-Pins des Masters benötigt.
Die Kommunikation im Serial Peripheral Interface (SPI) erfolgt in mehreren Schritten zwischen einem Master und einem oder mehreren Slaves. Dabei werden Daten synchron über die MOSI– und MISO-Leitungen übertragen, gesteuert durch ein Taktsignal des Masters.
Der Master gibt das Taktsignal aus:
- Der Master erzeugt das Serielle Taktsignal (SCLK), das die Synchronisation der Datenübertragung ermöglicht.
Der Master aktiviert den gewünschten Slave:
- Durch Setzen des SS/CS-Pins auf LOW wird der ausgewählte Slave aktiviert und auf den Empfang vorbereitet.
Der Master sendet Daten an den Slave:
- Die Daten werden Bit für Bit über die MOSI-Leitung (Master Out, Slave In) übertragen.
- Der Slave empfängt die Bits synchron mit dem Taktsignal und speichert sie entsprechend.
4. Der Slave antwortet (falls erforderlich):
- Falls eine Antwort notwendig ist, sendet der Slave die Daten Bit für Bit über die MISO-Leitung (Master In, Slave Out) zurück.
- Der Master liest die empfangenen Bits ebenfalls synchron zum Taktsignal aus.
Bei der Wahl eines Kommunikationsprotokolls sollte SPI anhand der spezifischen Anforderungen eines Projekts bewertet werden. Es bietet sowohl Vorteile als auch Einschränkungen im Vergleich zu anderen Protokollen wie I²C oder UART.
Vorteile von SPI
- Keine Start- und Stopp-Bits, sodass Daten kontinuierlich und ohne Unterbrechung gestreamt werden können.
- Kein komplexes Adressierungssystem wie bei I²C, da Slaves direkt über die Chip-Select-Leitung (SS/CS) ausgewählt werden.
- Höhere Datenübertragungsrate als I²C (fast doppelt so schnell).
- Vollduplex-Kommunikation durch getrennte MOSI- und MISO-Leitungen, wodurch Daten gleichzeitig gesendet und empfangen werden können.
Nachteile von SPI
- Höherer Verkabelungsaufwand, da vier Leitungen benötigt werden (I²C und UART kommen mit zwei aus).
- Keine Bestätigung der Datenübertragung – es gibt kein ACK/NACK-Signal wie bei I²C, um eine erfolgreiche Übertragung zu garantieren.
- Kein integriertes Fehlererkennungssystem, wie z. B. das Paritätsbit in UART.
- Nur ein einziger Master möglich, was die Flexibilität im Vergleich zu I²C einschränkt.
Trotz dieser Nachteile ist SPI ideal für Anwendungen, die eine schnelle, zuverlässige und vollduplexfähige Datenübertragung benötigen, wie etwa in der Sensorik, bei Displays oder Speicherchips.
CAN - Controller Area Network
Das Controller Area Network (CAN) ist ein serielles, halbduplexes Bus-System, das 1986 von Bosch für die Automobilindustrie entwickelt wurde. Es ermöglicht eine robuste und effiziente Kommunikation zwischen Steuergeräten (ECUs) in Fahrzeugen und anderen eingebetteten Systemen. CAN basiert auf einem mehrfach zugänglichen, prioritätsbasierten Nachrichtensystem, das ohne zentrale Steuerung auskommt. Dank seiner Fehlertoleranz, Echtzeitfähigkeit und hohen Störsicherheit hat sich CAN über die Automobilbranche hinaus in zahlreichen industriellen Anwendungen, der Medizintechnik und der Automatisierungstechnik etabliert.
CAN nutzt eine differenzielle Signalübertragung, um Datenbits sicher und störungsresistent zu übertragen. Dabei gibt es zwei Zustände:
Dominanter Zustand (logische 0):
- CAN H steigt auf ca. 3.75V
- CAN L fällt auf ca. 1.25V
- Die Differenz beträgt 2.5V → Das Bit wird als „0“ interpretiert.
Rezessiver Zustand (logische 1):
- Beide Signale ruhen bei 2.5V
- Die Differenz beträgt 0V → Das Bit wird als „1“ interpretiert.
Die differenzielle Signalübertragung im CAN-Bus ist störsicher, weil äußere Störungen meist beide Leitungen (CAN_H und CAN_L) gleichermaßen beeinflussen. Da die Information nicht in den absoluten Spannungswerten, sondern in der Spannungsdifferenz zwischen den beiden Leitungen steckt, kann das System das Signal auch bei Störungen korrekt interpretieren.
Ein vollständiger CAN-Frame besteht aus mehreren Feldern:
Start of Frame (SOF, 1 Bit)
- Signalisiert den Beginn einer neuen Nachricht
- Immer ein dominantes „0“-Bit
Arbitration Field (12 Bit)
- Enthält die 11-Bit-Identifier (Priorität der Nachricht)
- Enthält das RTR-Bit (Remote Transmission Request), das angibt, ob Daten gesendet werden (dominant = 0) oder nur angefordert werden (rezessiv = 1)
Control Field (6 Bit)
- Enthält das IDE-Bit (Identifier Extension Bit) → 0 für Standard-Format (11 Bit), 1 für Extended-Format (29 Bit)
- Enthält 4 Datenlängenbits (DLC), die die Anzahl der Nutzdatenbytes (0 bis 8) angeben
Data Field (0–8 Bytes)
- Enthält die eigentlichen Nutzdaten (0 bis 8 Byte)
CRC Field (16 Bit)
- Enthält die Cyclic Redundancy Check (CRC)-Prüfsumme, die zur Fehlererkennung dient
ACK Field (2 Bit)
- Besteht aus einem ACK-Slot (1 Bit) und einem ACK-Delimiter (1 Bit)
- Ein Empfänger setzt ein dominantes Bit in den ACK-Slot, um eine korrekte Übertragung zu bestätigen
End of Frame (EOF, 7 rezessive Bits)
- Markiert das Ende des Frames
Hier nochmal die Datenübertragung im Detail:
Der Controller Area Network (CAN) ist ein weit verbreitetes Bus-System, das besonders für die zuverlässige Kommunikation zwischen Steuergeräten entwickelt wurde. Es bietet viele Vorteile, aber auch einige Einschränkungen, die je nach Anwendung berücksichtigt werden müssen.
Vorteile von CAN
- Multimaster-fähig: Mehrere Geräte können ohne zentralen Master miteinander kommunizieren.
- Effiziente Busnutzung: Nachrichten mit höherer Priorität werden bevorzugt übertragen (Arbitration).
- Hohe Störsicherheit: Differenzielle Signalübertragung (CAN_H und CAN_L) reduziert elektromagnetische Störungen.
- Fehlertoleranz und automatische Fehlererkennung: Integrierte Mechanismen wie CRC-Prüfung, Bitüberwachung und Fehlerrahmen sorgen für eine hohe Datenintegrität.
- Echtzeitfähig: Schnelle Reaktionszeiten durch priorisierte Nachrichtenübertragung.
- Geringer Verdrahtungsaufwand: Im Vergleich zu Punkt-zu-Punkt-Verbindungen reduziert CAN die Anzahl der benötigten Kabel.
- Weit verbreiteter Industriestandard: Wird in Automobilen, der Industrie, Medizintechnik und Gebäudeautomation eingesetzt.
Nachteile von CAN
- Begrenzte Datenrate: Standard-CAN erreicht maximal 1 Mbit/s, was für sehr schnelle Anwendungen möglicherweise nicht ausreicht.
- Datenpaketgröße begrenzt: Eine CAN-Nachricht kann nur maximal 8 Bytes Nutzdaten enthalten (CAN FD erweitert dies auf bis zu 64 Bytes).
- Komplexere Implementierung als einfache serielle Schnittstellen (z. B. UART): Erfordert spezielle CAN-Controller und Transceiver.
- Begrenzte Anzahl an Teilnehmern: Aufgrund der Buskapazität und Signalreflexionen ist die Anzahl der möglichen Nodes begrenzt.
- Arbitration kann zu Verzögerungen führen: Nachrichten mit niedriger Priorität müssen unter Umständen warten, bis der Bus frei ist.
Fazit
Hier ist eine Tabelle, die die wichtigsten Unterschiede zwischen UART, I²C, SPI und CAN darstellt:




