ESP8266 Teil 4: Die SPI-Schnittstelle des ESP8266

© David Benes, 123RF

Immer der Reihe nach

Mittels SPI binden Sie schnell weitere Komponenten an einen ESP8266. Vorteile beim Verkabeln gehen aber unter Umständen durch komplexe Programmierung verloren.

Die GPIO des ESP8266 ist eine außerordentlich flexible Schnittstelle, aber keineswegs seine einzige. Auch über das SPI-Interface können Sie interessante Halbleiter ansteuern, unter anderem viele Displays. Um die Schnittstelle optimal zu nutzen, müssen Sie sich vorab mit deren Funktionsweise vertraut machen. Dabei hilft eine einfache Ausgabe über normale TTL-Schieberegister. Der Betrieb eines A/D-Wandlers über den SPI-Bus gerät da schon etwas komplexer.

SPI-Schnittstelle

Das Kürzel SPI steht für Serial Peripheral Interface. Wie der Name schon erkennen lässt, laufen die Daten seriell über den Bus. SPI stammt ursprünglich aus den Labors von Motorola. Da der Bus komplett frei von Lizenzen und Patenten ist, nutzen viele Halbleiterhersteller die Technik für ihre Bausteine.

Die Übertragung erfolgt synchron, sodass die Teilnehmer eine Leitung für das Taktsignal (SCLK) benötigen. Beim SPI-Bus steuert der Busmaster komplett die Kommunikation. Um den Teilnehmern zu signalisieren, dass Sie die auf dem Bus befindlichen Daten übernehmen dürfen, gibt es eine weitere Steuerleitung (CS). Die eigentlichen Daten laufen über zwei weitere Leitungen (MOSI, MISO). Die Tabelle "SPI-Bus" zeigt die nötigen Kanäle im Überblick.

SPI-Bus

Abkürzung

Bedeutung

SCLK

Serial Clock

MOSI

Master Output, Slave Input

MISO

Master Input, Slave Output

CS

Chip Select

SPI arbeitet prinzipiell wie ein Schieberegister, sodass man theoretisch beliebig viele Teilnehmer an den Bus hängen könnte. Es gibt keine Adressen, wie Sie sie unter Umständen von anderen Bussystemen her kennen. Einzig und alleine die Position des einzelnen Halbleiters ist entscheidend.

Dieses Prinzip setzt voraus, dass der Busmaster die Topologie des kompletten Busses genau kennt, da er sonst nicht in der Lage ist, die Daten nicht an die richtigen Positionen zu schieben. Sie dürfen daher die Reihenfolge der Teilnehmer nicht einfach verändern – das hätte Auswirkungen auf das Programm im Busmaster. Der Master schiebt die Daten so lange durch alle Teilnehmer hindurch, bis sie an der richtigen Position ankommen.

Der SPI-Bus kennt zwei Betriebsarten, das Kaskadieren der Halbleiter ("Daisy Chain") und die Sternstruktur. Beim Kaskadieren, der häufigsten Form von SPI-Bussen, hängen alle Teilnehmer hintereinander. Sie schließen also die Ausgangsleitung des einen Halbleiters an den Eingang des nächsten an. Der Ausgang des letzten Halbleiters in der Kette kommt wieder an den Eingang des Busmasters. Die CS-Leitung schließen Sie an alle Teilnehmer parallel an.

Bei der Sternstruktur schalten Sie die zwei Datenleitungen (MOSI/MISO) der einzelnen Halbleiter parallel. Dabei steuern Sie über mehrere CS-Leitungen, welcher Halbleiter zum Einsatz kommt. Diese Art der Implementation kann schon bei wenigen Bauteilen alle Vorteile eines seriellen Bussystems komplett zunichte machen.

Das serielle Übertragen soll ja eigentlich die Zahl der Leitungen zwischen den unterschiedlichen Halbleitern minimieren, um das Layout simpel und kompakt zu halten und Platz auf den Platinen einzusparen. Viele CS-Leitungen bewirken exakt das Gegenteil. Zudem muss der Busmaster all diese zusätzlichen Steuerleitungen bereitstellen, was beim ESP8266 schnell zum Problem gerät: Er besitzt nur wenige I/O-Anschlüsse.

Um die Funktion des Busses zu verstehen, lohnt es sich, die Unterschiede zwischen I2C- und SPI-Bus zu kennen: So erhalten Sie ein besseres Gefühl dafür, welche der zwei Schnittstellen sich für ein bestimmtes Szenario besser eignet. Dazu haben wir im Kasten "SPI vs. I2C") die wichtigsten Unterschiede zusammengestellt.

SPI vs. I<+>2<+>C

Da der Rechner beim SPI-Bus keine Adressdaten übertragen muss, erzielt er bei gleicher Taktfrequenz einen mindestens doppelt so hohen Durchsatz wie über den I2C-Bus. Geht es aber darum, einzelne Sensoren an einem langen Bus auszulesen, spielt I2C seine Vorteile aus: Damit lesen Sie gezielt die Informationen von einem einzelnen Teilnehmer aus oder schreiben Daten dorthin.

Der SPI-Bus müsste dagegen im Daisy-Chain-Betrieb einmal alle Teilnehmer auslesen und (im schlechtesten Fall) alle wieder beschreiben, um an einen Messwert zu gelangen. SPI kommt daher in der Regel bei Displays zum Einsatz, wo der Rechner viele Daten hintereinander schreibt und das Auslesen oder Schreiben einzelner Daten-Bytes eher selten bis gar nicht vorkommt.

Den I2C Bus verwenden Sie dagegen bei Anwendungen, bei denen der PC unregelmäßig Daten von einzelnen Teilnehmern liest oder an diese schreibt. Auch bei Änderungen der Topologie ist I2C im Vorteil. Solche kommen unter Umständen schneller vor als gedacht.

Denken Sie etwa an ein einfaches Gerät der Unterhaltungselektronik, das es in mehreren Versionen am Markt gibt: Je nach Version sind auf der sonst identischen Basisplatine bestimmte Halbleiter bestückt oder auch nicht – schon liegen unterschiedliche Topologien vor. Für den SPI-Bus müsste das Unternehmen für jede Variante eine passende Software bereithalten. Mit dem I2C-Bus wäre ein Programm in der Lage, alle Versionen zu unterstützen.

Schieberegister

Der im Folgenden beschriebene Testaufbau orientiert sich an jenem aus den letzten Teilen unseres ESP8266-Workshops. Die Spannungsversorgung und den Adapter, der USB auf die serielle Schnittstelle umsetzt, kennen Sie schon von dort. Auch die Arduino-IDE tritt wieder in Aktion. Einzig die SPI-Schnittstelle schließen wir neu an den ESP8266 an.

Für einen ersten Test kommen einfache TTL-Schieberegister (SN74HC595, siehe gleichnamiger Kasten) zum Einsatz. Der SPI-Bus ist ein langes Schieberegister. Der erste Aufbau ermöglicht es, ein Byte auf den Bus zu schreiben (Abbildung 1). Im um einen zusätzlichen SN74HC595 erweiterten Aufbau (Abbildung 2) sehen Sie, wie das Datenbyte durch den ersten Chip hindurch in den zweiten wandert (Abbildung 3).

Abbildung 1: Am ESP8266 ist lediglich ein Schieberegister angeschlossen.
Abbildung 2: Zwei Schieberegister am ESP8266 eröffnen die Möglichkeit, den Fluss der Daten zu verfolgen.
Abbildung 3: Der Testaufbau mit zwei Schieberegistern in der Realität.

SN74HTC595

Beim SN74HC595 handelt es sich um ein einfaches 8-Bit-Schieberegister. Die Daten laufen also seriell in das Register hinein, danach gibt es die Daten parallel wieder aus. Die Betriebsspannung des Halbleiters beträgt 2 bis 6 Volt, er hat einen sehr geringen Eigenstromverbrauch von nur wenigen Mikroampere. Der Strom pro Ausgang beträgt ±6 mA, was für einfache Leuchtdioden vollkommen ausreicht. Abbildung 4 zeigt die Pinbelegung des Registers, weitere Informationen liefert das Datenblatt [1].

Abbildung 4: Die Pinbelegung des SN74HC595.

Damit nun Leben in den Aufbau aus Abbildung 1 kommt, braucht es noch die passende Software. Das Programm aus Listing 1 sorgt dafür, dass alle acht LEDs im Sekundentakt blinken. Hierbei fällt auf, dass man die CS-Leitung komplett manuell steuern muss.

Listing 1

 

#include <SPI.h>
void setup() {
  SPI.begin();
  pinMode(15, OUTPUT);
  }
void loop() {
  digitalWrite(15, LOW);
  SPI.transfer(0x00);
  digitalWrite(15, HIGH);
  delay(1000);
  digitalWrite(15, LOW);
  SPI.transfer(0xff);
  digitalWrite(15, HIGH);
  delay(1000);
}

Der Grund dafür: Die Methode SPI.transfer() weiß nicht, wann ein Transfer abgeschlossen ist, denn sie hat keine Informationen über die Länge des Busses. Sie schiebt immer nur ein Byte dorthin. Falls sich der SPI-Bus im Sternbetrieb befindet, kann eine allgemeine Bibliothek unmöglich wissen, welche CS-Leitung sie verwenden soll, um eine konkrete Schreiboperation auszuführen.

Erweitern Sie nun den Aufbau gemäß Abbildung 2 um ein zweites Schieberegister, und starten Sie das Programm erneut. Die ersten acht LEDs blinken immer noch im Sekundentakt – aber die letzten acht tun das ebenfalls, und das immer schön abwechselnd. Das liegt daran, dass der zweite SN74HC595 dieselben Daten bekommt wie der erste, einfach nur um einen Schreibzyklus versetzt.

Damit die ersten acht LEDs wieder wie vorher blinken, fügen Sie ein weiteres Datenbyte mit Nullen in den Datentransfer mit ein, und zwar vor den ersten acht Bit (Listing 2). Damit haben Sie nun eine Idee davon, wie der SPI-Bus arbeitet. Unter Umständen gestaltet sich die Aufgabe etwas knifflig, die Daten-Bytes an die richtigen Stellen im Bus zu schieben. Listing 3 zeigt aber, dass selbst komplizierte Programme möglich sind.

Listing 2

 

#include <SPI.h>
void setup() {
  SPI.begin();
  pinMode(15, OUTPUT);
  }
void loop() {
  digitalWrite(15, LOW);
  SPI.transfer(0x00);
  SPI.transfer(0x00);
  digitalWrite(15, HIGH);
  delay(1000);
  digitalWrite(15, LOW);
  SPI.transfer(0x00);
  SPI.transfer(0xff);
  digitalWrite(15, HIGH);
  delay(1000);
}

Listing 3

 

#include <SPI.h>
int ll,dir;
void setup() {
  SPI.begin();
  pinMode(15, OUTPUT);
  ll=1;
  dir=0;
  }
void transfer(int data) {
  digitalWrite(15, LOW);
  SPI.transfer((data>>8)&0xFF);
  SPI.transfer(data & 0xFF);
  digitalWrite(15, HIGH);
}
void loop() {
  if (dir==0)
  { ll = ll << 1;
  if (ll==(1<<15)){dir=1;}}
  else
  { ll = ll >> 1;
  if (ll==1){dir=0;}
  }
  transfer(ll);
  delay(100);
}

Prinzipiell ist es sinnvoll, die kompletten Daten, die Sie auf den Bus schreiben wollen, in einer Struktur im RAM zu halten: Diese lässt sich einfacher manipulieren. Nach Änderungen an dieser Struktur schieben Sie die Daten in einem Rutsch aus dem ESP8266 hinaus. Bei der im Beispiel verwendeten Datenstruktur handelt es sich zwar nur um ein int, also einen Integer-Wert, aber zu Anschauungszwecken genügt das.

Sie schieben das einzelne Bit in der Variablen ll hin und her. Nachdem das Programm die Operation beendet hat, schreibt die Methode transfer() die Information byteweise auf den Bus. Die lokale Methode transfer() arbeitet dabei in einem komplett anderen Namensraum als SPI.transfer() aus der Bibliothek, was Überlagerungen ausschließt.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

08/2018
Projekte & Hacks

Diese Ausgabe als PDF kaufen

Preis € 7,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Fernverkehr

    Zwar wurde I2C eigentlich für die interne Gerätekommunikation konzipiert, doch mithilfe geeigneter Extender-Bausteine überbrückt der Bus Distanzen bis zu 100 Metern.

  • Neues auf der Heft-DVD

    Nur mit dem optimalen System und der richtigen Software nutzen Sie das volle Potenzial eines Mini-PC. Mit der Heft-DVD erhalten Sie nicht nur die neusten Distributionen für den RasPi und Co., sondern gleichzeitig auch die passenden Programme zu den Artikeln.

  • Farbenspiele

    Der winzige Sensorbaustein APDS-9960 vereint vier unterschiedliche Anwendungsfälle in einem Chip.

  • Finger weg!

    Mit einem Read-only-Dateisystem schützen Sie die SD-Karte vor dem Altern durch Schreibvorgänge. Beim Aufsetzen gilt es, einige wichtige Punkte zu beachten.

  • Auf Zuruf

    Mit dem bereits Anfang 2017 angekündigten und jetzt endlich verfügbaren Voice offeriert Matrix Labs eine neue Erweiterung, die den Raspberry Pi fit für Sprachsteuerung machen soll.

  • Experimentell

    Wer elektronische Schaltungen entwirft, experimentiert oft erst einmal mit einem Breadboard. Genau für diese Bastler bietet sich der NanoPi-Duo als Steuerrechner an.

  • Aufgemöbelt

    Mit dem Desktop-Kit von Farnell gibt der RasPi auch auf dem Schreibtisch technisch und optisch eine gute Figur ab.

  • PiBot

    Aus einem Fischertechnik-Baukasten lässt sich schon mit wenigen Teilen ein Roboter aufbauen. Fehlt nur noch ein Gehirn: Das stellt der Raspberry Pi.

  • Heißkalt serviert

    Wie verwandelt sich ein Linux-System auf einem RasPi in einen Datenlogger? Indem es mit einem Bluetooth-fähigen Multimeter spricht.

  • Türwächter

    Der RasPi beteiligt sich am Internet der Dinge und wacht als smartes Schließsystem autonom über den Zugang zum Eigentum.