Arduino SPI: Повний посібник з послідовної шини Serial Peripheral Interface
SPI (Serial Peripheral Interface) — це високошвидкісна послідовна шина, яка широко застосовується в електроніці для обміну даними між мікроконтролером і периферійними пристроями. В екосистемі Arduino інтерфейс SPI використовується для підключення SD-карт, RFID-зчитувачів, TFT- та OLED-дисплеїв, Ethernet-модулів та інших компонентів. Завдяки простоті та швидкодії SPI став стандартом де-факто для швидкої передачі даних на невеликі відстані.
Що таке SPI?
Інтерфейс SPI був розроблений компанією Motorola і є синхронним протоколом передачі даних «ведучий-ведений». У ролі ведучого (master) найчастіше виступає мікроконтролер (наприклад, Arduino), а веденими (slave) є периферійні пристрої.
Передача даних здійснюється по чотирьох основних лініях:
- MOSI (Master Out Slave In) — дані від ведучого до веденого.
- MISO (Master In Slave Out) — дані від веденого до ведучого.
- SCK (Serial Clock) — тактовий сигнал.
- SS (Slave Select) — вибір конкретного пристрою-веденого.
Особливість SPI полягає в тому, що кожен slave активується окремою лінією SS. Це дозволяє підключати одразу кілька модулів до однієї шини, використовуючи різні піни вибору.
Переваги SPI
- Висока швидкість обміну даними (до кількох МГц і вище).
- Проста схема підключення.
- Можливість роботи з кількома пристроями на одній шині.
- Синхронна передача, що підвищує надійність.
Недоліки SPI
- Потрібно більше проводів у порівнянні з I2C.
- Немає стандартного механізму адресації — кожен slave вибирається окремим піном.
- Кабелі обмеженої довжини, придатні лише для коротких з’єднань.
Апаратна підтримка SPI в Arduino
Більшість плат Arduino (Uno, Mega, Nano) мають вбудований апаратний SPI-контролер. Виводи залежать від моделі:
| Модель Arduino | MOSI | MISO | SCK | SS (за замовчуванням) |
|---|---|---|---|---|
| Arduino Uno / Nano | 11 | 12 | 13 | 10 |
| Arduino Mega | 51 | 50 | 52 | 53 |
| Arduino Leonardo | ICSP-4 | ICSP-1 | ICSP-3 | 10 |
Для підключення рекомендується використовувати виводи роз’єму ICSP, адже саме до них підключено апаратний SPI.
Приклад використання SPI: робота з SD-картою
Розглянемо приклад підключення та роботи з SD-картою через SPI:
#include <SPI.h>
#include <SD.h>
const int chipSelect = 10;
void setup() {
Serial.begin(9600);
if (!SD.begin(chipSelect)) {
Serial.println("Помилка ініціалізації SD-карти!");
return;
}
Serial.println("SD-карта готова до роботи.");
File dataFile = SD.open("test.txt", FILE_WRITE);
if (dataFile) {
dataFile.println("Привіт, SPI!");
dataFile.close();
Serial.println("Запис виконано успішно.");
} else {
Serial.println("Не вдалося відкрити файл.");
}
}
void loop() {}
SPI та дисплеї
Багато графічних TFT та OLED-дисплеїв використовують інтерфейс SPI. Це забезпечує високу швидкість оновлення екрана, на відміну від I2C, де швидкість обмежена.
Приклад підключення OLED-дисплея з бібліотекою Adafruit SSD1306:
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#define OLED_DC 9
#define OLED_CS 10
#define OLED_RESET 8
Adafruit_SSD1306 display(128, 64, &SPI, OLED_DC, OLED_RESET, OLED_CS);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Hello SPI");
display.display();
}
void loop() {}
SPI та RFID-зчитувачі
Один з найпопулярніших RFID-модулів для Arduino — RC522. Він також працює через SPI та дозволяє зчитувати карти і мітки стандарту MIFARE.
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
Serial.println("Піднесіть карту...");
}
void loop() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
Serial.print("UID карти: ");
for (byte i = 0; i < rfid.uid.size; i++) {
Serial.print(rfid.uid.uidByte[i], HEX);
Serial.print(" ");
}
Serial.println();
rfid.PICC_HaltA();
}
Налаштування SPI вручну
Бібліотека SPI.h дозволяє налаштовувати швидкість передачі, порядок бітів та режим роботи (MODE0–MODE3). Наприклад:
SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
digitalWrite(SS, LOW);
SPI.transfer(0x55);
digitalWrite(SS, HIGH);
SPI.endTransaction();
Висновок
Інтерфейс SPI — це потужний інструмент для проєктів на Arduino. Він дозволяє підключати швидкі периферійні пристрої, такі як SD-карти, дисплеї, RFID-зчитувачі та Ethernet-модулі. Попри більшу кількість проводів у порівнянні з I2C, SPI забезпечує високу швидкість та надійність обміну.
Комерційна пропозиція
Якщо ви плануєте власний проєкт із використанням SPI чи інших технологій Arduino та ESP32, ми можемо допомогти у його реалізації. Ми займаємося розробкою схем, програмуванням та виготовленням друкованих плат під конкретні задачі. Ознайомтеся з прикладами виконаних робіт у портфоліо та замовте розробку під ключ для вашого бізнесу чи хобі.
Набір датчиків ваги 200кг
4 тензодатчика для вимірювання ваги до 200 кг при мостовому з'єданніКожний окремий датчик розрахован..
194.71грн.
Припой-паста для пайки SMD-компонентів
Паста-припой у шприці XG-Z40Намазується на контактні ділянки плати, плавиться при температурі > 1..
196.14грн.
Стойка роликова для вісі Х 2шт. з кріпленням
Монтажна панель з МДФ для організації вісі Х автоматичного лазерного гравера.Отвори під кроковий дви..
167.68грн.
Знижуючий перетворювач напруги 4...35В в 1,23...30В
Налаштовуваний знижуючий перетворювач напруги постійного струму.Тримає стабільну задану резистором н..
63.45грн.
Міні кнопка 12 x 12 x 4,3 мм
Мініатюрна кнопка для встановлення на плату через отвориРозміри 12 x 12 x 4,3 мм..
4.14грн.





