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, ми можемо допомогти у його реалізації. Ми займаємося розробкою схем, програмуванням та виготовленням друкованих плат під конкретні задачі. Ознайомтеся з прикладами виконаних робіт у портфоліо та замовте розробку під ключ для вашого бізнесу чи хобі.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Як Arduino взаємодіє із зовнішніми пристроями через бездротовий зв’язок та які модулі використовуються

Як Arduino взаємодіє із зовнішніми пристроями через бездротовий зв’язок та які модулі використовуються

Як Arduino взаємодіє із зовнішніми пристроями через бездротовий зв’язок та які модулі використов..

Arduino SIM800 GPRS HTTP GET запит

Arduino SIM800 GPRS HTTP GET запит

Привіт друзі! Ми з кожним разом знаємо все більш цікаві застосування GSM-модуля SIM800. На цей раз н..

Плата ESP32 DevKit

Плата ESP32 DevKit

Плата WiFi та Bluetooth контролера ESP-32 з програматором CP2102На платі вже встановлено у..

268.52грн.

Кроковий двигун 28BYJ-48 з модулем драйвера

Кроковий двигун 28BYJ-48 з модулем драйвера

Кількість фаз 4Робоча напруга 5 ВКоефіцієнт зміни швидкості 1/64Кут повертання мінімальний 5.62..

114.93грн.

Муфта на кроковий двигун 8x8x25мм

Муфта на кроковий двигун 8x8x25мм

Ця муфта слугує перехідником між валами 8 мм та 8 мм. Тобто містить з обох боків отвір діаметром 8 м..

61.62грн.