SPI Arduino

Einführung

Serial Peripheral Interface (SPI) ist ein synchrones serielles Kommunikationsprotokoll, das häufig in Mikrocontrollern und eingebetteten Systemen verwendet wird. Auf Arduino-Boards ermöglicht SPI eine schnelle und effiziente Kommunikation mit verschiedenen externen Geräten wie Sensoren, Speicher und drahtlosen Kommunikationsmodulen. Dieses Protokoll wird für seine Einfachheit, Geschwindigkeit und Flexibilität geschätzt.

So funktioniert die Verbindung

Die SPI-Verbindung ist synchron, d. h. die Übertragung benötigt den vorgegebenen Takt vor der Übertragung.

Es handelt sich um eine Vollduplex-Verbindung, d. h. Sie können Ihre Sendungen während der Bitübertragung abhören.

Die Verbindung ist nicht exklusiv; die Schaltkreise kommunizieren nach einem Master-Slave-Prinzip, wobei der Master die volle Verantwortung für die Kommunikation übernimmt. Mehrere Slaves können am selben Bus koexistieren; in diesem Fall wird das Ziel über eine dedizierte Leitung zwischen Master und Slave, die sogenannte Chip-Select-Leitung, ausgewählt, wie im folgenden Diagramm zu sehen ist:

SPI verfügt über die Leitungen „MOSI“ (Master Output/Slave Input), die vom Master generiert werden, „MISO“ (Master Input/Slave Output), die vom Slave generiert werden, und eine Taktleitung (SCK: SPI Serial Clock).

Diese drei Leitungen sind mit den entsprechenden Leitungen eines oder mehrerer Slaves verbunden. Slaves werden durch das Signal auf ihrer CS-Leitung (Chip Select) identifiziert.

SPI-Pin auf der Arduino-Platine

Auf Arduino-Boards variieren die für SPI reservierten Pins je nach Board-Modell. Auf einem Arduino Uno sind die SPI-Pins beispielsweise:

MISO: Pin 12
MOSI: Pin 11
SCK: Pin 13
SS: Pin 10 (oder ein anderer benutzerkonfigurierter Pin)

Schreiben auf dem SPI

Arduino vereinfacht die Verwendung von SPI mit seiner SPI.h-Bibliothek. Hier ist ein einfaches Beispiel für die Verwendung dieser Bibliothek zur Kommunikation mit einem SPI-Gerät:

#include <SPI.h>

void setup() {
  SPI.begin();
  pinMode(10, OUTPUT);
}

void loop() {
  digitalWrite(10, LOW);
  byte dataSent = 0x42;
  byte dataReceived = SPI.transfer(dataSent);
  digitalWrite(10, HIGH);
  delay(1000);
}

Das folgende Programm sendet Byte 42 über die SPI-Verbindung.

Lesen Sie mehr über den SPI

Wenn Sie die Werte auf dem SPI des Arduino-Boards lesen möchten:

#include <SPI.h>

const int slaveSelectPin = 10;

void setup() {
  Serial.begin(9600);
  pinMode(slaveSelectPin, OUTPUT);
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV16); 
  SPI.setDataMode(SPI_MODE0);           
  SPI.setBitOrder(MSBFIRST);
}

void loop() {
  
  digitalWrite(slaveSelectPin, LOW);
  byte requestByte = 0x00; 
  byte receivedValue = SPI.transfer(requestByte);
  digitalWrite(slaveSelectPin, HIGH);

  Serial.print("Valeur reçue : ");
  Serial.println(receivedValue);
  delay(1000);
}

Abschluss

Wenn Sie weitere Informationen zu den auf Arduino verfügbaren Kommunikationsbussen wünschen, finden Sie in unseren Kursen UART und I2C.

Wenn Sie das in diesem Kurs Gelernte in die Praxis umsetzen möchten, lesen Sie unseren Kurs zu RFID, der über die SPI-Verbindung funktioniert.