ESP32 SPI Пины: Расположение, Характеристики и Конфигурация
Что такое SPI пины ESP32 на самом деле
SPI на ESP32 — четырехпроводная шина, четыре контроллера, одна GPIO матрица
Команды, разрабатывающие дисплеи или датчики, подключенные по SPI к ESP32, сталкиваются со знакомой проблемой: устройство правильно инициализируется на стенде, а затем начинает работать с перебоями в продакшене. Симптомы варьируются — искаженные кадры на дисплее, датчик, который перестает отвечать через несколько часов, шина, которая зависает под нагрузкой DMA. Основная причина часто одна и та же. Кто-то назначил сигналы SPI на пины, конфликтующие со стартовыми функциями, или направил 40 МГц тактовый сигнал через GPIO матрицу, когда путь IO_MUX был доступен и необходим.
ESP32 отличается от микроконтроллеров с фиксированными пинами, таких как STM32 или AVR, тем, что большинство его SPI сигналов могут быть направлены практически на любой GPIO. Эта гибкость действительно полезна при проектировании печатных плат. Она также создает больше возможностей для ошибочного выбора. Понимание того, какие пины безопасны, какие несут штрафы за производительность, а какие полностью запрещены, является основой надежной SPI конструкции.
На этой странице представлен полный обзор SPI пинов для ESP32: таблицы пинов по умолчанию для всех основных вариантов, правила переназначения и их ограничения, электрические характеристики, подключение нескольких устройств и структура принятия решений для выбора правильной конфигурации.
Как SPI ESP32 работает на аппаратном уровне
GPIO-матрица и почему выводы SPI ESP32 не фиксированы
ESP32 предоставляет два внутренних пути маршрутизации для сигналов периферийных устройств. IO_MUX — это прямое соединение между периферийным устройством и определенной площадкой GPIO. Он добавляет минимальную задержку и поддерживает полную тактовую частоту, которую может генерировать периферийное устройство. GPIO-матрица — это кроссбар-коммутатор, который позволяет любому периферийному сигналу подключаться практически к любому GPIO. Он добавляет задержку примерно в один такт APB в каждом направлении.
Для SPI эта дополнительная задержка имеет значение при высоких тактовых частотах. Документация Espressif устанавливает практический предел для SPI, маршрутизируемого через GPIO-матрицу, примерно на уровне 26 МГц на оригинальном ESP32. Выше этого порога ухудшается временной настройка и удержание. Вы видите ошибки битов, которые зависят от частоты и часто бывают прерывистыми — они проявляются при термической нагрузке или когда длина трассировки на печатной плате превышает ожидаемую.
Если тактовая частота вашего SPI превышает 26 МГц, используйте выводы по умолчанию IO_MUX. GPIO-матрица недостаточно быстрая выше этого порога на большинстве вариантов ESP32.
Выводы по умолчанию IO_MUX для каждого SPI-контроллера фиксированы в кремнии. Вы не можете переместить их и сохранить прямой путь. Когда компоновка платы заставляет вас использовать выводы, отличные от стандартных, GPIO-матрица автоматически обрабатывает маршрутизацию — но ваш потолок тактовой частоты снижается. Большинство SPI-флэш-накопителей, дисплеев и датчиков работают значительно ниже 26 МГц, поэтому путь через матрицу приемлем. Высокоскоростные конструкции, особенно те, которые управляют большими TFT-дисплеями с полной частотой обновления, нуждаются в выводах IO_MUX.
Электрические характеристики шины SPI на ESP32

Все площадки GPIO ESP32 работают с логикой 3,3 В. Уровень логической единицы на выходе обычно выше 2,64 В. Порог высокого уровня на входе составляет примерно 0,75 × VDD, то есть около 2,48 В. Устройства, требующие логики SPI 5 В, нуждаются в преобразовании уровней. Это распространенное упущение при подключении ESP32 к старым промышленным датчикам или модулям SD-карт, разработанным для систем 5 В.
Сила выходного драйвера настраивается для каждого GPIO. Настройка по умолчанию составляет максимум 20 мА. Для сигналов SPI, управляющих длинными линиями или несколькими устройствами параллельно, увеличение силы драйвера до 40 мА сокращает время нарастания и улучшает целостность сигнала при более высоких тактовых частотах. С другой стороны, высокая сила драйвера на коротких линиях увеличивает электромагнитное излучение (EMI). Большинство конструкций на хорошо разведенной печатной плате работают нормально при настройке по умолчанию.
Линии CS требуют подтягивающих резисторов, когда ESP32 активно их не управляет. Во время загрузки и сброса выходы GPIO находятся в состоянии с высоким импедансом. Плавающая линия CS может случайно активироваться и повредить состояние устройства. Подтягивающий резистор 10 кОм к 3,3 В на каждой линии CS является стандартной практикой. Избегайте подтягивающих к земле резисторов на CS, если устройство явно не требует активного высокого состояния выбора микросхемы.
Максимальная тактовая частота SPI зависит от варианта и пути трассировки. Оригинальный ESP32 достигает 80 МГц по путям IO_MUX в режиме мастера. ESP32-S3 поддерживает до 80 МГц на SPI2 и SPI3 через IO_MUX. ESP32-C3 достигает максимум 60 МГц на своем единственном универсальном SPI контроллере. Это пределы кремниевой реализации. Практические конструкции плат часто работают на 10–20% ниже максимума, чтобы оставить запас для импеданса трассы и емкости нагрузки.
Спецификации SPI контактов ESP32 по контроллеру и варианту
Назначения SPI контактов по умолчанию — ESP32 (WROOM / WROVER)

