Назад

SPI-тест с обратной связью: Освойте протокол с Velxio

Введение

SPI (Serial Peripheral Interface) — это синхронный последовательный протокол связи, широко используемый для подключения микроконтроллеров к датчикам, дисплеям и микросхемам памяти. В этом руководстве мы создадим тест SPI с обратной связью с помощью симулятора Velxio. Тест с обратной связью отправляет байты через SPI и считывает ответ, подтверждая корректную работу протокола. Поскольку физического ведомого устройства нет, симулятор возвращает отправленный байт, что делает этот способ идеальным для изучения SPI без какого-либо оборудования.

Сборка схемы

Начнем с создания схемы. Единственный необходимый компонент — Arduino Uno, который мы разместим на холсте.

Схема подключения spi-loopback на холсте симулятора Velxio

Чтобы добавить Arduino Uno, откройте выбор компонентов, нажав на значок ”+” на панели инструментов холста.

Модальное окно выбора компонентов Velxio с просмотром деталей по категориям

Найдите “Arduino Uno” и разместите его на холсте. Arduino Uno имеет выделенные выводы SPI:

В этом тесте с обратной связью внешнее подключение не требуется, так как сигналы SPI являются внутренними для Arduino. Однако необходимо убедиться, что вывод SS (вывод 10) настроен как выход и изначально установлен в высокий уровень, а затем переключается в низкий во время передачи. Это обрабатывается в коде.

Разбор кода

Теперь рассмотрим код. Откройте редактор кода, нажав на вкладку “Code” на панели инструментов редактора.

Панель инструментов редактора Velxio с элементами управления компиляцией и запуском

Код написан на Arduino C++ и использует встроенную библиотеку SPI.h. Внешние библиотеки не требуются.

// SPI Loopback Test
// Sends bytes via SPI and logs the exchange.
// Without a physical slave, the emulator returns the sent byte.

#include <SPI.h>

#define SS_PIN 10

void setup() {
  Serial.begin(9600);
  Serial.println("========================");
  Serial.println("  SPI Protocol Test");
  Serial.println("========================");
  Serial.println();

  pinMode(SS_PIN, OUTPUT);
  digitalWrite(SS_PIN, HIGH);
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV16);

  Serial.println("SPI initialized.");
  Serial.print("Clock divider: 16 (");
  Serial.print(F_CPU / 16);
  Serial.println(" Hz)");
  Serial.println();

  // Send test pattern
  Serial.println("Sending test pattern via SPI:");
  byte testData[] = {0xAA, 0x55, 0xFF, 0x00, 0x42, 0xDE, 0xAD, 0xBE};

  digitalWrite(SS_PIN, LOW);  // Select slave

  for (int i = 0; i < sizeof(testData); i++) {
    byte sent = testData[i];
    byte received = SPI.transfer(sent);

    Serial.print("  TX: 0x");
    if (sent < 16) Serial.print("0");
    Serial.print(sent, HEX);
    Serial.print("  RX: 0x");
    if (received < 16) Serial.print("0");
    Serial.print(received, HEX);

    if (sent == received) {
      Serial.println("  (loopback OK)");
    } else {
      Serial.println();
    }
  }

  digitalWrite(SS_PIN, HIGH);  // Deselect slave

  Serial.println();
  Serial.println("SPI test complete.");
}

void loop() {
  delay(1000);
}

Разберем ключевые части:

Ключевые концепции

Распространенные ошибки и советы по отладке

Предлагаемые расширения

Попробуйте сами

Готовы погрузиться? Откройте живой пример в Velxio и запустите симуляцию. Вы увидите вывод в последовательный порт с каждым переданным и принятым байтом, подтверждающий обратную связь.

Откройте тест SPI с обратной связью в Velxio

Удачного моделирования!


Поделиться:
David Montero

Автор

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Похожие статьи


Предыдущая статья
Осваиваем Serial, I2C и SPI на Arduino с Velxio
Следующая статья
Чтение/запись I2C EEPROM с Arduino: Полное руководство