Looking for arduino Keywords? Try Ask4Keywords

arduinoSPI-Kommunikation


Bemerkungen

Chipauswahlsignale

Die meisten Slaves verfügen über einen aktiven Low-Select-Eingang. Der richtige Code zum Initialisieren und Verwenden eines Chip-Select-Pins lautet:

#define CSPIN 1 // or whatever else your CS pin is
// init:
pinMode(CSPIN, OUTPUT);
digitalWrite(CSPIN, 1); // deselect

// use:
digitalWrite(CSPIN, 0); // select
... perform data transfer ...
digitalWrite(CSPIN, 1); // deselect

Die Abwahl eines Slaves ist genauso wichtig wie die Auswahl, da ein Slave die MISO-Leitung steuern kann, während sie ausgewählt ist. Es kann viele Slaves geben, aber nur einer darf MISO fahren. Wenn ein Slave nicht ordnungsgemäß abgewählt wird, können zwei oder mehr Slaves MISO antreiben, was zu Kurzschlüssen zwischen ihren Ausgängen führen und die Geräte beschädigen kann.

Transaktionen

Transaktionen dienen zwei Zwecken:

  • Teilen Sie dem SPI mit, wann wir es in einem bestimmten Kontext verwenden und verwenden möchten
  • Konfigurieren Sie den SPI für einen bestimmten Chip

Die Taktleitung hat in den verschiedenen SPI-Modi unterschiedliche Ruhezustände. Das Ändern des SPI-Modus, während ein Slave ausgewählt ist, kann den Slave verwirren. Stellen Sie daher immer den SPI-Modus ein, bevor Sie einen Slave auswählen. Der SPI-Modus kann mit einem an SPISettings übergebenen SPISettings Objekt SPI.beginTransaction :

SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CSPIN, 0);
... perform data transfer ...
digitalWrite(CSPIN, 1);
SPI.endTransaction();

SPISettings können auch an anderer Stelle gespeichert werden:

SPISettings mySettings(1000000, MSBFIRST, SPI_MODE0);
SPI.beginTransaction(mySettings);

Wenn ein anderer Teil des Codes versucht, die SPI zwischen einem Paar von Aufrufen von beginTransaction() und endTransaction() , kann ein Fehler beginTransaction() endTransaction() hängt von der Implementierung ab.

Siehe auch Arduino-Referenz: SPISettings

Verwenden des SPI in Interrupt-Serviceroutinen

Wenn der SPI innerhalb einer ISR verwendet werden muss, findet möglicherweise keine andere Transaktion gleichzeitig statt. Die SPI-Bibliothek bietet usingInterrupt(interrupt_number) , um dies zu erleichtern. Es funktioniert, indem der angegebene Interrupt deaktiviert wird, wenn beginTransaction() aufgerufen wird. Der Interrupt kann also nicht zwischen diesem Paar für Aufrufe von beginTransaction() und endTransaction() .

Siehe auch Arduino-Referenz: SPI: usingInterrupt

SPI-Kommunikation Verwandte Beispiele