Оригинальный ESP32 имеет четыре SPI контроллера. SPI0 и SPI1 зарезервированы для внутреннего доступа к flash и PSRAM. Espressif подключает их к GPIO6-GPIO11 (и GPIO16–GPIO17 на WROVER для PSRAM). Эти контакты никогда нельзя переназначать. Попытка использовать их в качестве универсальных SPI сигналов приводит к сбоям чтения flash или сбоям системы — часто с случайными интервалами, которые трудно воспроизвести на стенде.
Два доступных пользователю контроллера — HSPI (SPI2) и VSPI (SPI3). Их назначения контактов IO_MUX по умолчанию:
| Контроллер | MOSI | MISO | CLK | CS0 |
|---|---|---|---|---|
| HSPI (SPI2) | GPIO13 | GPIO12 | GPIO14 | GPIO15 |
| VSPI (SPI3) | GPIO23 | GPIO19 | GPIO18 | GPIO5 |
GPIO34–GPIO39 — это выводы только для входа. У них нет выходного драйвера. Назначение MOSI или CLK на любой из этих выводов не приводит к появлению сигнала на шине. Это распространенная ошибка, когда инженеры выбирают «доступные» GPIO из схемы расположения выводов, не проверив флаг «только для входа». MISO можно безопасно использовать с этими выводами, поскольку MISO всегда является входом на стороне мастера.
Назначение выводов SPI — ESP32-S3, ESP32-S2 и ESP32-C3
ESP32-S3 WROOM-1 предоставляет SPI2 и SPI3 как универсальные контроллеры. Выводы IO_MUX по умолчанию для SPI2: MOSI на GPIO11, MISO на GPIO13, CLK на GPIO12 и CS на GPIO10. SPI3 по умолчанию: MOSI на GPIO35, MISO на GPIO37, CLK на GPIO36 и CS на GPIO34. ESP32-S3 также резервирует GPIO26–GPIO32 для внутреннего интерфейса Octal-SPI flash на модулях WROOM-1. Эти выводы недоступны на краю разъема модуля и не должны назначаться пользовательским SPI-шинам.
ESP32-S2 предоставляет SPI2 как основной контроллер, доступный пользователю. Выводы IO_MUX по умолчанию: MOSI на GPIO35, MISO на GPIO37, CLK на GPIO36 и CS на GPIO34. Нумерация выводов значительно отличается от оригинального ESP32, поэтому проекты плат нельзя переносить напрямую без проверки переназначения выводов.
ESP32-C3 имеет один универсальный SPI-контроллер (SPI2). Выводы IO_MUX по умолчанию: MOSI на GPIO7, MISO на GPIO2, CLK на GPIO6 и CS на GPIO10. Ядро RISC-V C3 и уменьшенное количество выводов делают его подходящим для экономичных конструкций с одним периферийным устройством, но единственный контроллер ограничивает топологии с несколькими устройствами.
Для команд, разрабатывающих производственное HMI-оборудование, полезно увидеть, как эти варианты работают в готовых продуктах, прежде чем выбрать конкретный вариант. Производственное HMI-оборудование с использованием периферии ESP32 показывает, как SPI-подключенные дисплеи и периферийные устройства интегрируются в различных вариантах модулей ESP32.
| Вариант | Пользовательские SPI-контроллеры | Макс. тактовая частота IO_MUX | Резервные выводы Flash |
|---|---|---|---|
| ESP32 | SPI2 (HSPI), SPI3 (VSPI) | 80 МГц | GPIO6–GPIO11 |
| ESP32-S3 | SPI2, SPI3 | 80 МГц | GPIO26–GPIO32 |
| ESP32-S2 | SPI2 | 80 МГц | GPIO26–GPIO32 |
| ESP32-C3 | SPI2 | 60 МГц | GPIO12–GPIO17 |
Ограничения выводов, шинные выводы и запрещенные назначения
Несколько GPIO в каждом варианте ESP32 выполняют двойную роль: во время нормальной работы они передают сигналы, совместимые с SPI, но также управляют поведением при загрузке во время сброса. Espressif называет эти выводы шинными выводами (strapping pins). Микросхема опрашивает их при включении питания, чтобы определить режим загрузки, напряжение флэш-памяти и конфигурацию JTAG. Назначение этих выводов линиям SPI CS — где внешние устройства могут устанавливать их в низкое состояние при запуске — вызывает сбои при загрузке, которые выглядят как аппаратные сбои.
На оригинальном ESP32 критически важными шинными выводами являются:
- GPIO0 — выбор режима загрузки (низкий уровень = режим загрузки)
- GPIO2 — должен быть в низком состоянии или в плавающем состоянии во время режима загрузки
- GPIO5 — выбор времени SDIO, также VSPI CS0 по умолчанию
- GPIO12 — выбор напряжения flash (MTDI), также HSPI MISO по умолчанию
- GPIO15 — сигнал JTAG, также HSPI CS0 по умолчанию
GPIO12 заслуживает особого внимания в модулях WROVER. Если GPIO12 подтянут к высокому уровню при загрузке, ESP32 ожидает flash с напряжением 1.8 В. Большинство модулей используют flash с напряжением 3.3 В. Подтягивание GPIO12 к высокому уровню через выход SPI-устройства вызывает несоответствие напряжения flash, и модуль не загружается. Эта проблема проявляется периодически, если SPI-устройство только изредка выдает высокий уровень на MISO при запуске — что делает этот сбой загрузки одним из самых трудновоспроизводимых.
На ESP32-S3 к strapping pins относятся GPIO0, GPIO3, GPIO45 и GPIO46. На ESP32-C3 strapping pins — это GPIO2, GPIO8 и GPIO9. Всегда проверяйте список strapping pins в соответствующем техническом руководстве перед назначением линий CS.
Конфигурирование и подключение SPI-пинов ESP32 на практике
Переназначение SPI-пинов в прошивке — как работает назначение GPIO Matrix
При инициализации SPI-шины в ESP-IDF с использованием spi_bus_initialize(), вы передаете конфигурационную структуру, которая указывает номера GPIO для MOSI, MISO, CLK и, опционально, CS. Если эти номера совпадают со значениями IO_MUX по умолчанию для выбранного хоста, ESP-IDF автоматически направляет сигналы по прямому пути. Если они отличаются, драйвер направляет сигналы через GPIO Matrix без какой-либо дополнительной конфигурации с вашей стороны.
Типичная инициализация шины выглядит следующим образом:
/* Illustrative only — not a production-ready snippet */
spi_bus_config_t buscfg = {
.mosi_io_num = 23, /* VSPI default — IO_MUX path */
.miso_io_num = 19,
.sclk_io_num = 18,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 4096,
};
spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO);
Параметр SPI_DMA_CH_AUTO позволяет драйверу выбрать канал DMA. На ESP32 шины SPI2 и SPI3 используют общие каналы DMA 1 и 2. Назначение обеих шин на один и тот же канал DMA приводит к конфликтам при передаче. Если вы одновременно используете две шины SPI, явно назначьте каналы или используйте SPI_DMA_CH_AUTO на обеих и убедитесь, что драйвер назначает разные каналы.
Выбор между IO_MUX и переназначенными выводами зависит от тактовой частоты. Ниже 26 МГц путь GPIO Matrix надежен на всех вариантах. Выше этого значения используйте выводы по умолчанию IO_MUX. Для полного понимания возможностей GPIO, помимо SPI, включая регистры силы тока, флаги только для ввода и поведение RTC GPIO, см. роли выводов ESP32 GPIO и электрические пределы справочник.
Подключение нескольких SPI-устройств с отдельными линиями CS

Общая шина SPI размещает MOSI, MISO и CLK для всех устройств. Каждое устройство получает свою линию CS. Ведущее устройство устанавливает CS в низкий уровень для выбора устройства, завершает транзакцию, а затем устанавливает CS в высокий уровень перед выбором другого устройства. Эта топология хорошо работает для дисплеев, флэш-чипов, датчиков и АЦП на одной шине — при условии правильного управления линиями CS.
Выбор пина CS следует тем же правилам, что и для любого другого выходного GPIO: избегайте пинов выборки (strapping pins), избегайте GPIO только для входа (GPIO34–GPIO39 на оригинальном ESP32) и избегайте пинов, подключенных к флэш-памяти. Помимо этих ограничений, любой доступный GPIO подходит. Выбирайте пины, которые физически расположены близко к устройствам на печатной плате, чтобы сократить длину трасс CS и уменьшить наводки.
В прошивке ESP-IDF управление CS выполняется автоматически при регистрации каждого устройства с помощью spi_bus_add_device() и указании номера GPIO для CS в конфигурации устройства. Драйвер устанавливает и сбрасывает CS вокруг каждого обмена данными. Ручное переключение CS требуется только для устройств с нестандартными требованиями к синхронизации — например, некоторые датчики требуют минимального времени высокого уровня CS между транзакциями, превышающего период сброса драйвера по умолчанию.
Описание подключения шины с двумя устройствами: подключите MOSI, MISO и CLK от ESP32 к обоим устройствам параллельно. Проведите отдельный провод от двух разных выходов GPIO к пину CS каждого устройства. Добавьте подтягивающий резистор 10 кОм от каждой линии CS к 3,3 В. Сохраняйте трассы MISO как можно короче — длинные трассы MISO от нескольких устройств создают емкостную нагрузку, которая ухудшает фронты сигналов на более высоких тактовых частотах.
Диагностика проблем с подключением и сигналами SPI

