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

Интерфейс SPI

SPI — синхронный последовательный интерфейс для связи микросхем на одной плате: ведущий задаёт такт SCLK, данные одновременно идут в обе стороны по MOSI и MISO, а нужное ведомое выбирается своей линией CS. Ниже — режимы CPOL и CPHA, подключение нескольких устройств, пределы скорости и примеры для AVR, Arduino и STM32.

Обновлено Редакция GAW

SPI (Serial Peripheral Interface) — синхронный последовательный интерфейс, который Motorola придумала для своих микроконтроллеров; SPI и QSPI — её товарные знаки. Одним из первых кристаллов с аппаратным SPI сама компания называет MC68HC05C4 из семейства M68HC05, а в руководстве к 32-разрядному MC68332 1990 года модуль QSPI описан как улучшенная версия SPI семейств M68HC11 и M68HC05. Участники обмена неравноправны: ведущий (master), обычно микроконтроллер, генерирует тактовый сигнал и выбирает ведомое (slave) отдельной линией. По SPI подключают флеш-память и SD-карты, дисплеи, АЦП и ЦАП, радиомодули, сдвиговые регистры и драйверы светодиодов, а через выводы SPI прошивают микроконтроллеры AVR.

Единого стандарта у SPI нет. В документации ядра Linux его называют простым стандартом де-факто — слишком простым, чтобы обзавестись органом стандартизации, а Analog Devices в AN-1248 уточняет: де-факто, но не де-юре. Ближе всего к эталону — описания модулей SPI в документации Motorola (теперь NXP), но производители ведомых ими не связаны. Отсюда практическое правило: режим тактирования, длину слова, порядок битов, полярность CS, предельную частоту и уровни сигналов каждый раз берут из даташита конкретной микросхемы. Не случайно драйвер SPI в Linux описывает устройство целым набором признаков: режим 0–3, SPI_CS_HIGH (выбор единицей), SPI_LSB_FIRST, SPI_3WIRE, SPI_TX_QUAD и другие.

Коротко

  • Четыре сигнала: тактовый SCLK от ведущего, данные MOSI (от ведущего) и MISO (к ведущему), выбор ведомого CS — почти всегда активный низким уровнем. Выходы обычно двухтактные, подтягивающие резисторы для работы не нужны.
  • Обмен полнодуплексный: за каждый такт ведущий и ведомое передают друг другу по биту, за 8 тактов — по байту.
  • Четыре режима 0–3 задают полярность такта CPOL и фазу CPHA. Режим ведущего должен совпадать с режимом ведомого; чаще всего встречаются режимы 0 и 3.
  • Адресов нет: каждому ведомому нужна своя линия CS, либо ведомые соединяют в цепочку (daisy chain) с общим CS.
  • Частоту ограничивают ведомое и задержки: от 100–400 кГц у SD-карты при инициализации до 133 МГц у флеш-памяти W25Q64JV. Интерфейс рассчитан на связь в пределах платы.
  • Нет подтверждений, контроля ошибок и арбитража — если они нужны, их задаёт протокол конкретной микросхемы.

Сигналы SPI: SCLK, MOSI, MISO и CS

  • SCLK (SCK, CLK) — тактовый сигнал. Его генерирует только ведущий, и обмен идёт, только пока есть такты: нет данных — нет и такта.
  • MOSI (Master Out, Slave In) — данные от ведущего к ведомым. У ведомого этот вход обычно называется SDI, DI, DIN или SI.
  • MISO (Master In, Slave Out) — данные от ведомого к ведущему; у ведомого это выход SDO, DO, DOUT или SO. Пока ведомое не выбрано, его выход обязан находиться в высокоимпедансном состоянии (Z), иначе ведомые на общей линии MISO мешают друг другу.
  • CS (Chip Select), он же SS (Slave Select) — выбор ведомого. Ведомое с CS = 1 не реагирует на SCLK и MOSI. Фронты CS обрамляют транзакцию: по спаду ведомое начинает приём с первого бита, по подъёму многие микросхемы исполняют принятую команду или защёлкивают данные.

Имена сигналов в даташитах разные — их разнообразие перечисляет и AN-1248:

СигналКлассическое имяКак ещё называют у ведомыхНовые имена
ТактSCLK, SCKCLK; SCL у контроллеров дисплеевSCK
Данные к ведомомуMOSISDI, DI, DIN, SI; SDA у контроллеров дисплеевSDI у ведомого; PICO, ранее COPI
Данные к ведущемуMISOSDO, DO, DOUT, SOSDO у ведомого; POCI, ранее CIPO
Выбор ведомогоSS, CS/CS, CSB, CSX, CE, SYNC, LOADCS

Пары master/slave и MOSI/MISO постепенно уходят из документации. Open Source Hardware Association предлагает называть выводы с точки зрения самой микросхемы: SDO — выход данных, SDI — вход, CS — выбор. Для устройств, которые бывают и ведущим, и ведомым, в текущей редакции резолюции введены PICO и POCI (peripheral in / controller out и наоборот), в первой редакции 2020 года были COPI и CIPO. Analog Devices пишет main и subnode, Microchip в даташитах серии AVR DA — host и client, Linux — host и target. Смысл сигналов от переименований не меняется; дальше в статье — «ведущий», «ведомое», MOSI и MISO, как в даташите ATmega328P.

Полный дуплекс: кольцо из двух сдвиговых регистров

Внутри SPI устроен предельно просто. У ведущего и у ведомого есть по сдвиговому регистру, и линии MOSI и MISO замыкают их в кольцо — в руководстве Motorola так и сказано: два 8-разрядных регистра образуют один распределённый 16-разрядный. Каждый такт SCLK выдвигает по биту из обоих регистров и вдвигает бит партнёра. Через 8 тактов содержимое поменялось местами: ведущий получил байт ведомого, ведомое — байт ведущего.

Полный дуплекс SPI: кольцо из сдвиговых регистров ведущего и ведомогоУ ведущего и ведомого по 8-разрядному сдвиговому регистру. Старший бит ведущего уходит по MOSI в младший разряд регистра ведомого, старший бит ведомого уходит по MISO в младший разряд регистра ведущего. Тактовый генератор ведущего сдвигает оба регистра одновременно; за 8 тактов SCLK байты меняются местами. Линия CS выбирает ведомое.ВедущиймикроконтроллерВедомоефлеш, АЦП, дисплей…76543210MSBLSB76543210MSBLSBсдвиговый регистрсдвиговый регистрMOSIMISOгенератор SCLKSCLKGPIOCSCS8 тактов SCLK — и байты ведущего и ведомого поменялись местами
Ведущий и ведомое обмениваются содержимым сдвиговых регистров: старший бит каждого уходит партнёру, младший разряд принимает бит партнёра

Из этой схемы следуют три правила, о которых полезно помнить при написании драйвера:

  1. Чтобы прочитать, нужно передать. Такты идут только во время передачи, поэтому при чтении ведущий отправляет «пустые» байты — обычно 0x00 или 0xFF, ведомое их игнорирует.
  2. При записи всегда что-то приходит обратно. Ненужный принятый байт просто отбрасывают.
  3. Приём не подтверждается. Если ведомого нет или оно не выбрано, ведущий всё равно «прочитает» байт — тот уровень, что держит подтяжка или висящая в воздухе линия MISO. Ответ 0xFF или 0x00 во всех байтах — частый признак обрыва.

Многие микросхемы используют дуплекс лишь формально: сначала принимают команду, потом отвечают, как флеш-память. Полудуплексный протокол поверх полнодуплексного железа — нормальная практика, её отмечает и документация Linux.

Режимы SPI: CPOL и CPHA

Два бита задают, как данные привязаны к такту. CPOL (clock polarity) — уровень SCLK в покое: 0 — низкий, 1 — высокий. CPHA (clock phase) — на каком фронте берётся бит: при CPHA = 0 на первом фронте после спада CS и далее на нечётных, при CPHA = 1 — на втором и далее на чётных. Данные меняются на противоположном фронте, поэтому у сигнала есть полпериода, чтобы установиться. Номер режима — двоичное число из CPOL (старший бит) и CPHA (младший).

РежимCPOLCPHASCLK в покоеВыборка битаСмена данных
000низкийпо нарастающему фронтупо спадающему фронту
101низкийпо спадающему фронтупо нарастающему фронту
210высокийпо спадающему фронтупо нарастающему фронту
311высокийпо нарастающему фронтупо спадающему фронту
Режимы SPI 0, 1, 2 и 3: полярность CPOL и фаза CPHAПередача байта старшим битом вперёд в четырёх режимах. CPOL задаёт уровень SCLK в покое: 0 — низкий (режимы 0 и 1), 1 — высокий (режимы 2 и 3). При CPHA = 0 первый бит выставляется по спаду CS, а выборка идёт на нечётных фронтах SCLK — 1, 3, …, 15. При CPHA = 1 бит выставляется первым фронтом, а выборка идёт на чётных фронтах — 2, 4, …, 16. Пока CS в единице, выход ведомого в высокоимпедансном состоянии.CPHA = 0 (режимы 0 и 2): выборка на фронтах 1, 3, …, 1512345678910111213141516CSSCLK, режим 0CPOL = 0SCLK, режим 2CPOL = 1MOSI, MISOD7D6D5D4D3D2D1D0CPHA = 1 (режимы 1 и 3): выборка на фронтах 2, 4, …, 1612345678910111213141516CSSCLK, режим 1CPOL = 0SCLK, режим 3CPOL = 1MOSI, MISOD7D6D5D4D3D2D1D0выборка битавыход ведомого в Zданные не определены
Байт старшим битом вперёд в четырёх режимах. Пунктир — моменты выборки; при CPHA = 0 первый бит стоит на линии уже после спада CS, при CPHA = 1 его выставляет первый фронт SCLK

Режимы 0 и 3 отличаются только уровнем SCLK в покое: в обоих бит захватывается по нарастающему фронту, а меняется по спадающему. Поэтому многие микросхемы поддерживают оба — например, флеш W25Q64JV, АЦП MCP3008 и SD-карты в режиме SPI. Ведомое узнаёт полярность по уровню SCLK в момент спада CS, так что ведущий должен перевести такт в нужный уровень покоя до выбора ведомого. То же верно для пары режимов 1 и 2. Чаще всего встречаются режимы 0 и 3 — так пишет и документация Linux. Режим 1 используют, например, АЦП TI ADS1118: такт в покое низкий, данные защёлкиваются по спаду SCLK.

Как определить режим SPI по даташиту

Фраза «uses SPI mode 0» есть далеко не в каждом даташите, зато временная диаграмма интерфейса есть всегда. Способ, который предлагает Analog Devices в AN-1248:

  1. Уровень SCLK в момент спада CS даёт CPOL: низкий — CPOL = 0, высокий — CPOL = 1. Если нарисованы оба варианта (у W25Q64JV — подписи Mode 0 и Mode 3), ведомое понимает обе полярности.
  2. Фронт выборки находят по времени установки и удержания входа (setup и hold, tSU, tDS, tDH): обе величины отсчитываются от фронта, по которому ведомое защёлкивает бит. Нарастающий фронт выборки при CPOL = 0 — это режим 0, при CPOL = 1 — режим 3. Спадающий — режимы 1 и 2.
  3. Задержка выхода ведомого (tV, tDO, tCLQV) должна отсчитываться от противоположного фронта — это проверка, что фронт выборки найден верно.
  4. Обозначения вида «mode 0,0 and 1,1» — это пары (CPOL, CPHA), то есть режимы 0 и 3, как у MCP3008.

AN-1248 подчёркивает, что фаза определяется относительно полярности: «выборка по нарастающему фронту» означает CPHA = 0 при CPOL = 0, но CPHA = 1 при CPOL = 1. Поэтому смотрят сразу на оба признака.

Названия битов у разных производителей

У Motorola, AVR и в Linux биты называются CPOL и CPHA и значат одно и то же. В HAL для STM32 фаза записана словами: SPI_PHASE_1EDGE — это CPHA = 0, SPI_PHASE_2EDGE — CPHA = 1. А у Texas Instruments в модуле USCI микроконтроллеров MSP430 смысл бита фазы обратный: UCCKPH = 1 означает захват данных по первому фронту, то есть CPHA = 0, а UCCKPH = 0 — CPHA = 1. Перенося настройки между семействами, читайте описание бита, а не его название.

Если ведущий не умеет нужный режим, AN-1248 предлагает поставить инвертор в линию SCLK: он превращает режим 0 в режим 2, режим 1 — в режим 3 и обратно. Motorola описывала CPOL ровно так — как инвертор, включённый последовательно с SCK.

CPHA = 0 и спад CS

При CPHA = 0 первый бит должен стоять на линии ещё до первого фронта, поэтому ведомое выставляет его по спаду CS. В AN991 Motorola формулирует это так: при CPHA = 0 сдвиговый такт — это логическое ИЛИ сигналов SCK и SS, а при CPHA = 1 вывод SS работает просто как разрешение выхода. Отсюда особенность: ведомому в режиме с CPHA = 0 спад CS бывает нужен перед каждым байтом. Модуль SPI микроконтроллеров Motorola S12 в роли ведомого, если SS не поднимался между передачами, вместо нового содержимого регистра данных отправляет последний принятый байт.

Порядок битов и длина слова

Чаще всего слово передаётся старшим битом вперёд (MSB first). Младшим вперёд (LSB first) передачу переключают отдельной настройкой: бит DORD в AVR, LSBFE у Motorola, SPI_FIRSTBIT_LSB в HAL для STM32, LSBFIRST в Arduino. Порядок по умолчанию стоит проверять: в USCI микроконтроллеров MSP430 бит UCMSB после сброса равен нулю, то есть первым идёт младший бит.

Длину слова SPI тоже не фиксирует. Модуль SPI в AVR передаёт только байты, STM32F4 — 8 или 16 бит, QSPI в Motorola 68332 — от 8 до 16 бит за передачу, USCI в MSP430 — 7 или 8. Ведомые задают свою длину:

  • MAX7219 принимает 16-битные пакеты: 4 бита без значения, 4 бита адреса регистра и 8 бит данных, старшим вперёд.
  • SSD1306 в трёхпроводном режиме вместо отдельной линии D/C# получает 9-битное слово: бит «команда или данные» и байт.
  • MCP3008 выдаёт 10-битный результат после 5 бит команды. Даташит предлагает обмен тремя байтами: в первом — семь ведущих нулей и стартовый бит, во втором — режим и номер канала, ответ приходит в младших двух битах второго и в третьем байте.

Ведомое считает биты между спадом и подъёмом CS. Поэтому слово нестандартной длины можно дополнить до кратного восьми и передать за один кадр CS, если ведомое игнорирует лишние нули или такты, как MCP3008. Если же ведомое ждёт именно 9 бит подряд, как SSD1306 в трёхпроводном режиме, контроллеру нужна поддержка такой длины кадра или программная реализация.

Несколько ведомых на одной шине SPI

Адресов у SPI нет, поэтому ведомое выбирают линией CS. Способов подключения два: отдельный CS для каждого ведомого и цепочка с общим CS.

Отдельная линия CS на каждое ведомое

SCLK, MOSI и MISO общие, у каждого ведомого своя линия CS — её выдаёт обычный вывод GPIO ведущего. Низкий уровень в каждый момент может быть только на одной линии CS.

Подключение нескольких ведомых SPI с отдельными линиями CSЛинии SCLK, MOSI и MISO общие для трёх ведомых. Каждое ведомое выбирается своей линией CS от отдельного вывода ведущего. Невыбранные ведомые переводят выход SDO в высокоимпедансное состояние и не мешают выбранному.ВедущийМКSCLKMOSIMISOSCLKMOSIMISOSCKSDISDOВедомое 1флеш W25Q64CSCS1CS1SCKSDISDOВедомое 2АЦП MCP3008CSCS2CS2SCKSDISDOВедомое 3дисплей ILI9341CSCS3CS3SCLK, MOSI и MISO общие; при CS = 1 выход SDO ведомого в Z
Три ведомых на общей шине: SCLK, MOSI и MISO общие, выбор — отдельными линиями CS1–CS3

Схема работает только потому, что невыбранное ведомое переводит выход SDO в Z-состояние: так устроены и модули SPI Motorola, и W25Q64JV, у которой при /CS = 1 выход DO отключён. Если выбрать два ведомых одновременно, их выходы столкнутся на MISO — руководство Motorola отдельно предостерегает от этого.

Ещё два правила для такой шины:

  • Подтяжка CS. Пока микроконтроллер в сбросе или загружается, его выводы — входы, и линии CS «висят». Подтягивающий резистор к питанию ведомого, например 10 кОм, держит ведомые невыбранными. W25Q64JV прямо требует, чтобы /CS следовал за напряжением питания при включении и выключении, и предлагает для этого подтягивающий резистор.
  • Нагрузка. Каждый вход на общей линии добавляет ёмкость, и AN-1248 советует для параллельного подключения немного увеличить период такта. Число ведомых ограничено свободными выводами и допустимой частотой, а не протоколом.

Цепочка ведомых (daisy chain)

В цепочке все ведомые сидят на общих SCLK и CS, а данные проходят сквозь них: MOSI ведущего идёт на вход первого ведомого, его выход — на вход второго и так далее, выход последнего возвращается на MISO. Получается один длинный сдвиговый регистр. Для трёх 8-битных ведомых кадр CS длится 24 такта (пример из статьи Analog Dialogue), а порядок записи обратный: первым уходит слово для самого дальнего ведомого, последним — для ближнего. По подъёму CS каждое ведомое защёлкивает то, что оказалось в его регистре.

Цепочка ведомых SPI (daisy chain) с общим CSТри ведомых соединены последовательно: MOSI ведущего идёт на вход DIN первого, выход DOUT каждого ведомого — на вход следующего, выход последнего возвращается на MISO ведущего. SCLK и CS общие. За один кадр CS ведущий выдаёт 24 такта; слово, переданное первым, оказывается в последнем ведомом. По подъёму CS все ведомые защёлкивают принятые слова.ВедущийSCLKCSMOSIMISOSCLK и CS общие; по подъёму CS все ведомые защёлкивают словаSCKCSВедомое 1DINDOUTполучает 3-е словоSCKCSВедомое 2DINDOUTполучает 2-е словоSCKCSВедомое 3DINDOUTполучает 1-е словоDOUT ведомого 3 → MISOОдин кадр CS: 3 × 8 = 24 такта SCLK, первым уходит слово для ведомого 3
Цепочка: данные проходят через все ведомые, CS и SCLK общие. Первым уходит слово для ведомого 3

Примеры из даташитов:

  • MAX7219, драйвер светодиодных индикаторов. Данные со входа DIN появляются на выходе DOUT через 16,5 такта, выходы DOUT соединяют со входами DIN соседних микросхем, а все входы LOAD/CS — вместе. Чтобы записать регистр четвёртой микросхемы из четырёх, ведущий отправляет её 16-битное слово и за ним три слова «нет операции» (No-Op, адрес регистра 0); по подъёму LOAD/CS данные защёлкиваются во всех микросхемах.
  • 74HC595, сдвиговый регистр. Выход QH' предназначен для каскадирования: его соединяют со входом SER следующей микросхемы, а входы защёлки RCLK всех регистров — с общей линией, которая играет роль CS.

Цепочку поддерживают не все микросхемы: ведомое должно выдавать на выход то, что вдвинуто на вход, — это проверяют по даташиту. Задержки накапливаются вдоль цепочки, и AN-1248 советует при необходимости увеличить период такта. Некоторые микросхемы после включения работают как одиночные и переходят в режим цепочки только по команде; такую микросхему ставят первой, а её выход SDO, пока режим не включён, подтягивают резистором.

Когда ведомое не отпускает MISO

Z-состояние выхода при CS = 1 — это обязанность ведомого, но выполняют её не все:

  • SD-карты. В режиме SPI карта включает и выключает выход DO не по CS, а синхронно с SCLK. ChaN, автор библиотеки FatFs, советует после подъёма CS передать ещё один байт — только тогда карта отпустит MISO. Кроме того, сразу после включения карта ещё не работает как устройство SPI и может откликнуться на обмен с другими ведомыми, поэтому её инициализируют первой.
  • MAX7219. По даташиту выход DOUT никогда не переходит в Z — он предназначен только для цепочки, на общую линию MISO его не подключают. Вдобавок MAX7219 вдвигает данные по каждому фронту CLK независимо от LOAD; полностью совместимый с SPI вариант — MAX7221, который принимает такты только при низком CS.
  • Ведомые в режиме цепочки. AN-1248 предупреждает, что некоторые микросхемы в этом режиме не отключают SDO по CS. Тогда SDO на общую шину не подключают, а если без этого не обойтись, ставят последовательный резистор и отключают SDO командой в начале работы.

Универсальное решение — буфер с третьим состоянием между SDO такого ведомого и линией MISO, разрешаемый тем же CS: у 74LVC125A и 74AHCT125 выход отключается высоким уровнем на входе OE, поэтому его соединяют с CS напрямую. Когда не выбрано ни одно ведомое, линию MISO никто не держит, и вход ведущего «плавает». Подтяжка решает и это; для SD-карт она обязательна: по ChaN спецификации SD и MMC рекомендуют на DI и DO резисторы 50–100 кОм, а без подтяжки DO некоторые карты не проходят инициализацию.

Скорость SPI: от чего зависит предельная частота

Стандартной частоты у SPI нет: ведущий может тактировать хоть килогерцами, хоть десятками мегагерц, а потолок задаёт самое медленное звено. Сначала это само ведомое: минимальный период SCLK и длительности высокого и низкого уровня указаны в его даташите. Затем — время, за которое бит ведомого успевает дойти до ведущего.

При записи задержка линий почти не важна: такт и данные идут от ведущего по соседним проводам и задерживаются одинаково. При чтении сигнал проходит путь туда и обратно. Спад SCLK доходит до ведомого за время задержки линии tзд, ведомое выставляет бит через свою задержку выхода tV, бит возвращается ещё за tзд и должен установиться на входе ведущего за время tSU до нарастающего фронта выборки. В режимах 0 и 3 на всё это есть половина периода:

T2≥2tзд+tV+tSU,fmax=12(2tзд+tV+tSU)\frac{T}{2} \ge 2t_\text{зд} + t_V + t_{SU}, \qquad f_{max} = \frac{1}{2\left(2t_\text{зд} + t_V + t_{SU}\right)}
Временной бюджет чтения по SPI: задержки линии, выхода ведомого и установка у ведущегоРежим 0. Спад SCLK у ведущего доходит до ведомого через время задержки линии. Ведомое выставляет следующий бит через время задержки выхода tV, бит возвращается к ведущему ещё через задержку линии и должен установиться за время tSU до нарастающего фронта SCLK у ведущего, который наступает через половину периода после спада. Масштаб условный.SCLK у ведущегоSCLK у ведомогоMISO у ведомогопредыдущий битследующий битMISO у ведущегопредыдущий битследующий битTSCLK​/2 — половина периодафронт выборкиtзд​tV​ ведомогоtзд​запасtSU​
Чтение в режиме 0: задержка линии, задержка выхода ведомого, обратный путь и время установки у ведущего должны уложиться в половину периода SCLK. Масштаб условный

Примеры расчёта из первоисточников:

  • AN-1248. Ведомое с задержкой выхода 36 нс и ведущий с временем установки 10 нс: полупериод не короче 46 нс, и читать данные можно на частоте около 10 МГц.
  • SD-карта по ChaN. Задержка выхода карты — до 14 нс, предельная частота — 0,5/(td + tsu). ChaN отмечает, что у некоторых микроконтроллеров, с которыми он работал, встроенный SPI по времени установки ограничен частотой около 10 МГц, хотя карта работает до 20–25 МГц.
  • Длина проводов. В кабеле сигнал распространяется примерно за 5 нс на метр (TI, SLYT441). Возьмём W25Q64JV с задержкой выхода до 6 нс и ведущий с временем установки 10 нс, как в примере AN-1248. При 10 см проводов полупериод — не меньше 17 нс, то есть до 29 МГц; при метре кабеля — 26 нс и 19 МГц; при 10 м — 116 нс и 4,3 МГц.

Задержки в даташитах нормированы при определённой ёмкости нагрузки: у W25Q64JV — 30 пФ, у ILI9341 время доступа при чтении — тоже для 30 пФ. Каждый лишний вход на линии, разъём и сантиметры провода добавляют ёмкость, фронты затягиваются, и задержка выхода растёт. Поэтому быстрые ведомые ставят ближе к ведущему, а на нагруженной шине снижают частоту.

Наибольшая частота SCLK у типовых микросхем

МикросхемаНазначениеНаибольшая частота SCLKУсловия и примечания
Winbond W25Q64JVфлеш-память 64 Мбит133 МГцпри питании 3,0–3,6 В; 104 МГц при 2,7–3,0 В; команда чтения 03h — до 50 МГц
SD-карта в режиме SPIкарта памяти25 МГцво время инициализации 100–400 кГц; точный предел — поле TRAN_SPEED регистра CSD, у MMC обычно 20 МГц
Microchip MCP3008АЦП 10 бит, 8 каналов3,6 МГцпри 5 В; 1,35 МГц при 2,7 В
Ilitek ILI9341контроллер TFT-дисплея 240×32010 МГц запись, 6,7 МГц чтениепериод SCL не меньше 100 и 150 нс в 4-проводном режиме
Solomon Systech SSD1306контроллер OLED-дисплея 128×6410 МГцпериод не меньше 100 нс; по SPI возможна только запись
Maxim MAX7219драйвер светодиодных индикаторов10 МГцпериод CLK не меньше 100 нс
TI SN74HC595сдвиговый регистр25 МГцпри 4,5 В во всём диапазоне −40…+85 °C
ATmega328Pмикроконтроллер AVR8 МГц ведущим, 4 МГц ведомымпри тактовой частоте 16 МГц: fosc/2 и fosc/4

Частоты взяты из даташитов, ссылки — в списке источников. Реальный предел конкретной платы ниже табличного, если длинные провода, на шине много входов или ведущий не успевает по времени установки.

SPI на длинных линиях

Для кабеля в десятки и сотни метров обычный SPI не годится. В примере TI 100 м кабеля и приёмопередатчики дают задержку около 550 нс в одну сторону, поэтому данные ведомого отстают от такта на 1100 нс — 11 бит на скорости 10 Мбит/с. TI предлагает передавать такт обратно от ведомого вместе с данными и принимать их вторым портом SPI, настроенным ведомым, а сами сигналы вести дифференциальными драйверами RS-422 по витой паре с согласующими резисторами 100 Ом и гальванической развязкой — как в линиях RS-485.

Трёхпроводный, Dual и Quad SPI

Трёхпроводный SPI (полудуплекс)

Если данные никогда не передаются в обе стороны одновременно, MOSI и MISO можно объединить в одну двунаправленную линию — остаются SCLK, данные и CS. Такой режим был уже у Motorola: в двунаправленном режиме вывод MOSI ведущего становится линией MOMI (master out, master in), а MISO ведомого — SISO. В HAL для STM32 его включают параметром SPI_DIRECTION_1LINE, в Linux — флагом SPI_3WIRE. Быстрые АЦП Analog Devices по AN-877 обходятся одной линией SDIO: после команды чтения микросхема за половину периода SCLK переключает её со входа на выход.

Термин «трёхпроводный» неоднозначен. Так называют и обычный SPI без одной из линий данных: ЦАП нечего отвечать, а АЦП нечего принимать (AN-1248). SSD1306 в режиме «3-wire SPI» только принимает данные и кодирует признак «команда или данные» девятым битом. Какая схема имеется в виду, видно только по даташиту.

Dual SPI и Quad SPI (QSPI)

Для памяти скорость важнее дуплекса, поэтому флеш-микросхемы передают по 2 и 4 бита за такт. У W25Q64JV в режиме Dual выводы DI и DO становятся двунаправленными IO0 и IO1, в режиме Quad к ним добавляются IO2 и IO3 — бывшие /WP и /HOLD; Quad-команды работают только после установки бита QE в регистре состояния 2. При частоте 133 МГц это эквивалентно 266 МГц обычного SPI для Dual и 532 МГц для Quad. Команда у W25Q64JV всегда идёт по одной линии. В командах Fast Read Dual Output и Quad Output (3Bh, 6Bh) адрес тоже передаётся по одной, а данные — по двум или четырём; в командах Dual I/O и Quad I/O (BBh, EBh) по нескольким линиям идут и адрес, и данные. Обмен в таких режимах полудуплексный.

Аббревиатура QSPI исторически двусмысленна. Сегодня это почти всегда Quad SPI, а в микроконтроллерах Motorola серии 68300 так назывался Queued SPI — модуль, который выполнял очередь до 16 передач по 8–16 бит без участия процессора.

Целостность сигнала: провода, резисторы, общий провод

SPI — несимметричный интерфейс: каждый сигнал — это напряжение провода относительно общего провода, и помеха на проводе попадает прямо в данные. Чаще всего страдает SCLK: перепад от звона или наводки, пересёкший порог входа, ведомое примет за лишний такт, и все следующие биты сдвинутся.

Когда дорожка становится линией передачи

Отражения зависят от длительности фронта, а не от частоты. Analog Devices в MT-097 предлагает согласовывать дорожку, если задержка распространения в одну сторону не меньше половины времени нарастания фронта, а консервативное правило — 2 дюйма (около 5 см) дорожки на каждую наносекунду фронта. Выходы микроконтроллеров переключаются за единицы наносекунд: типовое время нарастания SCK у ATmega328P — 3,6 нс, и для такого фронта «длинной» по этому правилу оказывается дорожка около 18 см даже при частоте в 1 МГц.

