Интерфейс SPI¶
SPI - это быстрый последовательный интерфейс связи между контроллером и периферийными устройствами. Расшифровка: Serial Peripheral Interface.
SPI часто используют там, где нужно передавать данные быстрее, чем по I2C, или где устройство изначально рассчитано на SPI: дисплей, SD-карта, RFID-модуль, датчик, драйвер или микросхема памяти.
Где SPI используется¶
В 3D-принтерах и iDryer-подобных устройствах SPI может встречаться в:
- RFID/NFC-модулях вроде RC522;
- OLED/TFT-дисплеях;
- SD-картах;
- акселерометрах для input shaper;
- драйверах шаговых моторов, например TMC2130/TMC5160;
- микросхемах памяти;
- АЦП/ЦАП и платах расширения;
- некоторых датчиках и специализированных модулях.
SPI обычно быстрее I2C, но требует больше проводов и более аккуратного выбора пинов.
Основные линии¶
Типовой SPI использует:
SCKилиCLK- тактовый сигнал;MOSI- данные от контроллера к устройству;MISO- данные от устройства к контроллеру;CS,SSилиNSS- выбор конкретного устройства;GND- общий минус;- питание модуля.
Схема с двумя устройствами:

Источник: Wikimedia Commons, Em3rgent0rdr, CC0 Public Domain
SCK, MOSI и MISO могут быть общими для нескольких устройств. Но у каждого устройства обычно должен быть свой CS.
CS вместо адресов¶
В I2C устройства различаются адресами. В SPI обычно адресов нет. Контроллер выбирает устройство отдельной линией CS.
Пример:
SCK -> общий для всех SPI-устройств
MOSI -> общий
MISO -> общий
CS1 -> RFID module
CS2 -> display
CS3 -> SD card
Когда контроллер хочет говорить с RFID-модулем, он активирует CS1. Когда хочет говорить с дисплеем, активирует CS2.
Чаще всего CS активен низким уровнем: в покое линия HIGH, для выбора устройства - LOW. Но это нужно проверять в техническом описании.
MOSI/MISO и новые названия¶
В старых и очень распространённых схемах используются названия:
MOSI- Master Out Slave In;MISO- Master In Slave Out;SS- Slave Select.
В новой документации могут встречаться нейтральные названия:
PICO- Peripheral In Controller Out, аналог MOSI;POCI- Peripheral Out Controller In, аналог MISO;CS- Chip Select.
В 3D-принтерной электронике всё ещё очень часто пишут MOSI, MISO, SCK, CS. Главное - понимать направление сигнала и смотреть распиновку конкретного модуля.
MISO может быть не нужен¶
Не каждое SPI-устройство реально отправляет данные обратно.
Например, простой дисплей может только принимать команды и пиксели. Тогда линия MISO может отсутствовать или не использоваться.
Но для устройств, которые читают данные, MISO нужен:
- RFID-модуль;
- SD-карта;
- датчик;
- драйвер с диагностикой;
- микросхема памяти.
Если модуль должен что-то отвечать, а MISO не подключён или перепутан, инициализация может не пройти.
Скорость и режим SPI¶
У SPI есть скорость. Она может быть сильно выше, чем у I2C, но это не значит, что нужно сразу ставить максимум.
На работу влияют:
- длина проводов;
- качество земли;
- модуль и его техническое описание;
- уровень помех;
- частота контроллера;
- выбранный SPI mode.
SPI mode задаётся параметрами clock polarity и clock phase: CPOL и CPHA. Часто используется mode 0, но не всегда. Если режим неправильный, устройство может не отвечать или возвращать некорректные данные.
В большинстве готовых библиотек режим уже задан. Но если ты подключаешь редкий модуль или пишешь низкоуровневую настройку, нужно смотреть техническое описание.
3.3V и 5V¶
Как и другие интерфейсы, SPI не гарантирует безопасные уровни напряжения.
ESP32, RP2040, STM32 и многие современные модули работают с 3.3V логикой. Arduino Uno/Nano часто использует 5V.
Перед подключением проверь:
- питание модуля;
- уровень логики
SCK,MOSI,MISO,CS; - есть ли согласование уровней;
- допускает ли модуль
5Vна сигнальных входах; - допускает ли вход контроллера
5V.
Например, RC522 обычно требует 3.3V питания и логики. Подключать его к 5V Arduino без согласования уровней - плохая идея.
SPI в Klipper¶
В Klipper SPI используется для разных устройств: TMC-драйверов, акселерометров, некоторых дисплеев и датчиков.
В конфигурации могут встречаться:
cs_pin- пин выбора устройства;spi_bus- аппаратная SPI-шина;spi_speed- скорость в Hz;spi_software_sclk_pin;spi_software_mosi_pin;spi_software_miso_pin.
Если устройство подключено к дополнительной MCU, пины должны относиться к этой MCU. Как и в других разделах Klipper, распиновка конкретной платы важнее догадок.
Примерная идея:
[some_spi_device]
cs_pin: chamber:gpio9
spi_software_sclk_pin: chamber:gpio10
spi_software_mosi_pin: chamber:gpio11
spi_software_miso_pin: chamber:gpio12
Это не готовый конфиг для конкретного устройства, а иллюстрация: все SPI-пины должны быть на той MCU, к которой реально подключён модуль.
Длина проводов и помехи¶
SPI может работать быстро, но не любит длинную неаккуратную проводку.
Практические правила:
- держать
SCK,MOSI,MISO,CSкороткими; - вести рядом с
GND; - не вести параллельно проводам нагревателя и моторов;
- снижать
spi_speed, если есть ошибки; - использовать нормальные разъёмы;
- не тянуть SPI через весь принтер без причины;
- для удалённых узлов чаще выбирать CAN, UART/RS-485 или отдельную MCU рядом с модулем.
Особенно чувствительна линия SCK: это тактовый сигнал. Если он грязный, всё общение может стать нестабильным.
SPI и RC522¶
RC522 - хороший пример SPI-модуля с путаницей в названиях.
На многих RC522-платах пин SDA на самом деле используется как SS/CS для SPI. Это не I2C SDA.
Для RC522 обычно нужны:
3.3V;GND;SCK;MOSI;MISO;SDA/SS/CS;RST;- иногда
IRQ, но в простых проектах часто не используется.
Подробная схема есть в практической статье: Подключение RFID-считывателя.
Что проверить перед подключением¶
Перед подключением SPI-модуля проверь:
- питание модуля;
- уровень логики;
- распиновка конкретной платы;
- где
SCK,MOSI,MISO,CS; - нужен ли
RST,DC,IRQили другой дополнительный пин; - какой
CSназначен устройству; - не конфликтует ли
CSс другим модулем; - нужен ли hardware SPI или software SPI;
- какую скорость рекомендует документация;
- поддерживает ли прошивка этот модуль.
Типовые ошибки¶
- перепутали
MOSIиMISO; - забыли
CS; - подключили два устройства к одному
CS; - не подключили общий
GND; - подали
5Vна3.3VSPI-модуль; - приняли
SDAна RC522 за I2CSDA; - выбрали слишком высокую скорость;
- сделали слишком длинные провода;
- подключили модуль к одной MCU, а пины указали от другой;
- считают SPI силовым интерфейсом для управления нагрузкой.
Главное¶
SPI - быстрый интерфейс для модулей рядом с контроллером. Обычно нужны SCK, MOSI, MISO, CS, питание и GND.
Главное отличие от I2C: у SPI обычно нет адресов, а каждое устройство выбирается отдельным CS. Перед подключением нужно проверить распиновку, уровни логики, скорость, длину проводов и поддержку в прошивке.
Материалы по теме¶
- SparkFun: Serial Peripheral Interface - практическое объяснение SPI, линий данных, новых названий PICO/POCI и базовой логики обмена.
- SparkFun: SPI Chip Select - зачем нужен
CSи как подключают несколько SPI-устройств. - Adafruit: SPI Devices - сравнение SPI с I2C, отдельный
CS, speed, polarity/phase и ограничения. - DigiKey: SPI Simplifies Device Communication - варианты подключения нескольких SPI-устройств и роль
CS. - Klipper Configuration Reference: Common SPI settings - параметры
spi_speed,spi_bus, software SPI иcs_pinв Klipper.