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) oderLSBFIRST
- dataMode =
SPI_MODE0
(default) oderSPI_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();