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, мы можем помочь в его реализации. Мы занимаемся разработкой схем, программированием и изготовлением печатных плат под конкретные задачи. Ознакомьтесь с примерами реализованных проектов в портфолио и закажите разработку под ключ для вашего бизнеса или хобби.
Винт М2,5х14мм нержавейка
Винт из нержавейки с резьбой М2,5 для крепления элементов любительских проектовДлина резьбы 14 мм..
1.11грн.
Сенсорные входы ESP32
Привет друзья! Тема статьи: ESP32 сенсорные входы Вы наверное уже слышали, что у контроллера ESP32 ..
Уроки Arduino видимость переменных для начинающих
Переменные в Arduino IDE разделяются на глобальные и локальные. Глобальные переменные дост..
Припой-паста для пайки SMD-компонентов
Паста-припой в шприце XG-Z40Намазывается на контактные площадки платы, плавится при температуре >..
196.14грн.
Модуль блока питания 5В 1А
Плата модуля импульсного блока питания 5В 1АВходное переменное напряжение 85 ... 265 В 50/60 ГцРазме..
128.59грн.





