arduino
SPI-kommunikation
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()
.
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.