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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Набір датчиків ваги 200кг

Набір датчиків ваги 200кг

4 тензодатчика для вимірювання ваги до 200 кг при мостовому з'єданніКожний окремий датчик розрахован..

194.71грн.

Припой-паста для пайки SMD-компонентів

Припой-паста для пайки SMD-компонентів

Паста-припой у шприці XG-Z40Намазується на контактні ділянки плати, плавиться при температурі > 1..

196.14грн.

Стойка роликова для вісі Х 2шт. з кріпленням

Стойка роликова для вісі Х 2шт. з кріпленням

Монтажна панель з МДФ для організації вісі Х автоматичного лазерного гравера.Отвори під кроковий дви..

167.68грн.

Знижуючий перетворювач напруги 4...35В в 1,23...30В

Знижуючий перетворювач напруги 4...35В в 1,23...30В

Налаштовуваний знижуючий перетворювач напруги постійного струму.Тримає стабільну задану резистором н..

63.45грн.

Міні кнопка 12 x 12 x 4,3 мм

Міні кнопка 12 x 12 x 4,3 мм

Мініатюрна кнопка для встановлення на плату через отвориРозміри 12 x 12 x 4,3 мм..

4.14грн.