SPI mit Arduino

Für die Arduino-Plattform verwendet man am besten die Arduino SPI library. Diese nutzt den in allen Arduino-Modellen vorhandenen SPI Hardware-Controller. Hierbei sind die Pins für die SPI-Signale wie folgt festgelegt:

TODO

Alternativ gibt es auch die Möglichkeit über shiftIn() und shiftOut() mit beliebigen IO-Pins zu arbeiten. Da dies aber alles rein auf Software basiert, ist diese Variante deutlich langsamer und belegt zusätzliche Ressourcen des Chips.

Selbst um CS kümmern

Beim Arduino Uno, Nano muss man sich noch selbst um die Steuerung der Slave-Select (SS) Signale kümmern.

SPI-Parameter einstellen

Mit dem Befehl SPISettings():

SPISettings mySettting(speedMaximum, dataOrder, dataMode);

oder direkt

SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0));
  • speedMaximum = Integer in Hz
  • dataOrder = MSBFIRST (default) oder LSBFIRST
  • dataMode = SPI_MODE0 (default) oder SPI_MODE1, SPI_MODE2, SPI_MODE3
Schnittstelle initialisieren
SPI.begin();

Der Befehl SPI.begin() initialisiert den SPI Bus indem die Pins für SCK, MOSI und SS als Ausgänge und MISO als Eingang konfiguriert. Zudem wird der Ausgangszustand für SCK und MOSI auf LOW, der für SS auf HIGH gesetzt.

Geschwindigkeit einstellen

Mit dem Befehl setClockDivider() wird ein Teiler eingestellt. Er gibt an, durch wieviel der Arduino-Prozessortakt geteilt wird um den SCK zu erzeugen. Gültige Teiler sind:

2, 4, 8, 16, 32, 64, 128

Für jeden dieser Werte ist eine „sprechende“ Konstante definiert:

SPI_CLOCK_DIV2, SPI_CLOCK_DIV4, ..., SPI_CLOCK_DIV128

Auf Uno und Nano ist der Defaultwert ist 4 ((Konstante SPI_CLOCK_DIV4). Beim Due ist er 21, welches einem Takt von 4 MHz entspricht.

Interrupts verwenden
SPI.usingInterrupt();
Transaktionen durchführen

Unter einer Transaktion versteht man die Kommunikation mit einem bestimmten SPI-Slave. Dabei tauscht nur dieser mit dem Master Daten aus.

SPI.beginTransaction();
...
SPI.endTransaction();

Beispiel einer SPI-Transaktion