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 заключается в том, что каждое ведомое устройство активируется отдельной линией 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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Винт М2,5х14мм нержавейка

Винт М2,5х14мм нержавейка

Винт из нержавейки с резьбой М2,5 для крепления элементов любительских проектовДлина резьбы 14 мм..

1.11грн.

Сенсорные входы ESP32

Сенсорные входы ESP32

Привет друзья! Тема статьи: ESP32 сенсорные входы Вы наверное уже слышали, что у контроллера ESP32 ..

Уроки Arduino видимость переменных для начинающих

Уроки Arduino видимость переменных для начинающих

Переменные в Arduino IDE разделяются на глобальные и локальные. Глобальные переменные дост..

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

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

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

196.14грн.

Модуль блока питания 5В 1А

Модуль блока питания 5В 1А

Плата модуля импульсного блока питания 5В 1АВходное переменное напряжение 85 ... 265 В 50/60 ГцРазме..

128.59грн.