SPI
SPI (англ. Serial Peripheral Interface, последовательный периферийный интерфейс) — это синхронный последовательный интерфейс передачи данных, предназначенный для обмена информацией между микроконтроллерами и периферийными устройствами (датчиками, дисплеями, памятью, аналого-цифровыми преобразователями) на коротких расстояниях. Разработан компанией Motorola (ныне NXP Semiconductors) в конце 1980-х годов. Отличается высокой скоростью передачи (до десятков мегагерц), простотой аппаратной реализации и полнодуплексным режимом работы (одновременная передача и приём данных).
История
Интерфейс SPI был впервые представлен компанией Motorola в 1987 году как часть семейства микроконтроллеров MC68HC11. Изначально он использовался для подключения внешних микросхем памяти и периферии, не имея официального стандарта (в отличие от I²C или UART). Благодаря открытости спецификаций и простоте внедрения, SPI быстро стал де-факто стандартом в индустрии встраиваемых систем. В 1990-е годы его поддержка была включена в большинство микроконтроллеров (Atmel, Microchip, Texas Instruments) и микропроцессоров. В 2000-е годы появились высокоскоростные варианты (Quad SPI, Dual SPI), использующие несколько линий данных для увеличения пропускной способности.
Архитектура и принцип работы
Топология соединения
SPI использует архитектуру «ведущий-ведомый» (master-slave). Одно устройство (ведущий) управляет тактовым сигналом и инициирует передачу, одно или несколько устройств (ведомые) отвечают на запросы. Соединение осуществляется по четырём основным линиям:
- SCLK (Serial Clock) — тактовый сигнал, генерируемый ведущим.
- MOSI (Master Out Slave In) — линия передачи данных от ведущего к ведомому.
- MISO (Master In Slave Out) — линия передачи данных от ведомого к ведущему.
- SS (Slave Select) — линия выбора ведомого (активный низкий уровень).
Для подключения нескольких ведомых используются два способа:
- Независимая выборка — каждое ведомое устройство подключается к отдельному выводу SS ведущего.
- Дейзи-чейн (каскадное соединение) — данные проходят последовательно через все устройства, что требует поддержки со стороны аппаратуры.
Режимы работы
Параметры передачи определяются двумя битами в конфигурации ведущего: CPOL (Clock Polarity) и CPHA (Clock Phase). Возможны четыре режима:
| Режим | CPOL | CPHA | Описание |
|---|---|---|---|
| 0 | 0 | 0 | Тактовый сигнал начинается с низкого уровня, данные фиксируются по переднему фронту |
| 1 | 0 | 1 | Тактовый сигнал начинается с низкого уровня, данные фиксируются по заднему фронту |
| 2 | 1 | 0 | Тактовый сигнал начинается с высокого уровня, данные фиксируются по переднему фронту |
| 3 | 1 | 1 | Тактовый сигнал начинается с высокого уровня, данные фиксируются по заднему фронту |
Выбор режима зависит от спецификации конкретного периферийного устройства; несовпадение режимов приводит к ошибкам передачи.
Формат данных
Передача данных в SPI осуществляется пакетами (обычно 8 бит, но возможны 4, 16, 32 бита в зависимости от реализации). Ведущий генерирует тактовые импульсы, одновременно отправляя биты по линии MOSI и принимая биты по MISO. Таким образом, за один цикл обмена происходит полнодуплексная передача. Стартовый бит отсутствует; передача начинается с активации линии SS (переходом в низкий уровень) и заканчивается её деактивацией.
Преимущества и недостатки
Преимущества
- Высокая скорость — до 80 МГц в современных реализациях (например, в микроконтроллерах STM32).
- Полнодуплексность — одновременная передача и приём данных.
- Простота аппаратуры — не требуется сложных схем синхронизации.
- Гибкость — настраиваемая длина слова, частота, режимы.
- Низкая задержка — отсутствие стартовых и стоповых битов (в отличие от UART).
Недостатки
- Отсутствие стандарта — разные производители могут реализовывать интерфейс с отличиями (например, порядок битов, полярность сигналов).
- Большое количество выводов — при подключении N ведомых устройств требуется N+3 линии (при независимой выборке).
- Ограниченная дальность — обычно до 1-2 метров из-за чувствительности к помехам.
- Нет подтверждения приёма — ведомый не может сообщить об ошибке (в отличие от I²C).
Применение
SPI широко используется в следующих областях:
Встраиваемые системы
- Датчики — акселерометры, гироскопы, магнитометры (например, MPU6050, LSM303).
- Дисплеи — OLED и LCD панели (например, SSD1306, ILI9341).
- Память — EEPROM (25LC256), Flash (W25Q64), SD-карты (в режиме SPI).
- АЦП/ЦАП — MCP3008, MAX5216.
Промышленность
- Программируемые логические контроллеры (ПЛК) — обмен данными между модулями ввода/вывода.
- Измерительное оборудование — осциллографы, мультиметры.
Потребительская электроника
- Микроконтроллеры Arduino, ESP32, Raspberry Pi — для подключения периферии.
- Радиомодули — nRF24L01, RFM69.
Разновидности и расширения
Quad SPI (QSPI)
Использует четыре линии данных (IO0–IO3) вместо одной MOSI и одной MISO, что позволяет передавать до 4 бит за такт. Применяется в высокоскоростных Flash-памятях (например, Winbond W25Q64).
Dual SPI
Использует две линии данных. Часто реализуется как режим совместимости с Quad SPI.
Microwire
Упрощённый вариант SPI, разработанный National Semiconductor (ныне Texas Instruments). Отличается фиксированной длиной слова (8 бит) и меньшим числом режимов.
Serial Peripheral Interface Plus (SPI+)
Расширение с поддержкой CRC (циклического избыточного кода) для контроля целостности данных.
Реализация в популярных платформах
Arduino
Библиотека SPI.h предоставляет методы begin(), transfer(), beginTransaction(). Для выбора ведомого используется цифровой вывод (например, digitalWrite(SS_PIN, LOW)).
Raspberry Pi
В Linux SPI доступен через файловые устройства /dev/spidev0.0 и /dev/spidev0.1. Управление осуществляется с помощью библиотек wiringPi или spidev.
ESP32
Поддерживает до трёх аппаратных SPI-интерфейсов (SPI2, SPI3, HSPI). Настройка производится через фреймворк ESP-IDF или Arduino-совместимые библиотеки.
Альтернативы
- I²C (Inter-Integrated Circuit) — двухпроводной полудуплексный интерфейс, требующий меньше выводов, но с меньшей скоростью и сложнее в реализации.
- UART (Universal Asynchronous Receiver-Transmitter) — асинхронный интерфейс, не требующий тактового сигнала, но не поддерживающий полнодуплексность без дополнительных линий.
- CAN (Controller Area Network) — дифференциальный последовательный интерфейс для промышленности и автомобилестроения, устойчивый к помехам.
Интересные факты
- В спецификации Motorola SPI не был запатентован, что способствовало его широкому распространению.
- Некоторые производители (например, Microchip) реализуют SPI с возможностью работы в режиме «общего ведомого», где несколько устройств делят одну линию MISO.
- В интерфейсе SD-карт SPI используется как резервный режим при отсутствии поддержки основного протокола.
Источники
- Motorola. SPI Block Guide V03.06. 2003.
- NXP Semiconductors. AN4707: Using the SPI Module. 2013.
- Atmel. AVR151: Setup and Use of the SPI. 2010.
- Texas Instruments. Understanding SPI. 2019.
- Wikipedia. Serial Peripheral Interface. 2024.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →