Suche…


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

Grundlagen: Initialisieren Sie den SPI und einen Chip-Select-Pin und führen Sie eine 1-Byte-Übertragung durch

#include <SPI.h>
#define CSPIN 1

void setup() {
  pinMode(CSPIN, OUTPUT); // init chip select pin as an output
  digitalWrite(CSPIN, 1); // most slaves interpret a high level on CS as "deasserted"

  SPI.begin();

  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  digitalWrite(CSPIN, 0);

  unsigned char sent = 0x01;
  unsigned char received = SPI.transfer(sent);
  // more data could be transferred here

  digitalWrite(CSPIN, 1);
  SPI.endTransaction();

  SPI.end();
}

void loop() {
  // we don't need loop code in this example.
}

Dieses Beispiel:

  • initialisiert richtig und verwendet einen Chip-Select-Pin (siehe Anmerkungen)
  • verwendet ordnungsgemäß eine SPI-Transaktion (siehe Anmerkungen)
  • verwendet nur die SPI, um ein einzelnes Byte zu übertragen. Es gibt auch eine Methode zum Übertragen von Arrays, die hier nicht verwendet wird.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow