 SPI (Serial Peripheral Interface) — это синхронный последовательный интерфейс передачи данных, разработанный компанией Motorola для связи между микросхемами на короткие расстояния.
 SPI (Serial Peripheral Interface) — это синхронный последовательный интерфейс передачи данных, разработанный компанией Motorola для связи между микросхемами на короткие расстояния.
Проще говоря, это способ "общения" электронных компонентов (например, микроконтроллера с датчиком, памятью, дисплеем), при котором биты данных передаются один за другим по нескольким проводам.
Основные принципы работы
SPI работает по принципу "Ведущий-Ведомый" (Master-Slave). Ведущее устройство (чаще всего это микроконтроллер) управляет обменом данными и тактирует передачу.
Для работы обычно используются 4 сигнальные линии (провода):
| Сигнал | Назначение | Описание | 
|---|---|---|
| SCLK (Serial Clock) | Тактовый сигнал | Генерируется Ведущим. Синхронизирует передачу каждого бита данных. | 
| MOSI (Master Out Slave In) | Данные от Ведущего к Ведомому | Линия, по которой ведущий передает данные ведомому. | 
| MISO (Master In Slave Out) | Данные от Ведомого к Ведущему | Линия, по которой ведомый отвечает ведущему. | 
| SS/CS (Slave Select / Chip Select) | Выбор ведомого | Активный низкий сигнал. Ведущий "подтягивает" его к низкому уровню (0 В), чтобы активировать конкретное ведомое устройство. | 
Важно: Линии MISO и MOSI названы с точки зрения ведущего устройства. Если вы смотрите со стороны ведомого, все наоборот.
Как происходит обмен данными?
- 
Инициализация: Ведущий устанавливает напряжение на линии SS нужного ведомого устройства в низкий уровень (логический 0). Это как сказать: "Эй, [имя устройства], я сейчас с тобой разговариваю!". 
- 
Синхронная передача: Ведущий генерирует тактовые импульсы на линии SCLK. 
- 
Передача бит: С каждым тактовым импульсом происходит два действия одновременно: - 
Ведущий выставляет очередной бит данных на линии MOSI. 
- 
Ведомый выставляет очередной бит данных на линии MISO. 
 
- 
- 
Завершение: После передачи нужного количества бит (обычно 8, 16 и т.д.) ведущий возвращает линию SS в высокий уровень (логическая 1). 
Таким образом, SPI — это интерфейс полнодуплексный (full-duplex), то есть передача и прием данных происходят одновременно.
Конфигурация (Режимы работы SPI)
Чтобы обмен данными был корректен, ведущее и ведомое устройства должны быть настроены на один и тот же режим. Режим определяется двумя параметрами:
- 
CPOL (Clock Polarity) — Полярность тактового импульса. - 
CPOL = 0: Логический ноль на линии SCLK в состоянии покоя.
- 
CPOL = 1: Логическая единица на линии SCLK в состоянии покоя.
 
- 
- 
CPHA (Clock Phase) — Фаза тактового импульса. - 
CPHA = 0: Данные захватываются по переднему (нарастающему) фронту тактового импульса.
- 
CPHA = 1: Данные захватываются по заднему (спадающему) фронту тактового импульса.
 
- 
Комбинация этих параметров дает 4 режима SPI:
| Режим | CPOL | CPHA | 
|---|---|---|
| 0 | 0 | 0 | 
| 1 | 0 | 1 | 
| 2 | 1 | 0 | 
| 3 | 1 | 1 | 
Чаще всего используются режимы 0 и 3. В даташите (документации) на любую микросхему с SPI всегда указан требуемый режим.
Преимущества и Недостатки
Преимущества:
- 
Высокая скорость: Работает на частотах до десятков МГц (значительно быстрее I²C и UART). 
- 
Полнодуплексная передача: Данные можно отправлять и получать одновременно. 
- 
Простота: Аппаратная реализация очень проста, нет сложного протокола с адресами, как в I²C. 
- 
Гибкость: Разрядность передаваемых данных не ограничена 8 битами (может быть 12, 16 и т.д.). 
Недостатки:
- 
Большее количество проводов: По сравнению с I²C (2 провода) и UART (2 провода + "земля") требуется 4 провода на устройство. 
- 
Нет подтверждения приема: Ведомое устройство не может сообщить, что оно получило данные (в отличие от I²C). 
- 
Нет встроенной коллизии шины: Только один ведущий. Для многомастерных систем нужны дополнительные ухищрения. 
- 
Требует больше выводов микроконтроллера: Каждое ведомое устройство требует отдельной линии SS. Если устройств много, выводы быстро заканчиваются (это решается с помощью демультиплексоров). 
Сравнение с другими интерфейсами
| Характеристика | SPI | I²C | UART | 
|---|---|---|---|
| Количество проводов | 4+ | 2 | 2 (+ GND) | 
| Скорость | Очень высокая (десятки МГц) | Средняя (до 5 Мгц) | Низкая (до 115200 бод) | 
| Синхронность | Синхронный (есть такт) | Синхронный (есть такт) | Асинхронный (нет такта) | 
| Тип передачи | Полный дуплекс | Полудуплекс | Полный дуплекс | 
| Подключение устройств | Отдельный CS на каждое | По адресам на одной шине | "Точка-точка" | 
Где применяется?
SPI очень распространен в embedded-электронике:
- 
Память: Flash, EEPROM. 
- 
Датчики: Акселерометры, гироскопы, термометры, датчики давления. 
- 
ЦАП/АЦП (цифро-аналоговые и аналого-цифровые преобразователи). 
- 
Цифровые потенциометры. 
- 
Дисплеи: TFT, OLED, LCD. 
- 
SD-карты (часто в режиме SDIO, который является расширением SPI). 
- 
RFID-модули, Wi-Fi и Bluetooth-модули. 
Заключение
SPI — это быстрый, простой и эффективный интерфейс для связи между микросхемами внутри одного устройства. Его главные козыри — скорость и простота, а главные недостатки — большее количество управляющих линий и отсутствие механизма подтверждения приема.