Последовательный резистор у источника

Самое дешёвое средство — резистор последовательно с выходом у самого вывода источника: на SCLK и MOSI — у ведущего, на MISO — у ведомого. По MT-097 сопротивление резистора вместе с выходным сопротивлением драйвера (около 10 Ом) должно быть равно волновому сопротивлению линии: для дорожки 50 Ом это около 39 Ом. Такое согласование гасит отражённую волну у источника, но рассчитано на одну нагрузку в конце линии без промежуточных отводов. На короткой линии резистор работает как фильтр: вместе с входной ёмкостью КМОП-входа, по MT-097 это 5–10 пФ, он затягивает фронт до 2,2·R·C. Номинал подбирают так, чтобы фронт был достаточно быстрым для временного бюджета, но не быстрее.

Общий провод

Ток каждого сигнала возвращается к источнику по общему проводу. Соединяя платы шлейфом, прокладывайте общий провод вместе с сигнальными и подключайте его на обоих концах; на плате ведите SCLK над сплошным полигоном земли без разрывов. Без общего провода между платами SPI не работает вовсе: уровни отсчитываются от разных потенциалов.

Согласование уровней 3,3 и 5 В

Arduino Uno и платы на ATmega328P с питанием 5 В часто соединяют с модулями на 3,3 В — флеш-памятью, SD-картами, дисплеями. Напрямую это небезопасно в обе стороны:

  • 5 В на входах микросхемы 3,3 В. W25Q64JV допускает на любом выводе не больше VCC + 0,4 В — 3,7 В при питании 3,3 В. Выходы Uno дают 5 В, и это превышение абсолютного максимума.
  • 3,3 В на входе ATmega328P с питанием 5 В. Высокий уровень гарантирован от 0,6·VCC, то есть от 3,0 В. Выход W25Q64JV даёт не меньше VCC − 0,2 В при токе 100 мкА, около 3,1 В, — запас всего 0,1 В.
  • Обратный случай. 3,3-вольтовый микроконтроллер не всегда может управлять 5-вольтовым ведомым: MAX7219 при питании 5 В гарантированно принимает за единицу только напряжение от 3,5 В.
Согласование уровней SPI: Arduino Uno 5 В и флеш-память W25Q64JV 3,3 ВСигналы SCK, MOSI и CS от Arduino Uno проходят через буферы 74LVC125A с питанием 3,3 В, входы которых допускают 5,5 В. Выход DO флеш-памяти идёт на вывод MISO через буфер 74AHCT125 с питанием 5 В и порогом 2 В; его выход разрешается низким уровнем CS, поэтому при невыбранной памяти линия MISO свободна. Резистор R1 10 кОм подтягивает CS к 5 В, пока микроконтроллер в сбросе. Выводы WP и HOLD памяти подключены к 3,3 В.Arduino UnoATmega328P, 5 ВD10 (SS)D12 (MISO)D13 (SCK)D11 (MOSI)W25Q64JVфлеш-память, 3,3 В1 CS2 DO6 CLK5 DI3 WP, 7 HOLD → +3,3 В+5 ВR110 кОм1111▽OE74LVC125A: питание 3,3 В, входы до 5,5 В74AHCT125: питание 5 В, порог входа 2 В
Arduino Uno и флеш-память на 3,3 В: SCK, MOSI и CS понижаются буферами 74LVC125A, MISO повышается буфером 74AHCT125, который включается только при выбранной памяти. У выводов питания микросхем — конденсаторы 100 нФ (на схеме не показаны)

Чем согласовать:

  • Вниз, 5 → 3,3 В — буфер 74LVC125A с питанием 3,3 В: его входы допускают до 5,5 В, задержка не больше 4,8 нс при 3,3 В. Для медленных линий годится и резистивный делитель, например 1 кОм последовательно и 2 кОм на общий провод: из 5 В получается 3,33 В. Но эквивалентное сопротивление делителя — 667 Ом, и с входной ёмкостью 10 пФ фронт затягивается примерно до 2,2 · 667 Ом · 10 пФ ≈ 15 нс, поэтому делитель подходит для частот в единицы мегагерц.
  • Вверх, 3,3 → 5 В — буфер 74AHCT125 с питанием 5 В: его входы совместимы с ТТЛ, высокий уровень — от 2 В. Его выход отключается высоким уровнем на OE, поэтому OE соединяют с CS — линия MISO свободна, когда память не выбрана.
  • Двунаправленные трансляторы вроде TXB0104 с автоматическим определением направления подходят для SPI, потому что все линии двухтактные; TI нормирует его до 100 Мбит/с, если низковольтная сторона питается от 2,5 или 3,3 В. Но транслирует он только двухтактные выходы, а внешние подтягивающие резисторы рекомендует не меньше 50 кОм.
  • Общее питание 3,3 В. ATmega328P работает и от 3,3 В, но тогда по даташиту гарантирована тактовая частота до 10 МГц (при 2,7–5,5 В), а не 16 МГц, как на Uno.

SPI в микроконтроллерах AVR на примере ATmega328P

Модуль SPI в AVR унаследовал устройство модуля Motorola: регистр управления SPCR у MC68HC05C4 содержит те же биты SPIE, SPE, MSTR, CPOL, CPHA, SPR1 и SPR0 на тех же местах, а в AVR на свободное место встал бит порядка DORD. У ATmega328P выводы SPI — порт B: PB2 — SS, PB3 — MOSI, PB4 — MISO, PB5 — SCK; на Arduino Uno это цифровые выводы 10, 11, 12 и 13 и разъём ICSP. Через эти же выводы микроконтроллер прошивают по ISP — подробнее о семействе в разделе AVR.

Регистр76543210
SPCRSPIESPEDORDMSTRCPOLCPHASPR1SPR0
SPSRSPIFWCOL—————SPI2X
  • SPE включает модуль, MSTR выбирает режим ведущего, CPOL и CPHA — режим SPI, DORD = 1 — младший бит первым, SPIE разрешает прерывание по окончании передачи.
  • SPDR — регистр данных: запись в него начинает передачу, чтение возвращает принятый байт.
  • SPIF поднимается, когда байт выдвинут. Сбрасывается он аппаратно при входе в прерывание либо чтением SPSR с последующим обращением к SPDR.
  • WCOL сигнализирует, что SPDR записали во время передачи. Передатчик буферизован однократно: следующий байт можно писать только после окончания сдвига. Приёмник — двукратно, но принятый байт нужно прочитать до окончания следующего.

Частоту SCK в режиме ведущего задают биты SPR1, SPR0 и SPI2X (таблица 19-5 даташита):

SPI2XSPR1SPR0Частота SCKПри fosc = 16 МГц
100fosc/28 МГц
000fosc/44 МГц
101fosc/82 МГц
001fosc/161 МГц
110fosc/32500 кГц
010fosc/64250 кГц
111fosc/64250 кГц
011fosc/128125 кГц

В режиме ведомого ATmega328P гарантированно работает при SCK не выше fosc/4, а высокий и низкий уровни SCK должны длиться дольше двух тактов процессора. Если нужен второй ведущий SPI, его даёт USART0 в режиме MSPIM: все четыре режима, оба порядка битов, двойная буферизация передачи и частота до fosc/2.

Ловушка с выводом SS

В режиме ведущего вывод SS (PB2) не управляет ведомым сам — им управляет программа, а модуль лишь следит за выводом, если тот настроен как вход. Появление нуля на таком входе модуль считает признаком того, что его выбрал другой ведущий: бит MSTR сбрасывается, SPI становится ведомым, SCK и MOSI превращаются во входы, а флаг SPIF поднимается. Это тот же механизм, который Motorola называет mode fault и который нужен в системах с несколькими ведущими.

Правило простое: в режиме ведущего делайте PB2 выходом, даже если CS ведомого подключён к другому выводу, или держите его входом с гарантированной единицей. Так поступает и Arduino: SPI.begin() переводит SS в выход, а в комментарии к коду прямо предупреждает, что низкий уровень на SS-входе переключит SPI в режим ведомого.

Пример на C: чтение JEDEC ID флеш-памяти W25Q64

Команда Read JEDEC ID (9Fh), по даташиту Winbond, совместима со стандартом JEDEC для последовательной памяти с SPI, принятым в 2003 году, и удобна для первой проверки связи: ответ заранее известен. Обмен по даташиту: опустить /CS, передать 9Fh, принять три байта — код производителя (EFh у Winbond), тип памяти и ёмкость, — поднять /CS. W25Q64JV поддерживает режимы 0 и 3, байты идут старшим битом вперёд.

Чтение JEDEC ID флеш-памяти W25Q64JV по SPI, команда 9FhCS опускается в ноль на 32 такта. За первые 8 тактов ведущий передаёт по MOSI команду 9Fh, выход флеш-памяти в это время в высокоимпедансном состоянии. За следующие 24 такта ведущий передаёт любые байты, а память отвечает по MISO тремя байтами: EFh — производитель Winbond, 40h — тип памяти, 17h — ёмкость 64 Мбит. Затем CS поднимается.CSMOSIMISO9Fhкоманда00hлюбой байт00hлюбой байт00hлюбой байтEFhпроизводитель Winbond40hтип памяти17hёмкость 64 Мбитвыход памяти в Zтакты 0–7такты 8–15такты 16–23такты 24–31Все байты — старшим битом вперёд, режим 0 или 3. Ответ W25Q64JV-IQ/JQ: EF 40 17.
Чтение JEDEC ID: 8 тактов команды и 24 такта ответа в одном кадре CS. Пока ведущий передаёт команду, выход памяти отключён
БайтMOSI (ведущий)MISO (W25Q64JV)Смысл
10x9FZкоманда Read JEDEC ID
20x000xEFпроизводитель — Winbond
30x000x40тип памяти
40x000x17ёмкость — 64 Мбит

У W25Q64JV-IQ и -JQ ответ — EF 40 17, у вариантов -IM и -JM — EF 70 17. Код на регистрах для ATmega328P с тактовой частотой 16 МГц; /CS памяти подключён к PB2, это заодно решает проблему вывода SS:

#include <avr/io.h>
#include <stdint.h>

#define FLASH_CS_LOW()  (PORTB &= ~(1 << PB2))
#define FLASH_CS_HIGH() (PORTB |= (1 << PB2))

void spi_init(void) {
  PORTB |= (1 << PB2);                           /* /CS high before the pin becomes an output */
  DDRB |= (1 << PB2) | (1 << PB3) | (1 << PB5);  /* SS, MOSI, SCK out; MISO is forced to input */
  SPCR = (1 << SPE) | (1 << MSTR);               /* master, mode 0, MSB first */
  SPSR = (1 << SPI2X);                           /* fosc/2 = 8 MHz at 16 MHz */
}

uint8_t spi_transfer(uint8_t data) {
  SPDR = data;                                   /* writing SPDR starts eight SCK pulses */
  while (!(SPSR & (1 << SPIF))) {}               /* wait until the byte has been shifted */
  return SPDR;                                   /* byte received on MISO at the same time */
}

/* Returns 0xEF4017 for a W25Q64JV-IQ/JQ: manufacturer, memory type, capacity. */
uint32_t flash_read_jedec_id(void) {
  uint32_t id;
  FLASH_CS_LOW();
  spi_transfer(0x9F);                            /* the byte clocked in here is ignored */
  id = (uint32_t)spi_transfer(0x00) << 16;
  id |= (uint32_t)spi_transfer(0x00) << 8;
  id |= spi_transfer(0x00);
  FLASH_CS_HIGH();
  return id;
}

Если пришло 0x000000 или 0xFFFFFF, ведомое не отвечает: проверьте питание и общий провод, /CS, линию MISO и уровни. Память на 3,3 В подключайте к Arduino Uno только через преобразователь уровней.

Записывать во флеш-память сложнее. Перед каждой командой записи или стирания нужна команда Write Enable (06h), а запись страницы (02h) W25Q64JV выполняет, только если /CS поднят после восьмого бита последнего байта, то есть на границе байта, — иначе команда не выполняется. Окончание записи определяют по биту BUSY регистра состояния 1, который читают командой 05h.

SPI в Arduino и STM32

Arduino: SPI.h и SPISettings

Библиотека SPI в Arduino скрывает регистры, но не CS: выбор ведомого — обычный digitalWrite(). Настройки передаются объектом SPISettings(частота, порядок битов, режим) в SPI.beginTransaction(). Для AVR библиотека выбирает наибольшую частоту, которая не превышает заданную, поэтому на Uno с кварцем 16 МГц запрос 20 МГц даст 8 МГц, а SPISettings() без параметров — это 4 МГц, MSBFIRST и SPI_MODE0. Пара beginTransaction() и endTransaction() заново применяет настройки своего ведомого и защищает обмен от прерываний, которые тоже работают с SPI и зарегистрированы через SPI.usingInterrupt().

#include <SPI.h>

const uint8_t FLASH_CS = 10;  // D10 = SS on Arduino Uno

void setup() {
  Serial.begin(115200);
  pinMode(FLASH_CS, OUTPUT);
  digitalWrite(FLASH_CS, HIGH);
  SPI.begin();

  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  digitalWrite(FLASH_CS, LOW);
  SPI.transfer(0x9F);                   // Read JEDEC ID
  uint8_t manufacturer = SPI.transfer(0x00);
  uint8_t memoryType = SPI.transfer(0x00);
  uint8_t capacity = SPI.transfer(0x00);
  digitalWrite(FLASH_CS, HIGH);
  SPI.endTransaction();

  Serial.print(manufacturer, HEX);      // EF
  Serial.print(' ');
  Serial.print(memoryType, HEX);        // 40
  Serial.print(' ');
  Serial.println(capacity, HEX);        // 17 = 64 Mbit
}

void loop() {}

STM32: HAL

В HAL для STM32 параметры SPI собраны в структуре SPI_InitTypeDef: режим ведущего или ведомого, направление (SPI_DIRECTION_2LINES — обычный дуплекс, SPI_DIRECTION_2LINES_RXONLY — только приём, SPI_DIRECTION_1LINE — трёхпроводный режим), длина кадра (в серии F4 — 8 или 16 бит), полярность и фаза, управление NSS, делитель частоты шины от 2 до 256 и порядок битов. CS проще всего вести обычным выводом GPIO, выбрав SPI_NSS_SOFT, — так кадр CS охватывает ровно ту транзакцию, которую требует ведомое.

SPI_HandleTypeDef hspi1;

void flash_spi_init(void) {
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;          /* CPOL = 0 */
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;              /* CPHA = 0: mode 0 */
  hspi1.Init.NSS = SPI_NSS_SOFT;                      /* CS is an ordinary GPIO */
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  HAL_SPI_Init(&hspi1);
}

