Aus Raspberry Pi Geek 09/2024

MicroPython (Teil 4): Unterstützung für I2C, SPI und UART

© Dmytro Masyukevych / 123RF.com

Hallo, hallo!

Martin Mohr

Für die Kommunikation zwischen Mikrocontrollern und ihrer Peripherie gibt es definierte Schnittstellen. Deren wichtigste Vertreter sind I2C, SPI und UART.

Allgemein betrachtet, stecken hinter Schnittstellen definierte Verbindungen zwischen unterschiedlichen Geräten. In der Softwaretechnik spricht man ebenfalls von Schnittstellen, wenn es darum geht, die Kommunikation zwischen Programmen herzustellen. In der Welt der Mikrocontroller sieht die Lage etwas anders aus: Dort liegt der Fokus darauf, Daten zwischen der MCU und der umgebenden Hardware auszutauschen. Der Großteil der Mikrocontroller unterstützt die drei Schnittstellen I2C, SPI und UART.

I-two-C

Das Kürzel I2C (ausgesprochen I-Quadrat-C oder englisch I-two-C) steht für Inter-Integrated Circuit. Dabei handelt es sich um einen seriellen Datenbus für die Kommunikation über kurze Distanzen (innerhalb von Geräten). Die Datenübertragung erfolgt synchron über zwei Leitungen: eine Datenleitung (SDA) und eine Taktleitung (SCL).

Alle I2C-Bausteine verfügen busseitig über Open-Collector-Ausgänge und müssen daher extern mit Pullup-Widerständen beschaltet werden, um eine Datenübertragung zu ermöglichen. Oft finden sich die Widerstände bereits auf Developer-Boards und müssen nicht extra in die Schaltung aufgenommen werden. Der I2C-Bus nutzt ein Master-Slave-Verfahren zur Kommunikation. Dabei initiiert stets der Master die Kommunikation, die Slaves antworten. Der Bus verfügt über einen 7-Bit-Adressbereich, das entspricht 128 Teilnehmern. Dabei sind 16 Adressen reserviert, also bleiben netto 112 freie Adressen.

Die Adressen bestehen oft aus einem festen und einem von den Clients frei wählbaren Teil. Informationen dazu können Sie üblicherweise im Datenblatt des Bausteins nachlesen. Die Daten werden byte- oder wortweise übertragen. Die Übertragungsgeschwindigkeit beträgt zwischen 100 kbit/s (bidirektional, Standard Mode) und 5 Mbit/s (unidirektional, Ultra Fast Mode).

SPI

SPI ist die englische Abkürzung für Serial Peripheral Interface. Hier steuert ausschließlich der Busmaster die Kommunikation. Die Übertragung der Daten läuft seriell und taktsynchron ab. Das Taktsignal (SCLK) fließt über eine dafür vorgesehene Leitung. Zum Übertragen der Daten finden die zwei Leitungen MOSI (Master Output, Slave Input) und MISO (Master Input, Slave Output) Verwendung. Über eine weitere Steuerleitung (CS) informiert der Busmaster die Teilnehmer, dass sie die Daten übernehmen können.

Der SPI-Bus arbeitet prinzipiell wie ein Schieberegister. Theoretisch lassen sich beliebig viele Teilnehmer an den Bus anhängen, es gibt auch keine Adressen wie bei anderen Bussystemen. Einzig und allein die Position der einzelnen Halbleiter am Bus entscheidet. Der Preis dieser Einfachheit: Der Busmaster muss die Topologie für den gesamten Bus genau kennen, da er sonst die Daten nicht an die richtigen Positionen befördern kann. Dadurch lässt sich die Reihenfolge der Busteilnehmer nicht verändern, ohne dass sich das auf das Programm im Busmaster auswirkt. Der Busmaster muss die Daten grundsätzlich so lange durch sämtliche Busteilnehmer hindurchschieben, bis sie an der richtigen Position ankommen.

UART

UARTs (Universal Asynchronous Receiver Transmitter) dienen dazu, eine asynchrone serielle Datenübertragung zu implementieren. Asynchron bedeutet dabei, dass es keine gesonderte Leitung zum Übertragen eines Taktsignals gibt. Je nachdem, welche Leitungstreiber und Protokolle zum Einsatz kommen, bauen Sie mit einem UART entweder einen Bus (RS485) oder eine Punkt-zu-Punkt-Verbindung (RS232) auf. Obwohl USB die UARTs weitestgehend abgelöst hat, gibt es im industriellen Bereich immer noch viele Geräte, die auf diese Schnittstellen zurückgreifen. Aus eben diesem Grund haben Mikrocontroller häufig mehrere UARTs verbaut.

Ein Start-Bit leitet die Datenübertragung ein, danach folgen sieben oder acht Daten-Bits, gefolgt von einem Parity Bit. Ein oder zwei Stopp-Bits markieren das Ende. Das Parity Bit dient dazu, Fehler bei der Datenübertragung zu erkennen. Da es bei der asynchronen Datenübertragung kein Taktsignal gibt, müssen alle Teilnehmer bei der Datenübertragung dieselben Parameter verwenden. Zusätzlich synchronisieren die Start- und Stopp-Bits die Datenübertragung.

Die Datenübertragungsrate hängt bei diesem Vorgehen vom genutzten Übertragungsmedium und der Elektronik ab und liegt zwischen wenigen Bit pro Sekunde und bis zu mehreren Mbit/s. Je nach Geschwindigkeit und Technik kann die Reichweite mehrere hundert Meter betragen.

Testaufbau

Für den Testaufbau wählen Sie als Mikrocontroller am besten den Raspberry Pi Pico [1]. Er verfügt über je zwei I2C-, SPI- und UART-Schnittstellen.

Für den Test des I2C-Interfaces verwenden Sie den Sensor BME680 [2] zum Überwachen von Temperatur, Luftfeuchte, Luftdruck und Luftqualität. Wie dessen Datenblatt [3] verrät, arbeitet der vom Hersteller kalibrierte Sensor hochpräzise. Die Informationen zur Kalibrierung sind auf dem Chip selbst abgelegt. Daher gestaltet es sich etwas schwierig, die Messwerte auszulesen und exakt anhand der Kalibrierungsdaten zu berechnen. An der Stelle sparen Sie sich schlauerweise etwas Arbeit und nutzen eine Bibliothek [4], die Ihnen die Aufgabe abnimmt. Die I2C-Adresse des BME680 lässt sich über den SDO-Pin bestimmen. Liegt der Pin auf GND, lautet die Adresse 0x76; verbinden Sie ihn mit VCC, ändert sich die Adresse auf 0x77.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben