Интерфейс SPI
SPI — синхронный последовательный интерфейс для связи микросхем на одной плате: ведущий задаёт такт SCLK, данные одновременно идут в обе стороны по MOSI и MISO, а нужное ведомое выбирается своей линией CS. Ниже — режимы CPOL и CPHA, подключение нескольких устройств, пределы скорости и примеры для AVR, Arduino и STM32.
Обновлено Редакция GAW
Содержание
- Сигналы SPI: SCLK, MOSI, MISO и CS
- Режимы SPI: CPOL и CPHA
- Порядок битов и длина слова
- Несколько ведомых на одной шине SPI
- Скорость SPI: от чего зависит предельная частота
- Трёхпроводный, Dual и Quad SPI
- Целостность сигнала: провода, резисторы, общий провод
- SPI в микроконтроллерах AVR на примере ATmega328P
- SPI в Arduino и STM32
- SPI или I²C: сравнение и выбор
- Типичные ошибки SPI и отладка
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, SCK | CLK; SCL у контроллеров дисплеев | SCK |
| Данные к ведомому | MOSI | SDI, DI, DIN, SI; SDA у контроллеров дисплеев | SDI у ведомого; PICO, ранее COPI |
| Данные к ведущему | MISO | SDO, DO, DOUT, SO | SDO у ведомого; POCI, ранее CIPO |
| Выбор ведомого | SS, CS | /CS, CSB, CSX, CE, SYNC, LOAD | CS |
Пары 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 тактов содержимое поменялось местами: ведущий получил байт ведомого, ведомое — байт ведущего.
Из этой схемы следуют три правила, о которых полезно помнить при написании драйвера:
- Чтобы прочитать, нужно передать. Такты идут только во время передачи, поэтому при чтении ведущий отправляет «пустые» байты — обычно 0x00 или 0xFF, ведомое их игнорирует.
- При записи всегда что-то приходит обратно. Ненужный принятый байт просто отбрасывают.
- Приём не подтверждается. Если ведомого нет или оно не выбрано, ведущий всё равно «прочитает» байт — тот уровень, что держит подтяжка или висящая в воздухе линия MISO. Ответ 0xFF или 0x00 во всех байтах — частый признак обрыва.
Многие микросхемы используют дуплекс лишь формально: сначала принимают команду, потом отвечают, как флеш-память. Полудуплексный протокол поверх полнодуплексного железа — нормальная практика, её отмечает и документация Linux.
Режимы SPI: CPOL и CPHA
Два бита задают, как данные привязаны к такту. CPOL (clock polarity) — уровень SCLK в покое: 0 — низкий, 1 — высокий. CPHA (clock phase) — на каком фронте берётся бит: при CPHA = 0 на первом фронте после спада CS и далее на нечётных, при CPHA = 1 — на втором и далее на чётных. Данные меняются на противоположном фронте, поэтому у сигнала есть полпериода, чтобы установиться. Номер режима — двоичное число из CPOL (старший бит) и CPHA (младший).
| Режим | CPOL | CPHA | SCLK в покое | Выборка бита | Смена данных |
|---|---|---|---|---|---|
| 0 | 0 | 0 | низкий | по нарастающему фронту | по спадающему фронту |
| 1 | 0 | 1 | низкий | по спадающему фронту | по нарастающему фронту |
| 2 | 1 | 0 | высокий | по спадающему фронту | по нарастающему фронту |
| 3 | 1 | 1 | высокий | по нарастающему фронту | по спадающему фронту |
Режимы 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:
- Уровень SCLK в момент спада CS даёт CPOL: низкий — CPOL = 0, высокий — CPOL = 1. Если нарисованы оба варианта (у W25Q64JV — подписи Mode 0 и Mode 3), ведомое понимает обе полярности.
- Фронт выборки находят по времени установки и удержания входа (setup и hold, tSU, tDS, tDH): обе величины отсчитываются от фронта, по которому ведомое защёлкивает бит. Нарастающий фронт выборки при CPOL = 0 — это режим 0, при CPOL = 1 — режим 3. Спадающий — режимы 1 и 2.
- Задержка выхода ведомого (tV, tDO, tCLQV) должна отсчитываться от противоположного фронта — это проверка, что фронт выборки найден верно.
- Обозначения вида «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.
Схема работает только потому, что невыбранное ведомое переводит выход 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 каждое ведомое защёлкивает то, что оказалось в его регистре.
Примеры из даташитов:
- 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 на всё это есть половина периода:
Примеры расчёта из первоисточников:
- 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×320 | 10 МГц запись, 6,7 МГц чтение | период SCL не меньше 100 и 150 нс в 4-проводном режиме |
| Solomon Systech SSD1306 | контроллер OLED-дисплея 128×64 | 10 МГц | период не меньше 100 нс; по SPI возможна только запись |
| Maxim MAX7219 | драйвер светодиодных индикаторов | 10 МГц | период CLK не меньше 100 нс |
| TI SN74HC595 | сдвиговый регистр | 25 МГц | при 4,5 В во всём диапазоне −40…+85 °C |
| ATmega328P | микроконтроллер AVR | 8 МГц ведущим, 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 В.
Чем согласовать:
- Вниз, 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.
| Регистр | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| SPCR | SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |
| SPSR | SPIF | WCOL | — | — | — | — | — | SPI2X |
- SPE включает модуль, MSTR выбирает режим ведущего, CPOL и CPHA — режим SPI, DORD = 1 — младший бит первым, SPIE разрешает прерывание по окончании передачи.
- SPDR — регистр данных: запись в него начинает передачу, чтение возвращает принятый байт.
- SPIF поднимается, когда байт выдвинут. Сбрасывается он аппаратно при входе в прерывание либо чтением SPSR с последующим обращением к SPDR.
- WCOL сигнализирует, что SPDR записали во время передачи. Передатчик буферизован однократно: следующий байт можно писать только после окончания сдвига. Приёмник — двукратно, но принятый байт нужно прочитать до окончания следующего.
Частоту SCK в режиме ведущего задают биты SPR1, SPR0 и SPI2X (таблица 19-5 даташита):
| SPI2X | SPR1 | SPR0 | Частота SCK | При fosc = 16 МГц |
|---|---|---|---|---|
| 1 | 0 | 0 | fosc/2 | 8 МГц |
| 0 | 0 | 0 | fosc/4 | 4 МГц |
| 1 | 0 | 1 | fosc/8 | 2 МГц |
| 0 | 0 | 1 | fosc/16 | 1 МГц |
| 1 | 1 | 0 | fosc/32 | 500 кГц |
| 0 | 1 | 0 | fosc/64 | 250 кГц |
| 1 | 1 | 1 | fosc/64 | 250 кГц |
| 0 | 1 | 1 | fosc/128 | 125 кГц |
В режиме ведомого 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, байты идут старшим битом вперёд.
| Байт | MOSI (ведущий) | MISO (W25Q64JV) | Смысл |
|---|---|---|---|
| 1 | 0x9F | Z | команда Read JEDEC ID |
| 2 | 0x00 | 0xEF | производитель — Winbond |
| 3 | 0x00 | 0x40 | тип памяти |
| 4 | 0x00 | 0x17 | ёмкость — 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.
| Свойство | SPI | I²C |
|---|---|---|
| Линии | SCLK, MOSI, MISO и по CS на каждое ведомое | SDA и SCL на все устройства |
| Выбор ведомого | отдельной линией CS | 7-битным адресом в первом байте |
| Направление обмена | полный дуплекс | полудуплекс |
| Скорость | от килогерц до десятков мегагерц, предел задаёт микросхема | 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 Uno | 5 В на входах микросхемы с питанием 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, постоянно прижатым к нулю, один лишний такт от помехи сдвинет все последующие биты, и ресинхронизироваться будет нечем.
Источники
- 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
- Motorola (Freescale). AN991/D: Using the Serial Peripheral Interface to Communicate Between Multiple Microcomputers, Rev. 1, 2002 — MC68HC05C4 как один из первых МК с аппаратным SPI, регистр SPCR, смысл CPOL и CPHA
- Motorola. MC68332 User's Manual (MC68332UM/AD), 1990 — модуль QSM: QSPI — SPI типа M68HC11 с очередью до 16 передач по 8–16 бит
- Analog Devices. P. Dhaker. Introduction to SPI Interface. Analog Dialogue, vol. 52, September 2018 — сигналы, режимы 0–3, обычное подключение и цепочка ведомых
- Analog Devices. AN-1248: SPI Interface (M. Usach), Rev. A, 2015 — SPI как стандарт де-факто; определение режима по временной диаграмме; пример расчёта частоты чтения; инвертор в линии SCLK; цепочка и параллельное подключение
- Analog Devices. AN-877: Interfacing to High Speed ADCs via SPI, Rev. B — двунаправленная линия SDIO и её разворот за полпериода SCLK, роль CSB
- Analog Devices. MT-097 Tutorial: Dealing with High-Speed Logic, Rev. 0, 2009 — когда дорожка становится линией передачи, демпфирующие резисторы, согласование у источника
- Texas Instruments. T. Kugelstadt. Extending the SPI bus for long-distance communication (SLYT441). Analog Applications Journal, 4Q 2011 — задержка сигнала 5 нс/м, рассинхронизация данных ведомого на длинном кабеле, обратная передача такта, RS-422 и гальваническая развязка
- Texas Instruments. TI Precision Labs TIPL 6002: Basics of SPI: Timing Requirements and Switching Characteristics — время установки, удержания и задержки выхода на примере АЦП ADS1118 (режим 1)
- Texas Instruments. MSP430x2xx Family User's Guide (SLAU144J), 2013 — гл. 16, модуль USCI в режиме SPI: биты UCCKPH и UCMSB
- 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 — пороги входов
- Microchip. AVR128DA28/32/48/64 Data Sheet (DS40002183) — термины host и client вместо master и slave
- 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 — временные параметры
- 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 МГц, обмен тремя байтами
- Maxim Integrated (Analog Devices). MAX7219/MAX7221: Serially Interfaced, 8-Digit LED Display Drivers, 19-4452, Rev. 6, 2021 — 16-битные пакеты, выход DOUT для цепочки, команда No-Op, пороги входов; сноска о товарных знаках SPI и QSPI
- 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
- Texas Instruments. SNx4HC595 8-Bit Shift Registers With 3-State Output Registers (SCLS041J), 2021 — выход QH' для каскадирования, максимальная частота сдвига
- Ilitek. ILI9341: a-Si TFT LCD Single Chip Driver, Specification V1.11 — п. 18.3.4 — временные параметры 4-проводного последовательного интерфейса; копия на сайте Adafruit
- 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
- ChaN. How to Use MMC/SDC — режим SPI карт SD и MMC: инициализация на 100–400 кГц, освобождение линии DO, подтягивающие резисторы, расчёт предельной частоты
- 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
- Open Source Hardware Association. A Resolution to Redefine SPI Signal Names — SDO, SDI, CS, PICO и POCI вместо MOSI, MISO и SS
- OSH Park. OSHWA: A Resolution to Redefine SPI Signal Names, 30 June 2020 — первая редакция резолюции с именами COPI и CIPO
- Arduino. ArduinoCore-avr: библиотека SPI (SPI.h, SPI.cpp) и variants/standard/pins_arduino.h — SPISettings, выбор делителя, настройка вывода SS в SPI.begin(), выводы SPI на Arduino Uno
- STMicroelectronics. STM32F4 HAL: драйвер stm32f4xx_hal_spi — структура SPI_InitTypeDef и функция HAL_SPI_TransmitReceive
- Texas Instruments. SN74LVC125A (SCAS290T, 2024), SN74AHCT125 (SCLS264R, 2024), TXB0104 (SCES650K, 2025) — буферы для согласования уровней: допустимые входные напряжения, пороги, выход с третьим состоянием, скорость TXB0104
Смотрите также
- I²CSDA и SCL, START/STOP, ACK, адреса, скорости, расчёт подтяжек
- RS-485Уровни, длина линии, терминаторы, смещение, MAX485, Modbus RTU
- RS-232Уровни, распиновка DB9, нуль-модем, MAX3232, UART и AVR
- AVRATmega, ATtiny, AVR Dx/Ex: семейства, прошивка, инструменты
- МикроконтроллерыAVR, ARM Cortex-M, ESP32, PIC, MSP430: архитектура и выбор
- Делитель напряженияВыход, ток, нагрузка, подбор пары резисторов