Неправильное назначение пинов приводит к полной неработоспособности: устройство никогда не отвечает, на шине нет тактовой активности, или прошивка возвращает ошибку при первой передаче. Проверьте номера GPIO в вашей конфигурации шины на соответствие фактическим подключениям на печатной плате. Затем убедитесь, что ни один из назначенных пинов не относится к категориям только для входа или зарезервированных для флэш-памяти.
Проблемы с тактовой частотой проявляются иначе. Шина инициализируется, и первые несколько передач проходят успешно. Затем случайным образом появляются ошибки — поврежденные байты, частичные кадры или сбои CRC. Эти ошибки увеличиваются с температурой и часто исчезают, когда вы снижаете тактовую частоту вдвое. Эта картина указывает на пин, маршрутизированный через GPIO Matrix, работающий выше своей надежной частотной границы. Решение — либо снизить тактовую частоту, либо перейти на стандартные пины IO_MUX.
Логический анализатор — самый полезный инструмент для отладки SPI. Проверьте эти пункты по порядку:
- Полярность тактового сигнала (CPOL) и фаза (CPHA) — несоответствие приводит к ошибке каждого байта
- Активное состояние CS — большинство устройств имеют активный низкий уровень; CS с активным высоким уровнем никогда не устанавливается правильно
- Состояние линии MISO, когда устройство не выбрано — плавающая MISO создает шум, который искажает следующее чтение
- Время деактивации CS — некоторым устройствам требуется, чтобы CS оставался высоким в течение минимального периода перед следующей транзакцией
Плавающяя MISO — распространенная проблема на шинах с несколькими устройствами. Когда одно устройство выбрано, остальные должны перевести свои выходы MISO в высокоимпедансное состояние. Устройства, которые не переводят MISO в высокоимпедансное состояние должным образом, управляют MISO, даже когда их CS установлен в высокое состояние, искажая чтение с выбранного устройства. Проверьте спецификацию поведения MISO каждого устройства при снятии выбора. Если устройству не хватает правильного выхода с высоким импедансом, ему потребуется шинный коммутатор или отдельная линия MISO.
Блокировка шины — когда контроллер SPI перестает отвечать и требует перезагрузки — обычно связана с ошибкой конфигурации DMA или транзакцией, которая так и не была завершена, поскольку CS остался установленным. Добавление аппаратного сторожевого таймера для сброса при истечении времени ожидания SPI является стандартной практикой в производственной прошивке. Время ожидания в диапазоне 100–500 мс охватывает большинство допустимых длительных передач, одновременно выявляя условия блокировки шины до того, как они повлияют на приложение.
Выбор правильной конфигурации выводов SPI для вашей конструкции
Структура принятия решений — Выводы по умолчанию, Пользовательское сопоставление или Выбор варианта
Четыре критерия определяют выбор конфигурации выводов SPI для большинства конструкций ESP32.
Требования к частоте тактового сигнала. Если вашему периферийному устройству SPI требуется более 26 МГц — что часто встречается для TFT-дисплеев с высоким разрешением или быстрых АЦП — вы должны использовать выводы по умолчанию IO_MUX. В прошивке нет обходного пути. Если ваш тактовый сигнал остается ниже 20 МГц, подойдет любой вывод, способный работать как GPIO, и выбор может свободно определяться компоновкой платы.
Количество SPI-устройств. Одно устройство на выделенной шине — это просто. Два или более устройства на общей шине требуют тщательного выбора выводов CS и проверки триггерного состояния MISO. Если ваша конструкция требует три или более независимых SPI-шины — например, шина для дисплея, шина для датчиков и SD-карта — оригинальный ESP32 или ESP32-S3 (оба с двумя пользовательскими SPI-контроллерами) справятся с этим лучше, чем ESP32-C3, у которого только один.
Возможности варианта. Выбирайте ESP32-S3, когда конструкция требует Octal-SPI flash для больших буферов кадров или когда задействованы SPI-периферийные устройства с большим количеством выводов. Большое количество GPIO и двойные SPI-контроллеры S3 делают его естественным выбором для сложных HMI-конструкций. Выбирайте ESP32-C3, когда конструкция имеет одно SPI-периферийное устройство, стоимость является основным ограничением, а тактовая частота остается комфортно ниже 40 МГц.
Гибкость компоновки платы. Когда ограничения печатной платы (PCB) не позволяют использовать выводы IO_MUX по умолчанию, а тактовая частота остается ниже 26 МГц, переназначение GPIO Matrix является чистым решением. Явно документируйте переназначение в примечаниях к аппаратной конструкции. Инженеры, которые позже будут отлаживать плату, должны знать, какие выводы несут сигналы SPI — таблица выводов по умолчанию в техническом описании не будет соответствовать фактической конструкции.
Если ваша конструкция управляет дисплеем, подключенным по SPI, и вам необходимо убедиться, что выбранная вами тактовая частота и разрешение соответствуют пропускной способности шины, рассчитайте требования к пропускной способности SPI-дисплея перед окончательным утверждением конфигурации тактовой частоты.
Выбор правильной конфигурации выводов SPI — это проектное решение, которое накапливается. Неверное решение на этапе схемы — линия CS на вывод стартовой конфигурации, тактовая частота 40 МГц на вывод, проложенный через матрицу, — требует часов на диагностику и иногда приводит к переделке печатной платы. Шаблоны, вызывающие эти сбои, повторяются в командах разработчиков встраиваемых продуктов. Проверьте таблицу ограничений выводов, сопоставьте выводы стартовой конфигурации с вашими назначениями CS и проверьте поведение MISO в режиме три-стабильности для каждого устройства на общей шине перед окончательным утверждением компоновки.
Для конструкций, предназначенных для производства, дисциплина процесса имеет такое же значение, как и техническая корректность. Инженерные команды STONE HMI следуют практикам, соответствующим IEC 61508. Такой структурированный подход снижает риск ошибок назначения выводов, которые могут попасть в произведенное оборудование, где стоимость исправления намного выше, чем выявление проблемы на этапе проектирования.