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

Клавиатура для панели управления аналоговая

Аналоговая клавиатура может использоваться как джойстик управления или как панель управления менюшко..

100.02грн.

Модуль блока питания 12В 250мА

Модуль блока питания 12В 250мА

Удобный модуль питания из 220В AC в 12В постоянного тока. Разработан для установки на печатную плату..

155.85грн.

Пружина для натяжения ремня 6мм

Пружина для натяжения ремня 6мм

Стальная пружина для натяжки зубчатого ремня GT2 шириной 6 ммИспользуется в 3d принтерах и CNC-станк..

4.82грн.

Защита входов и аналоговых сигналов: как не спалить Arduino/ESP32 и получить стабильные измерения

Защита входов и аналоговых сигналов: как не спалить Arduino/ESP32 и получить стабильные измерения

Защита входов и аналоговых сигналов: как не спалить Arduino/ESP32 и получить стабильные измерения ..

Торцевые держатели линейных направляющих 8мм

Торцевые держатели линейных направляющих 8мм

Держатель цилиндрической направляющей диаметром 8 ммПодходит для любой оси 3D-принтера или CNCДиамет..

72.01грн.