/* GPIO and clock setup are omitted; /CS of the flash is on PA4. */
uint32_t flash_read_jedec_id(void) {
  uint8_t tx[4] = {0x9F, 0x00, 0x00, 0x00};
  uint8_t rx[4] = {0};
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
  HAL_SPI_TransmitReceive(&hspi1, tx, rx, sizeof tx, 10);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
  return ((uint32_t)rx[1] << 16) | ((uint32_t)rx[2] << 8) | rx[3];
}

HAL_SPI_TransmitReceive() выдаёт и принимает одновременно, как и сам интерфейс: первый принятый байт приходит, пока передаётся команда, и поэтому отбрасывается.

SPI или I²C: сравнение и выбор

Оба интерфейса рассчитаны на связь микросхем в пределах платы, но устроены противоположно. Подробно о второй шине — в статье про I²C.

СвойствоSPII²C
ЛинииSCLK, MOSI, MISO и по CS на каждое ведомоеSDA и SCL на все устройства
Выбор ведомогоотдельной линией CS7-битным адресом в первом байте
Направление обменаполный дуплексполудуплекс
Скоростьот килогерц до десятков мегагерц, предел задаёт микросхема100 и 400 кбит/с, 1 Мбит/с в Fm+, 3,4 Мбит/с в Hs
Выходыдвухтактные, подтяжки не нужныоткрытый сток, нужны подтягивающие резисторы
Подтверждение приёманетACK или NACK после каждого байта
Несколько ведущихне предусмотрено; у Motorola есть только обнаружение конфликта (mode fault)арбитраж на шине
Спецификациянет, стандарт де-фактоNXP UM10204
Типичные устройствафлеш-память, SD-карты, дисплеи, быстрые АЦП и ЦАПдатчики, EEPROM, часы реального времени, расширители портов

Когда что выбирать:

  • SPI — когда важны скорость и поток данных: флеш-память и SD-карты, дисплеи, АЦП с высокой частотой выборки. Двухтактные выходы дают быстрые фронты, а отсутствие подтяжек — меньший статический ток.
  • I²C — когда устройств много, а выводов мало: десяток датчиков на двух линиях, у каждого свой адрес, и ведущий сразу видит по ACK, ответило ли устройство.
  • Оба сразу — обычная практика: датчики и часы на I²C, память и дисплей на SPI. Некоторые микросхемы умеют и то и другое: датчики Bosch BMP280 и BME280 работают по I²C, если вывод CSB подключён к питанию, и по SPI в режимах 0 и 3, если CSB прижат к нулю.

Типичные ошибки SPI и отладка

СимптомВероятная причинаЧто проверить
Во всех байтах 0xFF или 0x00ведомое не выбрано, нет питания или общего провода, обрыв MISOуровень CS во время обмена, питание и общий провод ведомого, MISO осциллографом
Данные сдвинуты на бит или верны через разне тот режим CPOL/CPHAрежим по даташиту ведомого; выборка должна приходиться на середину бита
Ведомое отвечает на первую команду, дальше мусорCS не поднимается между командамиграницы кадров CS на логическом анализаторе
Запись во флеш-память не выполняетсянет Write Enable (06h) или /CS поднят не на границе байтабиты WEL и BUSY в регистре состояния (команда 05h)
Одно ведомое работает, с другим ответы портятсявторое ведомое не отпускает MISO или выбрано одновременно с первымMISO при всех CS = 1 должна быть в Z; уровни CS всех ведомых
Сбои растут с длиной проводов или частотойзадержки линии, звон на SCLKвременно снизить частоту; последовательный резистор у источника SCLK; общий провод рядом с сигнальными
AVR-ведущий сам переходит в режим ведомоговывод SS настроен входом и получил низкий уровеньPB2 должен быть выходом
Модуль на 3,3 В греется или ведёт себя странно с Arduino Uno5 В на входах микросхемы с питанием 3,3 Впреобразователь уровней

Логический анализатор

Декодеру SPI логического анализатора нужно сообщить, какой канал отвечает за SCLK, MOSI, MISO и CS, а также режим (CPOL и CPHA), порядок битов, длину слова и полярность CS. Частоту выборки анализатора берите в несколько раз выше частоты SCLK, иначе соседние фронты сольются. Первым делом убедитесь, что число тактов в кадре CS кратно длине слова ведомого и что ответ ведомого появляется там, где его ждёт даташит. Если декодер показывает осмысленные байты на MOSI и мусор на MISO, ищите ошибку в режиме, во времени установки или в уровнях.

Осциллограф

Логический анализатор видит только единицы и нули, аналоговые проблемы видны на осциллографе:

  • звон и ступеньки на фронтах SCLK — смотрите сигнал на входе ведомого, а не на выводе ведущего;
  • высокий уровень MISO, если ведомое питается от другого напряжения, чем ведущий;
  • уровень MISO, когда не выбрано ни одно ведомое: если он «плавает» между нулём и единицей, нужна подтяжка;
  • затянутые фронты на длинных проводах и при большой нагрузке.

Подключайте общий провод щупа коротким проводником рядом с точкой измерения: длинный провод «земли» сам добавляет звон, которого в схеме нет.

Другие интерфейсы — в разделе интерфейсы: I²C — для медленных датчиков и памяти на той же плате, RS-485 и RS-232 — для связи между приборами.

Частые вопросы

Чем отличаются режимы SPI 0, 1, 2 и 3?

Режим задают два бита. CPOL — уровень SCLK в покое: низкий в режимах 0 и 1, высокий в режимах 2 и 3. CPHA — фронт выборки: при CPHA = 0 бит захватывается первым фронтом после спада CS, при CPHA = 1 — вторым. В итоге в режимах 0 и 3 данные захватываются по нарастающему фронту, в режимах 1 и 2 — по спадающему. Ведущий настраивают на режим, который поддерживает ведомое; чаще всего это режим 0 или 3.

Сколько устройств можно подключить к шине SPI?

Протокол числа не ограничивает. Каждому ведомому нужна своя линия CS, а каждый вход добавляет ёмкость, поэтому на большой шине приходится снижать частоту. Если выводов не хватает, ведомые с поддержкой цепочки соединяют последовательно на общий CS (daisy chain): тогда на n восьмибитных ведомых нужен кадр из n × 8 тактов.

Что выбрать: SPI или I²C?

I²C обходится двумя линиями на все устройства и сам адресует их, но работает на 100–400 кбит/с, реже до 1 или 3,4 Мбит/с, и требует подтягивающих резисторов. SPI занимает минимум четыре линии плюс по CS на каждое ведомое, зато работает на единицах и десятках мегагерц в полном дуплексе. Медленные датчики, EEPROM и часы реального времени обычно подключают по I²C, флеш-память, SD-карты, дисплеи и быстрые АЦП — по SPI.

Какая максимальная частота и длина линии SPI?

Единого предела нет. Частоту ограничивает ведомое — MCP3008 до 3,6 МГц при 5 В, SD-карта до 25 МГц, флеш W25Q64JV до 133 МГц — и задержки: при чтении такт идёт к ведомому, ответ возвращается, и вместе со временем установки у ведущего всё должно уложиться в полпериода SCLK. В кабеле сигнал идёт около 5 нс на метр, поэтому SPI рассчитан на связь в пределах платы и коротких шлейфов.

Можно ли подключить модуль на 3,3 В к Arduino Uno по SPI напрямую?

