Skip to content
We have moved: pcb.esp32s.com → pcb32.comSame store. Existing accounts, orders and affiliate commission records are unchanged.
Номер заказа: USD
Номер заказа: USD
pcb32.com
Cart 0

Полное руководство по обмену данными по SPI с ESP32 в среде разработки Arduino IDE

SPI (Serial Peripheral Interface) — это высокоскоростной полнодуплексный синхронный последовательный протокол, необходимый для подключения... ESP32 к широкому спектру периферийных устройств, таких как дисплеи, датчики, SD-карты и беспроводные модули. Это всеобъемлющее руководство выходит за рамки базовой теории и предоставляет практические, действенные знания по освоению... ESP32‘Мы рассмотрим возможности SPI с помощью Arduino IDE. Мы обсудим все: от основ четырехпроводной шины до продвинутых методов использования пользовательских контактов и управления несколькими устройствами на независимых шинах SPI, основываясь на практическом опыте и официальных рекомендациях. ESP32 рамки.

Понимание SPI: протокол связи «ведущий-ведомый»

SPI работает на архитектура «хозяин-подчиненный», где один контроллер ( владелец, в данном случае, ваш ESP32) управляет одним или несколькими периферийными устройствами ( рабыЭто синхронный Протокол, означающий, что передача данных координируется тактовым сигналом (SCK), генерируемым ведущим устройством. Одним из его ключевых преимуществ является полнодуплексная связь; Данные могут передаваться одновременно от ведущего устройства к ведомому (через MOSI) и от ведомого устройства к ведущему (через MISO), что делает этот протокол быстрее, чем, например, I2C.

Для работы с шиной SPI необходимы четыре основные линии:

  • MOSI (Master Out Slave In): Линия для отправки данных от мастер к раб.

  • MISO (Master In Slave Out): Линия для отправки данных от раб к хозяин.

  • SCK (последовательный тактовый генератор): Тактовый сигнал, генерируемый ведущим устройством для синхронизации битов данных.

  • CS/SS (Выбор микросхемы / Выбор ведомого устройства): Сигнал с низким активным уровнем, используемый ведущим устройством для выбора конкретного ведомого устройства, активного на общей шине.

Полезный совет: На подчиненных устройствах, таких как сенсорные модули, вы можете увидеть следующие термины: SDO (Serial Data Out) вместо MISO и SDI (последовательный вход данных) Вместо MOSI. С точки зрения периферийного устройства, они обозначают одни и те же контакты.

ESP32 Аппаратное обеспечение SPI: разблокировка HSPI и VSPI

Он ESP32 чип оснащен четыре периферийных устройства SPI (SPI0, SPI1, HSPI, VSPI). Однако интерфейсы SPI0 и SPI1 предназначены для внутренней связи с флэш-памятью устройства и недоступны для общего использования.

Для ваших проектов у вас есть две полностью независимые, настраиваемые пользователем шины SPI:

  1. HSPI (SPI2): Высокоскоростной периферийный модуль SPI.

  2. VSPI (SPI3): Периферийное устройство SPI с “очень высокой скоростью” (часто используется по умолчанию).

Каждый из этих автобусов (HSPI и ВСПИ) может управлять до тремя ведомыми устройствами, используя отдельные контакты выбора микросхемы (CS). Это означает, что вы можете напрямую подключить до шесть устройств SPI к одному ESP32. Для сценариев, требующих большего количества устройств, потребуется мультиплексор SPI (mux).

Стандартные контакты SPI и как их найти.

Наиболее распространенный ESP32 платы разработки (например, ESP32 В комплекте DevKit поставляется стандартная схема расположения контактов для шин HSPI и VSPI. В таблице ниже показана типичная схема:

Шина SPI МОСИ МИСО СКК КС (Пример)
ВСПИ GPIO 23 GPIO 19 GPIO 18 GPIO 5 (любой GPIO)
HSPI GPIO 13 GPIO 12 GPIO 14 GPIO 15 (любой GPIO)

⚠️ Критическая проверка: Это распространённые значения по умолчанию, но... Они могут различаться в зависимости от модели платы и производителя. (особенно для ESP32-S3, (у которой другое расположение контактов). Всегда проверяйте схему расположения контактов вашей конкретной платы.

Вы также можете использовать этот простой скетч Arduino для вывода на последовательный монитор настроенных по умолчанию SPI-контактов вашей платы. Убедитесь, что вы выбрали правильную плату в настройках. Инструменты > Доска перед загрузкой.

cpp
пустота настраивать() {
  Серийный номер.начинать(115200);
  Серийный номер.печать(""Стандартный MOSI: ""); Серийный номер.println(МОСИ);
  Серийный номер.печать(""Стандартный MISO: ""); Серийный номер.println(МИСО);
  Серийный номер.печать(""Стандартный SCK: ""); Серийный номер.println(СКК);
  Серийный номер.печать(""Стандартное значение SS: ""); Серийный номер.println(SS);
}
пустота петля() {}

Использование специально разработанных выводов SPI для максимальной гибкости.

Существенным преимуществом является ESP32 это его Матрица GPIO, Это позволяет назначать большинство функций периферийных устройств практически на любой вывод GPIO. Вы не привязаны к выводам SPI по умолчанию. Существует два основных способа использования пользовательских выводов:

1. Через конструктор библиотек (рекомендуется)

Большинство хорошо написанных библиотек для работы с периферийными устройствами (например, для датчика BME280) позволяют указывать контакты SPI при создании объекта устройства. Это самый чистый и простой способ.

cpp
#включать <Adafruit_BME280.h>
#включать <SPI.h>

// Задайте свои пользовательские контакты SPI (не стандартные)
#определять MY_MISO 32
#определять MY_MOSI 26
#определять MY_SCK  25
#определять MY_CS   33

// Передайте пользовательские контакты в конструктор библиотеки
Adafruit_BME280 бме(MY_CS, MY_MOSI, MY_MISO, MY_SCK);

пустота настраивать() {
  Серийный номер.начинать(9600);
  если (!бме.начинать()) {
    Серийный номер.println(""Не удалось найти датчик BME280!"");
    пока (1);
  }
}
// ... цикл (loop()) для чтения показаний датчика

2. Путем прямой инициализации шины SPI.

Если библиотека не предоставляет прямой настройки контактов или вы пишете низкоуровневый код для работы с SPI, вы можете инициализировать шину следующим образом: SPI.begin().

cpp
#включать <SPI.h>

#определять CUSTOM_SCK  18
#определять CUSTOM_MISO 19
#определять CUSTOM_MOSI 23
#определять CUSTOM_SS    5

пустота настраивать() {
  СПИ.начинать(CUSTOM_SCK, CUSTOM_MISO, CUSTOM_MOSI, CUSTOM_SS);
  // ... дальнейшая настройка, специфичная для устройства
}

Расширенные настройки: несколько устройств SPI и две шины.

Подключение нескольких подчиненных устройств к одной шине

К одной и той же шине SPI (например, VSPI) можно подключить несколько устройств, при условии, что каждое из них имеет... уникальный контакт выбора микросхемы (CS). Мастер (ESP32) управляет связью, подавая сигнал на вывод CS целевого ведомого устройства. НИЗКИЙ и сохраняя всех остальных ВЫСОКИЙ.

cpp
#определять CS_SENSOR_1 5
#определять CS_SENSOR_2 17

пустота настраивать() {
  pinMode(CS_SENSOR_1, ВЫХОД);
  pinMode(CS_SENSOR_2, ВЫХОД);
  digitalWrite(CS_SENSOR_1, ВЫСОКИЙ); // Сначала снимите выделение с обоих пунктов
  digitalWrite(CS_SENSOR_2, ВЫСОКИЙ);
  СПИ.начинать(); // Инициализация шины
}

пустота readSensor1() {
  digitalWrite(CS_SENSOR_1, НИЗКИЙ); // Выберите датчик 1
  // ... Здесь выполняются команды SPI.transfer()
  digitalWrite(CS_SENSOR_1, ВЫСОКИЙ); // Снять выделение
}

пустота readSensor2() {
  digitalWrite(CS_SENSOR_2, НИЗКИЙ); // Выберите датчик 2
  // ... Здесь выполняются команды SPI.transfer()
  digitalWrite(CS_SENSOR_2, ВЫСОКИЙ); // Снять выделение
}

Одновременное использование HSPI и VSPI

Для повышения производительности или изоляции критически важных устройств можно использовать Автобусы HSPI и VSPI одновременно.. Для этого необходимо создать отдельные SPIClass объекты.

cpp
#включать <SPI.h>

// Определение контактов для VSPI (может быть значением по умолчанию или пользовательским)
#определять VSPI_MISO 19
#определять VSPI_MOSI 23
#определять VSPI_SCK  18
#определять VSPI_SS    5

// Определяем контакты для HSPI (могут быть стандартными или пользовательскими)
#определять HSPI_MISO 12
#определять HSPI_MOSI 13
#определять HSPI_SCK  14
#определять HSPI_SS   15

// Создать два отдельных объекта SPI
SPIClass * vspi = новый SPIClass(ВСПИ);
SPIClass * хспи = новый SPIClass(HSPI);

пустота настраивать() {
  // Инициализируем обе шины соответствующими контактами
  vspi->начинать(VSPI_SCK, VSPI_MISO, VSPI_MOSI, VSPI_SS);
  хспи->начинать(HSPI_SCK, HSPI_MISO, HSPI_MOSI, HSPI_SS);

  pinMode(vspi->pinSS(), ВЫХОД); // Установить контакты SS в качестве выходов
  pinMode(хспи->pinSS(), ВЫХОД);
}

пустота петля() {
  // Взаимодействие с устройством по шине VSPI
  vspi->начало транзакции(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  digitalWrite(vspi->pinSS(), НИЗКИЙ);
  vspi->передача(0xAA); // Пример команды
  digitalWrite(vspi->pinSS(), ВЫСОКИЙ);
  vspi->endTransaction();

  // Осуществлять независимую связь с устройством на шине HSPI
  хспи->начало транзакции(SPISettings(500000, MSBFIRST, SPI_MODE0));
  digitalWrite(хспи->pinSS(), НИЗКИЙ);
  хспи->передача(0xBB); // Пример команды
  digitalWrite(хспи->pinSS(), ВЫСОКИЙ);
  хспи->endTransaction();

  задерживать(1000);
}

Практическое руководство по программированию: интеграция SPI-датчика.

Давайте закрепим эти понятия на практическом примере чтения текста. BME280 Датчик температуры, давления и влажности через интерфейс SPI.

cpp
/* * SPI-связь ESP32 с датчиком BME280 * Использует пользовательские SPI-контакты и демонстрирует интеграцию с библиотекой. */

#включать <Wire.h>
#включать <Adafruit_Sensor.h>
#включать <Adafruit_BME280.h>
#включать <SPI.h>

// 1. ОПРЕДЕЛЕНИЕ ПОЛЬЗОВАТЕЛЬСКИХ SPI-КОНТАКТОВ
#определять BME280_SCK   25
#определять BME280_MISO  32
#определять BME280_MOSI  26
#определять BME280_CS    33

// 2. СОЗДАЙТЕ ОБЪЕКТ ДАТЧИКА С ПОЛЬЗОВАТЕЛЬСКИМИ КОНТАКТАМИ
Adafruit_BME280 бме(BME280_CS, BME280_MOSI, BME280_MISO, BME280_SCK);

пустота настраивать() {
  Серийный номер.начинать(115200);
  Серийный номер.println(F("Тест BME280 SPI"));

  // 3. ИНИЦИАЛИЗАЦИЯ ДАТЧИКА
  если (!бме.начинать()) {
    Серийный номер.println("Не удалось найти BME280. Проверьте проводку/контакты!");
    пока (1);
  }
}

пустота петля() {
  // 4. ЧТЕНИЕ И ВЫВОД ЗНАЧЕНИЙ
  Серийный номер.печать(""Температура = "");
  Серийный номер.печать(бме.readTemperature());
  Серийный номер.println("" °C"");

  Серийный номер.печать(""Давление = "");
  Серийный номер.печать(бме.readPressure() / 100.0F); // Преобразовать в гПа
  Серийный номер.println("" гПа"");

  Серийный номер.печать(""Влажность = "");
  Серийный номер.печать(бме.readHumidity());
  Серийный номер.println(" %");

  Серийный номер.println("----------------");
  задерживать(5000); // Подождите 5 секунд
}

Устранение распространенных проблем с SPI

Проблема Вероятная причина Решение
От раба нет ответа. Неправильная проводка, неправильный контакт CS или отсутствие питания у ведомого устройства. Дважды проверьте соединения MISO/MOSI/SCK/CS и GND. Убедитесь, что ведомое устройство питается (3,3 В). Вручную переключите контакт CS в положение НИЗКИЙ/ВЫСОКИЙ.
Мусорные/некорректные данные Несоответствие режимов SPI или чрезмерная тактовая частота. Убедитесь, что ведущее и ведомое устройства используют один и тот же интерфейс SPI. Режим (MODE0, MODE1, MODE2, MODE3). Уменьшите тактовую частоту SPI (SPISettings).
Конфликты автобусов SPI На одной и той же линии CS происходит взаимная интерференция нескольких ведомых устройств. Убедитесь, что в любой момент времени только один контакт CS находится в низком состоянии. Добавьте небольшой задерживать между выбором разных рабов.
начинать() Не работает с пользовательскими контактами. Контакты не подходят для вывода сигнала или уже заняты. Избегайте использования контактов, блокирующих вывод (GPIO 0, 2, 12, 15 при загрузке). Проверьте распиновку вашей платы на наличие запрещенных контактов.

Данное руководство предоставляет базовые и углубленные знания, необходимые для уверенной реализации SPI-коммуникаций в вашей системе. ESP32 проекты. Понимая двухшинную архитектуру, осваивая настройку пользовательских контактов и следуя передовым методам управления несколькими ведомыми устройствами, вы сможете взаимодействовать с обширной экосистемой высокоскоростных периферийных устройств.

======================================

О сайте ESP32S.com

С 2016 года, ESP32S.com Наша компания превратилась в полноценного партнера по экосистеме для вашего развития в сфере Интернета вещей. Расположенная в Шэньчжэне, глобальном центре инноваций в электронике, мы помогли сотням разработчиков и компаний реализовать свои проекты. ESP32Воплощаем идеи в жизнь. Наша команда стремится оказывать исключительную поддержку и предлагать инновационные решения, которые помогут вам достичь ваших целей в области Интернета вещей.
В ESP32S.com, мы осваиваем тонкости разработки ESP32Разработка продукта, основанного на концепции, включает в себя множество этапов, от разработки до вывода на рынок. Именно поэтому мы предлагаем комплексные решения, охватывающие весь жизненный цикл продукта. ESP32Устройства на базе [технологии]. Независимо от того, нужна ли вам помощь в проектировании печатных плат, создании прототипов, производстве или даже маркетинге и доставке, мы вам поможем.

Свяжитесь с нами

Готовы вывести свой IoT-проект на новый уровень? Свяжитесь с ESP32S.com Узнайте больше о наших комплексных решениях уже сегодня! ESP32Устройства на базе [технологии]. Позвольте нам стать вашим надежным партнером в воплощении ваших инновационных идей в жизнь. Свяжитесь с нами прямо сейчас для начала.