> For the complete documentation index, see [llms.txt](https://taiphoon-com.gitbook.io/taiphoon.com-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taiphoon-com.gitbook.io/taiphoon.com-docs/de/support/knowledge-base/commication-bus.md).

# Kommunikationsbusse (I2C, SPI)

### Was ist ein Kommunikationsbus? <a href="#undefined" id="undefined"></a>

Ein Kommunikationsbus lässt sich als Satz gemeinsam genutzter Signalleitungen und Kommunikationsregeln verstehen, über den die MCU auf dem Flugcontroller Daten mit Sensoren, Speichern oder anderen Peripheriegeräten austauschen kann.

In Flugcontroller-Systemen haben verschiedene Busse unterschiedliche Rollen. I2C und SPI werden in der Regel auf der Flugcontroller-Platine oder in unmittelbarer Nähe des Flugcontrollers eingesetzt, da sie eher für die Kommunikation auf Platinenebene über kurze bis mittlere Entfernungen gedacht sind und nicht für lange Verbindungen zu externen Peripheriegeräten.

### Warum werden verschiedene Busse benötigt? <a href="#undefined" id="undefined"></a>

Ein Flugcontroller-System muss gleichzeitig schnelle IMUs, Barometer, Magnetometer, Flash, Abstandssensoren und andere Peripheriegeräte bedienen. Daher ist es unmöglich, alle Aufgaben mit nur einem Kommunikationsverfahren zu erledigen.

Die Abwägungen zwischen verschiedenen Bussen betreffen in der Regel einige Aspekte: Geschwindigkeit, Verkabelungsaufwand, Anzahl anschließbarer Geräte, Störfestigkeit und zulässige Leitungslänge.

## I2C <a href="#i2c" id="i2c"></a>

### Was ist I2C? <a href="#i2c" id="i2c"></a>

I2C (Inter-Integrated Circuit) ist ein zweiadriger serieller Bus, über den mehrere Geräte dieselbe Daten- und Taktleitung gemeinsam nutzen können.

Seine Hauptvorteile sind die einfache Verkabelung, die Einsparung von MCU-Pins und die Möglichkeit, mehrere Geräte am selben Bus zu betreiben. Daher eignet er sich gut für die Sensorkommunikation mit niedriger bis mittlerer Geschwindigkeit über kurze Entfernungen.

### Grundlegende I2C-Signale <a href="#i2c" id="i2c"></a>

I2C verwendet grundsätzlich zwei Signalleitungen:

| Signal | Zweck                                                 |
| ------ | ----------------------------------------------------- |
| SCL    | Taktleitung; der Takt wird vom Master bereitgestellt. |
| SDA    | Datenleitung, bidirektional gemeinsam genutzt.        |

In der Praxis benötigt I2C natürlich auch Versorgungs- und Masseleitung, der Kern der Kommunikation besteht jedoch nur aus SCL und SDA.

### Wie I2C Geräte auswählt <a href="#i2c" id="i2c"></a>

I2C ist ein adressierbarer Bus. Jedes Gerät hat eine eigene Adresse, über die der Master bestimmt, mit welchem Gerät er kommuniziert.

Diese Architektur ermöglicht es mehreren Sensoren, dieselben Leitungen zu nutzen. Voraussetzung ist jedoch, dass die Adressen der Geräte am selben Bus nicht kollidieren. Wenn zwei Geräte dieselbe Adresse verwenden und diese nicht geändert werden kann, können sie nicht direkt am selben I2C-Bus betrieben werden.

### Übliche I2C-Geschwindigkeiten <a href="#i2c" id="i2c"></a>

Übliche I2C-Geschwindigkeiten sind **100 kHz** und **400 kHz**, entsprechend dem Standard-Modus und dem Fast-Modus.

Für Flugcontroller-Anwendungen eignen sich diese Geschwindigkeiten für Barometer, Magnetometer, LEDs, manche Entfernungsmesser und andere langsame Sensoren, in der Regel jedoch nicht für den latenzempfindlichen Datenstrom der Haupt-IMU mit hoher Aktualisierungsrate.

### Typische Verwendung von I2C <a href="#i2c" id="i2c"></a>

In Flugcontroller-Systemen wird I2C häufig in folgenden Situationen eingesetzt:

* Barometer oder sekundäres Magnetometer auf der Platine.
* Extern über kurze Entfernung angeschlossener Kompass, LEDs oder manche Entfernungsmesser.
* Manche langsamen Sensoren, die nur eine I2C-Schnittstelle bieten.

Die PX4-Dokumentation weist ausdrücklich darauf hin, dass I2C für kurze Verbindungen auf der Platine oder in unmittelbarer Nähe geeignet ist und häufig zum Anschluss von Peripheriegeräten wie compass, rangefinder und LEDs verwendet wird.

### Einschränkungen von I2C <a href="#i2c" id="i2c"></a>

Obwohl I2C einfach zu verkabeln ist, eignet es sich nicht für lange Strecken, starke Störungen oder hohe Bandbreiten.

In einer Drohnenumgebung wird I2C ab etwa 10 bis 15 Zentimetern aufgrund der Leitungskapazität und von Störungen leicht unzuverlässig. Daher wird für weiter entfernte externe Module in der Regel nicht empfohlen, weiterhin I2C zu verwenden.

### Pull-up-Widerstände <a href="#pull-up" id="pull-up"></a>

SDA und SCL von I2C müssen über Pull-up-Widerstände auf 3.3V gezogen werden, damit der Bus ordnungsgemäß funktioniert.

Viele Flugcontroller-Platinen stellen diese Pull-ups bereits auf der Platine bereit. Wenn sich jedoch die Schaltung eines externen Geräts oder einer Adapterplatine unterscheidet, sollten Sie prüfen, ob doppelte Pull-ups vorhanden sind, Pull-ups fehlen oder die Spannungspegel inkompatibel sind.

### I2C-Bus-Blockade <a href="#i2c" id="i2c"></a>

Ein typisches I2C-Problem besteht darin, dass ein Gerät aufgrund von Störungen, Firmwarefehlern oder einer unterbrochenen Übertragung SDA dauerhaft auf Low zieht, sodass der gesamte Bus nicht mehr normal funktioniert.

Dieser Zustand wird häufig als bus lockup bezeichnet. Tritt er auf, ist in der Regel nicht nur ein einzelnes Gerät betroffen, sondern auch alle anderen Geräte am selben I2C-Bus können ausfallen. In vielen Fällen ist ein erneutes Einschalten erforderlich, um den Bus wiederherzustellen.

### Warum I2C für die Haupt-IMU nicht empfohlen wird <a href="#imu--i2c" id="imu--i2c"></a>

Gemäß der Empfehlung der PX4-Dokumentation sollte die IMU nicht über I2C angeschlossen werden, da die Geschwindigkeit von I2C nicht ausreicht, um hochfrequente Erfassung und Aufgaben wie die Vibrationsfilterung zu unterstützen, die große Mengen an Echtzeitdaten benötigen.

Außerdem sinkt die Leistung weiter, je mehr Geräte sich am selben I2C-Bus befinden. Daher wird für die für die Lageregelung wichtigste Haupt-IMU in der Regel das schnellere und stabilere SPI verwendet.

## SPI <a href="#spi" id="spi"></a>

### Was ist SPI? <a href="#spi" id="spi"></a>

SPI (Serial Peripheral Interface) ist ein schneller serieller Bus, der separate Sende-, Empfangs- und Taktleitungen verwendet und über eine Chip-Select-Leitung bestimmt, mit welchem Gerät gerade kommuniziert wird.

Im Vergleich zu I2C benötigt SPI mehr Leitungen, bietet dafür aber höhere Geschwindigkeit, geringere Latenz und eine stabilere Datenübertragung auf der Platine. Daher wird es häufig für die Haupt-IMU, Flash und andere schnelle Geräte verwendet.

### Grundlegende SPI-Signale <a href="#spi" id="spi"></a>

Die häufigsten SPI-Signale sind:

| Signal | Zweck                                             |
| ------ | ------------------------------------------------- |
| SCLK   | Taktleitung, vom Master bereitgestellt.           |
| MOSI   | Ausgang des Masters, Eingang des Geräts.          |
| MISO   | Ausgang des Geräts, Eingang des Masters.          |
| CS     | Chip-Select-Leitung, in der Regel eine pro Gerät. |

Einer der größten Unterschiede zu I2C besteht darin, dass SPI kein Konzept von Geräteadressen hat; das zu aktivierende Peripheriegerät wird über die CS-Leitung bestimmt.

### Geschwindigkeit und Vollduplex-Eigenschaft von SPI <a href="#spi" id="spi"></a>

Übliche SPI-Geschwindigkeiten liegen bei etwa **1 bis 10 MHz**, manche Geräte unterstützen auch höhere Geschwindigkeiten.

Außerdem ist SPI eine **Vollduplex**-Kommunikation: Während der Master Daten an das Gerät sendet, kann er gleichzeitig die vom Gerät zurückgesendeten Daten empfangen. Das ist besonders für hochfrequente Sensoren und den Echtzeit-Datenaustausch von Vorteil.

### Typische Verwendung von SPI <a href="#spi" id="spi"></a>

In Flugcontroller-Systemen wird SPI am häufigsten verwendet für:

* Haupt-IMU (Beschleunigungssensor, Gyroskop).
* Schnelle Sensoren auf der Platine.
* Externen oder On-Board-Flash-Speicher.
* Manche Peripheriegeräte, die eine höhere Abtastrate oder geringere Latenz benötigen.

### Einschränkungen von SPI <a href="#spi" id="spi"></a>

Die Haupteinschränkung von SPI ist nicht die Geschwindigkeit, sondern der Verkabelungsaufwand bei der Erweiterung und die Entfernung.

Denn für jedes zusätzliche SPI-Gerät wird in der Regel eine weitere separate CS-Leitung benötigt. Außerdem ist SPI nicht für die Übertragung über lange Leitungen ausgelegt und eignet sich in der Regel nur für Verbindungen auf der Platine oder über sehr kurze Entfernungen. Es ist nicht geeignet, schnelles SPI bis an entfernte Stellen des Fluggeräts zu führen, um externe Module anzuschließen.

### Warum SPI für die Haupt-IMU geeignet ist <a href="#spi--imu" id="spi--imu"></a>

Die Haupt-IMU benötigt eine hochfrequente, latenzarme und stabile Datenübertragung, um Lageschätzung, Regelkreis und Vibrationsverarbeitung zu unterstützen.

Im Vergleich zu I2C bietet SPI einen höheren Takt, weniger Konflikte durch gemeinsame Busnutzung und eine bessere Echtzeitfähigkeit. Daher wird die Haupt-IMU bei den meisten modernen Flugcontrollern über SPI und nicht über I2C angebunden.

### Vergleich von I2C und SPI <a href="#i2c--spi" id="i2c--spi"></a>

### Grundlegende Unterschiede <a href="#undefined" id="undefined"></a>

I2C und SPI kommen beide häufig auf Flugcontroller-Platinen vor, haben aber unterschiedliche Einsatzzwecke.

| Merkmal                  | I2C                                                            | SPI                                                                             |
| ------------------------ | -------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| Anzahl der Leitungen     | 2 zentrale Signalleitungen: SCL, SDA.                          | 3 gemeinsame Leitungen plus 1 CS-Leitung pro Gerät.                             |
| Geräteauswahl            | Adresse.                                                       | Chip-Select-Leitung CS.                                                         |
| Typische Geschwindigkeit | 100 kHz, 400 kHz.                                              | 1–10 MHz                                                                        |
| Erweiterbarkeit          | Mehrere Geräte teilen sich zwei Leitungen, leicht erweiterbar. | Für jedes zusätzliche Gerät wird in der Regel eine weitere CS-Leitung benötigt. |
| Geeignete Entfernung     | Sehr kurz, auf der Platine oder in unmittelbarer Nähe.         | Auf der Platine oder über sehr kurze Entfernungen.                              |
| Typische Verwendung      | Barometer, Magnetometer, Entfernungsmesser, LEDs.              | Haupt-IMU, Flash, schnelle Sensoren.                                            |

### Wie Sie wählen <a href="#undefined" id="undefined"></a>

Wenn die Anforderungen **einfache Verkabelung, viele Geräte und geringe Datenmengen** sind, ist I2C in der Regel besser geeignet.

Wenn die Anforderungen **hohe Geschwindigkeit, geringe Latenz und hohe Aktualisierungsrate** sind, insbesondere im Zusammenhang mit der Haupt-IMU oder schnellem Speicher, ist SPI in der Regel die bessere Wahl.

## Beziehung zu anderen Bussen <a href="#undefined" id="undefined"></a>

### Warum externe Peripheriegeräte häufig stattdessen CAN oder UART verwenden <a href="#can--uart" id="can--uart"></a>

I2C und SPI sind zwar wichtig, werden aber meist auf der Platine oder über kurze Entfernungen eingesetzt.

Wenn Sensoren weiter vom Flugcontroller entfernt sind oder in der Systemumgebung stärkere elektromagnetische Störungen herrschen, werden für externe Peripheriegeräte häufiger UART oder CAN verwendet; dabei hat CAN hinsichtlich Störfestigkeit und Zuverlässigkeit über lange Strecken in der Regel Vorteile.

### Häufige Probleme <a href="#undefined" id="undefined"></a>

### Häufige I2C-Probleme <a href="#i2c" id="i2c"></a>

Typische I2C-Probleme sind:

* Adresskonflikt: Zwei Geräte verwenden dieselbe Adresse.
* Fehlende oder doppelte Pull-up-Widerstände.
* Zu lange Kabel, wodurch die Signalqualität sinkt.
* Ein Gerät blockiert den Bus, sodass der gesamte bus nicht mehr funktioniert.

### Häufige SPI-Probleme <a href="#spi" id="spi"></a>

Typische SPI-Probleme sind:

* CS-Leitung falsch angeschlossen oder schwebend, sodass das Gerät nicht korrekt ausgewählt wird.
* Falsche Zuordnung von MOSI, MISO, SCLK.
* SPI wird über zu lange externe Leitungen geführt, wodurch die Signalqualität sinkt.
* Wenn sich mehrere Geräte Leitungen teilen, führt eine fehlerhafte Chip-Select-Steuerung zu Datenkonflikten.

### Empfohlene Reihenfolge der Fehlersuche <a href="#undefined" id="undefined"></a>

Wenn ein I2C- oder SPI-Peripheriegerät nicht ordnungsgemäß funktioniert, wird empfohlen, in folgender Reihenfolge zu prüfen:

1. Stellen Sie sicher, dass die Bezeichnungen der Signalleitungen und die physische Verkabelung korrekt zugeordnet sind.
2. Stellen Sie sicher, dass Spannungspegel und Stromversorgung in Ordnung sind.
3. Prüfen Sie bei I2C die Geräteadresse und die Pull-up-Widerstände.
4. Prüfen Sie bei SPI, ob die CS-Leitung richtig angeschlossen ist und vom richtigen Pin gesteuert wird.
5. Stellen Sie sicher, dass die Flugcontroller-Firmware das entsprechende Gerät und den entsprechenden Bus unterstützt.
6. Beobachten Sie bei Bedarf mit einem Logikanalysator die tatsächlichen Signalverläufe und Pakete von SCL/SDA bzw. SCLK/MOSI/MISO/CS.

### Hinweise <a href="#undefined" id="undefined"></a>

**Hinweis:** Weder I2C noch SPI sind für lange externe Verkabelung ausgelegt. Wenn ein Modul weiter vom Flugcontroller entfernt sein muss, sollten Sie zunächst neu bewerten, ob eine besser geeignete Schnittstelle verwendet werden sollte.

**Hinweis:** Gehen Sie nicht einfach davon aus, dass die beiden Modi beliebig austauschbar sind, nur weil ein Sensor sowohl I2C als auch SPI unterstützt; entscheidend ist, ob die Flugcontroller-Platine den entsprechenden Bus nach außen führt und die Firmware ihn unterstützt.

**Hinweis:** Die Haupt-IMU steht in engem Zusammenhang mit der Lageregelung und sollte in der Regel vorrangig über SPI angebunden werden; es wird nicht empfohlen, I2C als Hauptquelle für die Lageerfassung zu verwenden.
