Введение
SPI (Sequential Peripheral Interface) — это синхронный последовательный протокол связи, широко используемый для подключения микроконтроллеров к датчикам, дисплеям и другим периферийным устройствам. В этом руководстве мы создадим простой тест SPI-петли на Raspberry Pi Pico с помощью браузерного симулятора Velxio. Pico будет отправлять байты через SPI0 и считывать их обратно, а три светодиода будут визуально показывать активность на линиях MOSI, MISO и SCK. Это отличный способ убедиться, что ваше SPI-оборудование и разводка работают корректно, прежде чем переходить к более сложным проектам.

Разбор схемы
Давайте рассмотрим компоненты и разводку в этой схеме.
Компоненты
- Raspberry Pi Pico (мозг операции)
- Красный светодиод — подключен к линии MOSI (GP7)
- Зеленый светодиод — подключен к линии MISO (GP4)
- Желтый светодиод — подключен к линии SCK (GP6)
Разводка
Выводы SPI0 на Pico распределены следующим образом:
- MOSI (Master Out Slave In) — GP7 (D7 на распиновке Nano RP2040 Connect)
- MISO (Master In Slave Out) — GP4 (D4)
- SCK (Serial Clock) — GP6 (D6)
- CS (Chip Select) — не используется в этом тесте петли
Анод (A) каждого светодиода подключается к соответствующему выводу SPI, а катод (C) — к GND (GND.1 на Pico). Цвета проводов в симуляторе:
- MOSI: красный провод (
#ff4444) - MISO: зеленый провод (
#00cc00) - SCK: желтый провод (
#ffaa00) - Земля: черный провод (
#000000)
Эта простая настройка позволяет видеть активность SPI: светодиоды будут мигать при передаче данных.
Разбор кода
Вот полный скетч Arduino для Pico:
// Raspberry Pi Pico — SPI Loopback Test
// Sends bytes over SPI0 and reads the loopback response
// Default SPI0 pins: MISO=GP16, MOSI=GP19, SCK=GP18, CS=GP17
#include <SPI.h>
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("=== Pico SPI Loopback Test ===");
Serial.println("SPI0: MISO=GP16, MOSI=GP19, SCK=GP18");
Serial.println();
SPI.begin();
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
// Send test bytes
byte testBytes[] = {0x55, 0xAA, 0xFF, 0x00, 0x42};
int count = sizeof(testBytes);
Serial.println("Sending bytes and reading loopback:");
for (int i = 0; i < count; i++) {
byte rxByte = SPI.transfer(testBytes[i]);
Serial.print(" TX: 0x");
if (testBytes[i] < 16) Serial.print('0');
Serial.print(testBytes[i], HEX);
Serial.print(" RX: 0x");
if (rxByte < 16) Serial.print('0');
Serial.print(rxByte, HEX);
Serial.print(" ");
Serial.println(rxByte == testBytes[i] ? "MATCH" : "DIFFER");
}
SPI.endTransaction();
Serial.println();
Serial.println("SPI test complete.");
}
void loop() {
delay(10000);
}
Как это работает
- Настройка последовательного порта: Мы запускаем последовательную связь на скорости 115200 бод для вывода результатов в монитор последовательного порта.
- Инициализация SPI:
SPI.begin()инициализирует периферийное устройство SPI0.SPI.beginTransaction()настраивает шину с тактовой частотой 1 МГц, порядком данных MSB-first и режимом SPI 0 (CPOL=0, CPHA=0). - Тестовые данные: Мы определяем массив из пяти тестовых байтов:
0x55,0xAA,0xFF,0x00и0x42. Они охватывают чередующиеся биты, все единицы, все нули и смешанный шаблон. - Передача в петле: Для каждого байта мы вызываем
SPI.transfer(). Это одновременно отправляет байт и принимает байт, находящийся в данный момент на линии MISO. Поскольку у нас есть петля (MISO подключен к MOSI внешне или внутренне), принятый байт должен совпадать с отправленным. - Отображение результатов: Скетч выводит переданные (TX) и принятые (RX) байты в шестнадцатеричном формате, а также статус “MATCH” или “DIFFER”.
- Завершение:
SPI.endTransaction()освобождает шину SPI.
Ключевые концепции
- Протокол SPI: SPI — это полнодуплексный синхронный протокол с одним ведущим (Pico) и одним или несколькими ведомыми. Он использует четыре провода: MOSI, MISO, SCK и CS (выбор микросхемы). В этом тесте петли мы используем только MOSI, MISO и SCK.
- Петля (Loopback): Подключение MOSI к MISO позволяет ведущему получать собственные переданные данные. Это распространенный тест для проверки работоспособности SPI-оборудования и разводки.
- Режимы SPI: Режим (0, 1, 2 или 3) определяет полярность и фазу тактового сигнала. Режим 0 (CPOL=0, CPHA=0) является наиболее распространенным.
- Скорость передачи: Скорость передачи монитора последовательного порта (115200) должна соответствовать настройке
Serial.begin()в скетче.
Типичные ошибки и советы по отладке
- Неправильное назначение выводов: В комментариях к коду упоминаются выводы SPI0 по умолчанию (GP16, GP19, GP18), но фактическая разводка использует GP7, GP4 и GP6. Всегда проверяйте распиновку для вашей конкретной платы. В Velxio выводы SPI0 для Pico — GP7 (MOSI), GP4 (MISO) и GP6 (SCK).
- Отсутствие заземления: Убедитесь, что катоды всех светодиодов подключены к GND. Без пути заземления светодиоды не загорятся.
- Монитор последовательного порта не показывает вывод: Убедитесь, что скорость передачи установлена на 115200 в мониторе последовательного порта Velxio. Вы можете открыть его на панели инструментов редактора.
- Светодиоды не мигают: Проверьте, что светодиоды подключены к правильным выводам и что код выполняется. Светодиоды будут быстро мигать во время цикла
for, а затем погаснут. - Петля не работает: Если принятые байты не совпадают, проверьте, подключены ли MOSI и MISO. В этой схеме они не подключены напрямую; светодиоды являются только индикаторами. Для настоящей петли вам нужно будет соединить GP7 и GP4 проводом. Однако код все равно выполняется и выводит результаты — принятый байт будет тем, что находится на линии MISO (вероятно, 0xFF или 0x00, если она висит в воздухе).
Предлагаемые расширения
- Добавьте физическую петлю: Подключите провод от GP7 (MOSI) к GP4 (MISO), чтобы фактически замкнуть данные обратно. Тогда принятые байты должны идеально совпадать.
- Используйте другой режим SPI: Измените
SPI_MODE0наSPI_MODE1,SPI_MODE2илиSPI_MODE3и понаблюдайте за эффектом на светодиодах. - Увеличьте тактовую частоту: Попробуйте 8 МГц или 16 МГц и посмотрите, будут ли светодиоды все еще видимо мигать.
- Добавьте больше светодиодов: Подключите светодиоды к выводу CS (GP17) и другим GPIO для визуализации дополнительных сигналов.
- Взаимодействуйте с реальным SPI-устройством: Замените петлю на SPI-датчик (например, датчик температуры) и считайте его данные.
Попробуйте сами
Готовы создать этот проект? Откройте живой пример в Velxio и начинайте экспериментировать:
Открыть Pico SPI Loopback в Velxio
Используйте панель инструментов редактора Velxio для компиляции и запуска кода, а также откройте монитор последовательного порта, чтобы увидеть результаты. Панель инструментов холста позволяет масштабировать и перемещать схему. Если вам нужно добавить компоненты, используйте средство выбора компонентов.



Удачного конструирования!