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

12/2018
Coole Projekte

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Bytes und Beats

    In Sonic Pi können Sie mit wenigen Codezeilen Klänge manipulieren, Beats zusammenstellen und ganze Songs komponieren.

  • Klein, aber fein

  • Trick or treat

    Das traditionelle RPG-Gruselkabinett glänzt dieses Jahr mit einer innovativen Umsetzung mittels Pneumatik und Elektropneumatik sowie ST-Programmierung.

  • Unter Kontrolle

    Traditionell stellen wir alljährlich ein selbst gebautes Halloween-Gespenst vor. Die pneumatischen und elektronischen Grundlagen erklärt dieser Artikel.

  • Go Pi Go!

    Der Bausatz GoPiGo3 liefert Bauteile und Software für ein kleines Roboterauto. Zusammen mit einem RasPi als Gehirn programmieren Sie den Roboter per Mausklick.

  • Handlicher Helfer

    Während die Folien der Präsentation durchlaufen, liefert ein kleiner Dokumentenserver auf Basis des GL-AR300M-ext zusätzliche Informationen aus.

  • Wiederverwertet

    Mithilfe eines einfachen Python-Programms recyceln Sie ein ausgedientes Smartphone als drahtlos angebundenes RasPi-Display.

  • Herzenssache

    Steigt beim Krimi der Herzschlag bedrohlich an? Mit einem Pulsmesser in Eigenbau ermitteln Sie einfach und kostengünstig, ob der Herzschlag noch in verträglichen Bereichen liegt.

  • Fernbedient

    Mit der Fernbedienung den RasPi steuern. In der Theorie möglich, in der Praxis oft beschwerlich. Die Libcec liefert praktische Tools zur Fehlersuche.

  • Musikwürfel

    Mit Musikcube machen Sie Ihre eigene Sammlung fit fürs Streamen. Der terminalbasierte Audioplayer lässt sich Fernsteuern und bietet eine App für Android-Smartphones.