
SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步的通信协议,常用于微控制器与外围设备(如传感器、显示屏、ADC/DAC 等)之间的短距离通信。
高速传输速率(通常可达几 Mbps)
全双工通信(可同时发送和接收数据)
同步通信(使用时钟信号同步数据传输)
支持多个从设备
SPI 通信主要通过 4 根线实现:
SCLK(Serial Clock):时钟线,由主机产生,用于同步数据传输
MOSI(Master Out Slave In):主机输出,从机输入
MISO(Master In Slave Out):主机输入,从机输出
CS/SS(Chip Select/Slave Select):片选线,用于选择通信的从设备(低电平有效)
主机通过拉低某个从设备的 CS 线选中该设备
主机产生 SCLK 时钟信号
数据在时钟信号的同步下,通过 MOSI 和 MISO 线同时传输
每个时钟周期传输一位数据
通信结束后,主机拉高 CS 线释放该从设备
树莓派 Pico的SPI 有 2 个硬件 SPI 控制器:SPI0 和 SPI1,默认引脚分配如下:其中CS 引脚可任意选择 GPIO 引脚。
| spi控制器 | SCK引脚 | MOSI引脚 | MISO引脚 |
| SPI0 | SPI2 | GP3 | GP4 |
| SPI1 | GP10 | GP11 | GP12 |
以下示例展示如何使用树莓派 Pico 的 SPI 接口进行通信,包含主机和从机两种模式的代码。
from machine import Pin, SPI
import time
# 初始化SPI0为主机模式
spi = SPI(0,
baudrate=1000000, # 1MHz
polarity=0, # 时钟空闲时为低电平
phase=0, # 数据在时钟上升沿采样
sck=Pin(2), # SCK引脚
mosi=Pin(3), # MOSI引脚
miso=Pin(4)) # MISO引脚
# 初始化CS引脚
cs = Pin(5, Pin.OUT, value=1) # 初始化为高电平(未选中)
def send_receive_data(data):
cs.value(0) # 拉低CS,选中从设备
time.sleep_us(10) # 短暂延时
# 创建接收缓冲区(与发送数据长度相同)
rx_data = bytearray(len(data))
# 发送并接收数据
spi.write_readinto(data, rx_data)
time.sleep_us(10)
cs.value(1) # 拉高CS,释放从设备
return rx_data
# 主循环
while True:
# 发送数据
tx_data = bytearray([0x01, 0x02, 0x03, 0x04])
rx_data = send_receive_data(tx_data)
print(f"发送: {list(tx_data)}")
print(f"接收: {list(rx_data)}")
time.sleep(1)
主机模式代码(spi_master.py):
初始化 SPI0 为主机模式,设置波特率为 1MHz
配置 SCLK、MOSI、MISO 和 CS 引脚
send_receive_data函数实现:拉低 CS 选中设备、发送数据并接收响应、最后释放 CS
主循环中周期性发送数据并打印收发内容
从机模式代码(spi_slave.py):
初始化 SPI0 为从机模式,参数需与主机匹配
监听 CS 引脚状态,当被选中时进行数据收发
接收主机数据的同时发送预设的响应数据
简单修改响应数据,以便观察通信效果
准备两块树莓派 Pico 板
分别将主机代码和从机代码上传到两块 Pico
按如下方式连接线路:
主机 SCLK(GP2)→ 从机 SCLK(GP2)
主机 MOSI(GP3)→ 从机 MOSI(GP3)
主机 MISO(GP4)→ 从机 MISO(GP4)
主机 CS(GP5)→ 从机 CS(GP5)
两块 Pico 共地(GND 相连)
分别给两块 Pico 上电,通过串口监视器观察通信结果
主从设备的 SPI 参数(波特率、极性、相位)必须一致
通信距离不宜过长,通常在几米以内
多从机情况下,每个从机需要独立的 CS 线
高速通信时可能需要考虑线路阻抗匹配
通过 SPI 协议,树莓派 Pico 可以高效地与各种外设进行通信,适用于需要高速数据传输的场景。