Sök…


Anmärkningar

Markera markeringssignaler

De flesta slavar har en aktiv ingång med lågt chip. Så korrekt kod för att initialisera och använda en chipvaltapp är detta:

#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

Att avmarkera en slav är lika viktigt som att välja den, eftersom en slav kan köra MISO-linjen medan den är vald. Det kan finnas många slavar, men bara en får köra MISO. Om en slav inte avmarkeras korrekt kan två eller flera slavar köra MISO, vilket kan leda till shorts mellan deras utgångar och kan skada enheterna.

transaktioner

Transaktioner tjänar två syften:

  • berätta för SPI när vi vill börja och sluta använda det inom ett visst sammanhang
  • konfigurera SPI för ett specifikt chip

Klocklinjen har olika viloläge i de olika SPI-lägena. Att ändra SPI-läge medan en slav är vald kan förvirra slaven, så ställ alltid SPI-läget innan du väljer en slav. SPI-läget kan ställas in med ett SPISettings objekt som skickas till SPI.beginTransaction :

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

SPISettings kan också lagras någon annanstans:

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

Om en annan del av koden försöker använda SPI mellan ett par samtal för att beginTransaction() och endTransaction() , kan ett fel tas upp - hur detta görs beror på implementeringen.

Se även Arduino Reference: SPISettings

Använda SPI i rutiner för interrupt service

Om SPI måste användas inom en ISR, kan ingen annan transaktion ske på samma gång. SPI-biblioteket tillhandahåller usingInterrupt(interrupt_number) att underlätta detta. Det fungerar genom att inaktivera det givna avbrottet när som beginTransaction() anropas, så avbrottet kan inte avfyras mellan det paret för samtal för att beginTransaction() och endTransaction() .

Se även Arduino Reference: SPI: usingInterrupt

Grunder: initiera SPI och en chipvalstift och utför en 1-byte överföring

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

Detta exempel:

  • initialiserar ordentligt och använder en chipvalstift (se anmärkningar)
  • använder korrekt en SPI-transaktion (se anmärkningar)
  • använder bara SPI för att överföra en enda byte. Det finns också en metod för överföring av matriser, som inte används här.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow