Перейти к содержанию

Интерфейс 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 - общий минус;
  • питание модуля.

Схема с двумя устройствами:

SPI: основная операция обмена между главным и подчинённым устройством

Источник: 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.3V SPI-модуль;
  • приняли SDA на RC522 за I2C SDA;
  • выбрали слишком высокую скорость;
  • сделали слишком длинные провода;
  • подключили модуль к одной MCU, а пины указали от другой;
  • считают SPI силовым интерфейсом для управления нагрузкой.

Главное

SPI - быстрый интерфейс для модулей рядом с контроллером. Обычно нужны SCK, MOSI, MISO, CS, питание и GND.

Главное отличие от I2C: у SPI обычно нет адресов, а каждое устройство выбирается отдельным CS. Перед подключением нужно проверить распиновку, уровни логики, скорость, длину проводов и поддержку в прошивке.

Материалы по теме