Zoeken…


Opmerkingen

Chip select signalen

De meeste slaves hebben een actieve low-chipselectie-ingang. Dus de juiste code om een chipselectiepin te initialiseren en te gebruiken is deze:

#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

Het uitschakelen van een slave is net zo belangrijk als het selecteren, omdat een slave de MISO-lijn kan besturen terwijl deze is geselecteerd. Er kunnen veel slaven zijn, maar er mag er maar één MISO besturen. Als een slave niet correct is uitgeschakeld, kunnen twee of meer slaves MISO aansturen, wat kan leiden tot kortsluiting tussen hun uitgangen en de apparaten kan beschadigen.

transacties

Transacties hebben twee doelen:

  • vertel de SPI wanneer we deze in een bepaalde context willen starten en beëindigen
  • configureer de SPI voor een specifieke chip

De kloklijn heeft verschillende inactieve staten in de verschillende SPI-modi. Het wijzigen van de SPI-modus terwijl een slave is geselecteerd, kan de slave verwarren, dus stel altijd de SPI-modus in voordat u een slave selecteert. De SPI-modus kan worden ingesteld met een SPISettings object dat wordt doorgegeven aan SPI.beginTransaction :

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

SPISettings kunnen ook elders worden opgeslagen:

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

Als een ander deel van de code de SPI probeert te gebruiken tussen een paar aanroepen om te beginTransaction() met beginTransaction() en endTransaction() , kan er een fout optreden. Hoe dat wordt gedaan, is afhankelijk van de implementatie.

Zie ook Arduino Reference: SPISettings

De SPI gebruiken in onderbrekende serviceroutines

Als de SPI binnen een ISR moet worden gebruikt, mag er tegelijkertijd geen andere transactie plaatsvinden. De SPI-bibliotheek biedt het gebruik usingInterrupt(interrupt_number) om dit te vergemakkelijken. Het werkt door de gegeven interrupt uit te beginTransaction() wanneer beginTransaction() wordt aangeroepen, dus de interrupt kan niet worden beginTransaction() tussen dat paar voor aanroepen van beginTransaction() en endTransaction() .

Zie ook Arduino Reference: SPI: usingInterrupt

Basisprincipes: initialiseer de SPI en een chipselectiepin en voer een overdracht van 1 byte uit

#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.
}

Dit voorbeeld:

  • initialiseert en gebruikt een chipselectiepin (zie opmerkingen)
  • gebruikt correct een SPI-transactie (zie opmerkingen)
  • gebruikt alleen de SPI om één byte over te dragen. Er is ook een methode voor het overbrengen van arrays, die hier niet wordt gebruikt.


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow