Dobbiamo anche collegare la libreria <SPI.h>, leggi di più qui.
Carichiamo il programma.
#include <SPI.h>
#define ss 8; // SS pin di registro.
byte b;
void setup()
{
SPI.begin(); // inizializzazione dell'interfaccia SPI.
pinMode(SS, OUTPUT);
digitalWrite(SS, HIGH);
}
void loop()
{
b = 0x00000001;
for (int i = 0; i < 8; i++)
{
digitalWrite(SS, LOW); // registro selezionato.
SPI.transfer(b); // trasferire byte in registro.
digitalWrite(SS, HIGH); // trasferimento terminato.
delay(100); // ritardo.
b <<= 1; // spostato uno.
}
}
Osserviamo il corretto funzionamento dell'interfaccia SPI, dello shift register e del codice.
Un'osservazione interessante, se si aggiunge l'impostazione SPI.setBitOrder() a Setup; e gioca con i parametri, inserendo LSBFIRST o MSBFIRST, puoi vedere che la direzione dell'illuminazione cambierà solo da questa riga.
Secondo esempio. Scambio di dati tra due controller.
Ancora una volta, il compito di collegare i controller è l'ultimo che gli sviluppatori dell'interfaccia SPI si sono prefissati, ma a volte può sorgere la necessità, ad esempio, se si desidera realizzare la propria periferica SPI basata sul controller, o tutte le altre possibilità per buttare un paio di byte già esauriti. In ogni caso, sapere come si fa è interessante, utile e può tornare utile.
Dal lato del Master tutto è semplice, tradizionalmente utilizzeremo la libreria già pronta <SPI.h> e invieremo comandi allo Slave per accendere il LED premendo un pulsante. In risposta, riceveremo il numero di questi clic, che verrà conteggiato sul dispositivo Slave.
Ma sullo Slave, faremo tutto il lavoro di ricezione e invio dei dati in modo completamente manuale, senza una libreria. Ci sono due ragioni per questo. In primo luogo, la biblioteca non supporta bene il lavoro dello Slave, poiché è su misura per il Master. In secondo luogo, dobbiamo sapere come possiamo fare a meno di una biblioteca e che è anche possibile in linea di principio. Sorprendentemente, il programma non diventa molto più ampio da questo.
Carica il programma sul Master. Attiro la attenzione, funziona sulla libreria <SPI.h>.
#include <SPI.h>
#define BUT 7 // pulsante.
byte but[2];
byte c;
void setup()
{
pinMode(BUT, INPUT);
SPI.begin(); // inizializzazione dell'interfaccia.
pinMode(SS, OUTPUT);
digitalWrite(SS, HIGH);
Serial.begin(9600);
}
void loop()
{
button();
// qui posizioniamo qualsiasi programma.
}
void button()
{
static unsigned long timer;
if (timer + 100 > millis()) return; // pulsanti di polling ogni 100 ms.
but[0] = but[1];
but[1] = digitalRead(BUT);
if (but[0] && !but[1]) // premuto.
{
digitalWrite(SS, LOW);
c = SPI.transfer(1); // inviane uno, ottieni un byte in risposta.
digitalWrite(SS, HIGH);
Serial.println(c); // stampa il byte ricevuto (contatore) sul monitor.
}
else if (!but[0] && but[1]) // spremere.
{
digitalWrite(SS, LOW);
c = SPI.transfer(0); // invia uno zero, ottieni un byte in risposta.
digitalWrite(SS, HIGH);
Serial.println(c); // stampa il byte ricevuto (contatore) sul monitor.
}
timer = millis();
}
Carichiamo il programma sul Salve. Notiamo che non utilizza la libreria, solo i registri dell'interfaccia hardware diretta.
#define LED 9 // LED
// definire pin SPI hardware (solo per l'inizializzazione).
#define MOSI_PIN 11
#define MISO_PIN 12
#define SCK_PIN 13
#define SS_PIN 10
byte c; // contatore 0-254.
byte rec; // definire una variabile per il byte ricevuto.
void setup()
{
SPCR = B00000000; // reimpostare il registro di controllo SPI.
SPCR = (1 << SPE); // abilitare SPI come Slave (avvio).
// inizializzare i pin per lavorare con SPI.
pinMode(MOSI_PIN, INPUT);
pinMode(MISO_PIN, OUTPUT);
pinMode(SCK_PIN, INPUT);
pinMode(SS_PIN, INPUT);
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop()
{
while (digitalRead(SS_PIN) == LOW) // mentre ci contattano, accettiamo byte.
{
rec = spi_receive(); // ricevere byte.
Serial.println(rec, HEX);
digitalWrite(LED, rec); // inviarlo al LED.
c++; // incrementare il contatore.
SPDR = c; // invia il valore del contatore all Master.
}
}
byte spi_receive() // la funzione restituisce l'intero byte ricevuto.
{
while (!(SPSR & (1 << SPIF))) {}; // fino che non viene impostato il flag di fine trasmissione, riceviamo bit.
return SPDR; // restituire il contenuto del registro dati SPI.
}
Quindi, assembliamo il circuito. Prendiamo due Arduino, ricordiamo dove hanno i pin SPI e colleghiamoli direttamente. Aggiungiamo un pulsante al Master e un LED allo Slave.