SPI to skrót od „Serial Peripheral Interface”. Jest to synchroniczna szeregowa magistrala danych – dane mogą podróżować w obu kierunkach jednocześnie. Magistrale używamy dla szybkiej komunikacji na krótkie odległości < 10m. Aby umożliwić synchroniczną transmisję danych, magistrala SPI wykorzystuje cztery przewody:
- MOSI – Master-out, Slave-in. Ta linia transportuje dane z naszego Arduino do urządzeń sterowanych przez SPI
- MISO – Master-in, Slave out. Ta linia transportuje dane z urządzeń kontrolowanych przez SPI do Arduino
- SS – Wybór urządzenia podrzędnego. Ta linia informuje urządzenie w magistrali, że chcemy się z nim komunikować. Każde urządzenie SPI potrzebuje unikalnej linii SS.
- SCK – zegar szeregowy.
Dane są przesyłane tam i z powrotem wzdłuż linii MOSI i MISO między naszym Arduino a urządzeniem SPI. Może się to zdarzyć tylko wtedy, gdy linia SS jest ustawiona na LOW. Innymi słowy, aby komunikować się z określonym urządzeniem SPI na magistrali, ustawiamy linię SS dla tego urządzenia na LOW. Gdy chcemy skończymy komunikacje ustawiamy na HIGHT. Jeśli na magistrali mamy dwa lub więcej urządzeń SPI, okablowanie wyglądałoby następująco:

Dane przesyłane są do urządzenia SPI w postaci bajtów . Powinieneś już wiedzieć, że osiem bitów tworzy jeden bajt, a zatem reprezentuje liczbę binarną o wartości od zera do 255.
Zadanie
Stwórz układ z czytnikiem RFID -RC522 połączony za pomocą magistrali SPI do Andino MKR 1010 WiFi do odczytu kart RFID.
Interaktywny schemat:

Kod programu:
#include <SPI.h>
// Biblioteka, którą należy dodać
#include <MFRC522.h>
#define RST_PIN 6 // Definicja pinu RST
#define SS_PIN 7 // Definicja pinu SDA
MFRC522 mfrc522(SS_PIN, RST_PIN); // Tworzenie instancji MFRC522
void setup() {
Serial.begin(9600); // Inicjalizacja komunikacji szeregowej z PC
while (!Serial); // Jeśli port szeregowy nie jest otwarty to nie rób nic
SPI.begin(); // Inicjalizacja SPI bus
mfrc522.PCD_Init(); // Inicjalizacja MFRC522
mfrc522.PCD_DumpVersionToSerial(); // Wyswietl informacje o PCD - MFRC522
Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}
void loop() {
// Poszukaj nowych kart
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Wybierz jedną z kart
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
// Wyślij na serial monitorze informacje dotyczące karty;
// PICC_HaltA() jest wywoływana automatycznie
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}
Wynik:

W monitorze portu szeregowego dostajemy informacje o MFRC522 oraz informacje o breloku który przyłożyliśmy do czytnika.
