简介
SPI(串行外设接口)是一种同步串行通信协议,广泛用于将微控制器与传感器、显示屏及其他外设连接。在本教程中,我们将使用 Velxio 浏览器内模拟器在 Raspberry Pi Pico 上构建一个简单的 SPI 回环测试。Pico 将通过 SPI0 发送字节并读取回传数据,同时三个 LED 分别直观显示 MOSI、MISO 和 SCK 线路上的活动。这是在转向更复杂项目之前,验证 SPI 硬件和接线是否正常工作的绝佳方式。

电路详解
让我们看看这个电路中的元件和接线。
元件
- Raspberry Pi Pico(操作核心)
- 红色 LED – 连接到 MOSI 线(GP7)
- 绿色 LED – 连接到 MISO 线(GP4)
- 黄色 LED – 连接到 SCK 线(GP6)
接线
Pico 的 SPI0 引脚映射如下:
- MOSI(主出从入) – GP7(Nano RP2040 Connect 引脚排列上的 D7)
- MISO(主入从出) – GP4(D4)
- SCK(串行时钟) – GP6(D6)
- CS(片选) – 本回环测试中未使用
每个 LED 的阳极(A)连接到相应的 SPI 引脚,阴极(C)连接到 GND(Pico 上的 GND.1)。模拟器中的导线颜色为:
- MOSI:红色导线(
#ff4444) - MISO:绿色导线(
#00cc00) - SCK:黄色导线(
#ffaa00) - 地线:黑色导线(
#000000)
这种简单的设置让你能够看到 SPI 活动:LED 会在数据传输时闪烁。
代码详解
以下是 Pico 的完整 Arduino 代码:
// 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 MHz 时钟速度、MSB 优先数据顺序和 SPI 模式 0(CPOL=0, CPHA=0)。 - 测试数据:我们定义了一个包含五个测试字节的数组:
0x55、0xAA、0xFF、0x00和0x42。这些涵盖了交替位、全 1、全 0 和混合模式。 - 回环传输:对于每个字节,我们调用
SPI.transfer()。这会同时发送一个字节并接收当前 MISO 线上的字节。由于我们有一个回环(MISO 在外部或内部连接到 MOSI),接收到的字节应与发送的字节匹配。 - 结果显示:代码以十六进制打印发送(TX)和接收(RX)的字节,以及“MATCH”或“DIFFER”状态。
- 清理:
SPI.endTransaction()释放 SPI 总线。
关键概念
- SPI 协议:SPI 是一种全双工同步协议,有一个主设备(Pico)和一个或多个从设备。它使用四根线:MOSI、MISO、SCK 和 CS(片选)。在此回环测试中,我们只使用 MOSI、MISO 和 SCK。
- 回环:将 MOSI 连接到 MISO 允许主设备接收自己发送的数据。这是验证 SPI 硬件和接线是否正常工作的常见测试。
- SPI 模式:模式(0、1、2 或 3)定义了时钟极性和相位。模式 0(CPOL=0, CPHA=0)是最常见的。
- 波特率:串口监视器波特率(115200)必须与代码中的
Serial.begin()设置一致。
常见陷阱与调试技巧
- 引脚映射错误:代码注释提到了默认的 SPI0 引脚(GP16、GP19、GP18),但实际接线使用了 GP7、GP4 和 GP6。务必验证你特定板子的引脚排列。在 Velxio 中,Pico 的 SPI0 引脚是 GP7(MOSI)、GP4(MISO)和 GP6(SCK)。
- 缺少接地:确保所有 LED 的阴极都连接到 GND。如果没有接地路径,LED 不会亮起。
- 串口监视器无输出:确保 Velxio 串口监视器的波特率设置为 115200。你可以从编辑器工具栏打开它。
- LED 不闪烁:检查 LED 是否连接到正确的引脚,并且代码是否正在运行。LED 会在
for循环期间快速闪烁,然后保持熄灭。 - 回环不工作:如果接收到的字节不匹配,请验证 MOSI 和 MISO 是否连接。在此电路中,它们没有直接连接;LED 只是指示器。要实现真正的回环,你需要用一根导线将 GP7 连接到 GP4。不过,代码仍然会运行并打印结果——接收到的字节将是 MISO 线上的任何值(如果悬空,很可能是 0xFF 或 0x00)。
建议的扩展
- 添加物理回环:用一根导线将 GP7(MOSI)连接到 GP4(MISO),以实际回传数据。这样接收到的字节应该完全匹配。
- 使用不同的 SPI 模式:将
SPI_MODE0改为SPI_MODE1、SPI_MODE2或SPI_MODE3,观察对 LED 的影响。 - 提高时钟速度:尝试 8 MHz 或 16 MHz,看看 LED 是否仍然可见地闪烁。
- 添加更多 LED:将 LED 连接到 CS 引脚(GP17)和其他 GPIO,以可视化更多信号。
- 与真实 SPI 设备交互:用 SPI 传感器(例如温度传感器)替换回环,并读取其数据。
亲自尝试
准备好构建这个项目了吗?在 Velxio 中打开实时示例并开始实验:
使用 Velxio 编辑器工具栏编译并运行代码,然后打开串口监视器查看结果。画布工具栏允许你缩放和平移电路。如果需要添加元件,请使用元件选择器。



祝你构建愉快!