Только если на модуле уже стоит преобразователь уровней. Выходы Uno дают 5 В, а флеш W25Q64JV, например, допускает на выводах не больше VCC + 0,4 В, то есть 3,7 В при питании 3,3 В. В обратную сторону запас тоже мал: ATmega328P при 5 В гарантированно принимает за единицу напряжение от 3,0 В. SCK, MOSI и CS понижают буфером вроде 74LVC125A с питанием 3,3 В, а MISO повышают буфером 74AHCT125 с питанием 5 В, выход которого отключается по CS.

Зачем нужен CS, если ведомое на шине одно?

CS не только выбирает ведомое, но и обрамляет транзакцию: по спаду ведомое начинает приём новой команды с первого бита, по подъёму исполняет её или защёлкивает данные. W25Q64JV, например, выполняет запись страницы только после подъёма /CS, а после включения питания не примет ни одной команды, пока /CS не перейдёт из единицы в ноль. С CS, постоянно прижатым к нулю, один лишний такт от помехи сдвинет все последующие биты, и ресинхронизироваться будет нечем.

Источники

  1. Motorola. SPI Block Guide V03.06 (S12SPIV3/D), 2003 — копия на сайте Chalmers University of Technology; п. 3.1 — биты CPOL, CPHA, LSBFE, SSOE и MODFEN; п. 4.1 — распределённый 16-разрядный регистр; п. 4.4 — форматы CPHA = 0 и CPHA = 1; п. 4.6.2 — двунаправленный режим MOMI и SISO; п. 4.7.1 — ошибка mode fault
  2. Motorola (Freescale). AN991/D: Using the Serial Peripheral Interface to Communicate Between Multiple Microcomputers, Rev. 1, 2002 — MC68HC05C4 как один из первых МК с аппаратным SPI, регистр SPCR, смысл CPOL и CPHA
  3. Motorola. MC68332 User's Manual (MC68332UM/AD), 1990 — модуль QSM: QSPI — SPI типа M68HC11 с очередью до 16 передач по 8–16 бит
  4. Analog Devices. P. Dhaker. Introduction to SPI Interface. Analog Dialogue, vol. 52, September 2018 — сигналы, режимы 0–3, обычное подключение и цепочка ведомых
  5. Analog Devices. AN-1248: SPI Interface (M. Usach), Rev. A, 2015 — SPI как стандарт де-факто; определение режима по временной диаграмме; пример расчёта частоты чтения; инвертор в линии SCLK; цепочка и параллельное подключение
  6. Analog Devices. AN-877: Interfacing to High Speed ADCs via SPI, Rev. B — двунаправленная линия SDIO и её разворот за полпериода SCLK, роль CSB
  7. Analog Devices. MT-097 Tutorial: Dealing with High-Speed Logic, Rev. 0, 2009 — когда дорожка становится линией передачи, демпфирующие резисторы, согласование у источника
  8. Texas Instruments. T. Kugelstadt. Extending the SPI bus for long-distance communication (SLYT441). Analog Applications Journal, 4Q 2011 — задержка сигнала 5 нс/м, рассинхронизация данных ведомого на длинном кабеле, обратная передача такта, RS-422 и гальваническая развязка
  9. Texas Instruments. TI Precision Labs TIPL 6002: Basics of SPI: Timing Requirements and Switching Characteristics — время установки, удержания и задержки выхода на примере АЦП ADS1118 (режим 1)
  10. Texas Instruments. MSP430x2xx Family User's Guide (SLAU144J), 2013 — гл. 16, модуль USCI в режиме SPI: биты UCCKPH и UCMSB
  11. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B), 2020 — гл. 19 — SPI: регистры SPCR, SPSR, SPDR, вывод SS, табл. 19-5 — делитель частоты; гл. 21 — USART в режиме SPI; табл. 29-13 — временные параметры SPI; п. 29.2 — пороги входов
  12. Microchip. AVR128DA28/32/48/64 Data Sheet (DS40002183) — термины host и client вместо master и slave
  13. Winbond. W25Q64JV: 3V 64M-bit Serial Flash Memory with Dual, Quad SPI, Rev. J, 27 March 2018 — п. 3.3 и 4 — выводы; п. 6 — режимы 0 и 3, Dual и Quad SPI; п. 8 — команды 06h, 05h, 02h и 9Fh; п. 9.1 и 9.4 — допустимые напряжения и уровни; п. 9.5 и 9.6 — временные параметры
  14. Microchip. MCP3004/3008: 2.7V 4-Channel/8-Channel 10-Bit A/D Converters with SPI Serial Interface (DS21295D), 2008 — режимы 0,0 и 1,1, частота до 3,6 МГц, обмен тремя байтами
  15. Maxim Integrated (Analog Devices). MAX7219/MAX7221: Serially Interfaced, 8-Digit LED Display Drivers, 19-4452, Rev. 6, 2021 — 16-битные пакеты, выход DOUT для цепочки, команда No-Op, пороги входов; сноска о товарных знаках SPI и QSPI
  16. Bosch Sensortec. BMP280 Digital Pressure Sensor (BST-BMP280-DS001-26, 2021); BME280 Combined Humidity and Pressure Sensor (BST-BME280-DS001-23, 2022) — выбор интерфейса I²C или SPI выводом CSB, режимы SPI 00 и 11
  17. Texas Instruments. SNx4HC595 8-Bit Shift Registers With 3-State Output Registers (SCLS041J), 2021 — выход QH' для каскадирования, максимальная частота сдвига
  18. Ilitek. ILI9341: a-Si TFT LCD Single Chip Driver, Specification V1.11 — п. 18.3.4 — временные параметры 4-проводного последовательного интерфейса; копия на сайте Adafruit
  19. Solomon Systech. SSD1306: 128 x 64 Dot Matrix OLED/PLED Segment/Common Driver with Controller, Rev. 1.1, 2008 — п. 8.1.3 и 8.1.4 — 4- и 3-проводный SPI, табл. 13-4 — временные параметры; копия на сайте Adafruit
  20. ChaN. How to Use MMC/SDC — режим SPI карт SD и MMC: инициализация на 100–400 кГц, освобождение линии DO, подтягивающие резисторы, расчёт предельной частоты
  21. The Linux Kernel. Overview of Linux kernel SPI support; include/uapi/linux/spi/spi.h — SPI как стандарт де-факто, режимы, трёхпроводный вариант; флаги SPI_CS_HIGH, SPI_LSB_FIRST, SPI_3WIRE, SPI_TX_QUAD и SPI_RX_QUAD
  22. Open Source Hardware Association. A Resolution to Redefine SPI Signal Names — SDO, SDI, CS, PICO и POCI вместо MOSI, MISO и SS
  23. OSH Park. OSHWA: A Resolution to Redefine SPI Signal Names, 30 June 2020 — первая редакция резолюции с именами COPI и CIPO
  24. Arduino. ArduinoCore-avr: библиотека SPI (SPI.h, SPI.cpp) и variants/standard/pins_arduino.h — SPISettings, выбор делителя, настройка вывода SS в SPI.begin(), выводы SPI на Arduino Uno
  25. STMicroelectronics. STM32F4 HAL: драйвер stm32f4xx_hal_spi — структура SPI_InitTypeDef и функция HAL_SPI_TransmitReceive
  26. Texas Instruments. SN74LVC125A (SCAS290T, 2024), SN74AHCT125 (SCLS264R, 2024), TXB0104 (SCES650K, 2025) — буферы для согласования уровней: допустимые входные напряжения, пороги, выход с третьим состоянием, скорость TXB0104