如何通过SPI在两台Raspberry Pi Pico间传输图像?代码问题排查
两台Raspberry Pi Pico SPI图像传输代码问题排查
发送端代码问题
- 文件读取变量名错误:
with open('image.jpg', "rb") as image:中,读取文件误用了未定义的f.read(),应改为img = image.read()。 - SPI引脚配置错误:发送端作为SPI主设备,需指定
MOSI引脚用于发送数据,当前错误使用MISO引脚。修正为:spi = busio.SPI(board.SCK, MOSI=board.MOSI)。 - 缺失异常处理:文件读取、SPI操作未做异常捕获,建议添加try-except块处理IO或通信错误。
修正后的发送端代码(含长度同步逻辑):
import board import busio import digitalio import time try: with open('image.jpg', "rb") as image: img = image.read() imgbyte = bytearray(img) spi = busio.SPI(board.SCK, MOSI=board.MOSI) spi.configure(baudrate=5000000, phase=0, polarity=0) while not spi.try_lock(): pass cs = digitalio.DigitalInOut(board.D2) cs.direction = digitalio.Direction.OUTPUT # 先发送文件长度(4字节大端格式) cs.value = False spi.write(len(imgbyte).to_bytes(4, byteorder='big')) cs.value = True time.sleep(0.001) # 发送图像数据 cs.value = False spi.write(imgbyte) cs.value = True spi.unlock() except Exception as e: print(f"发送错误: {e}")
接收端代码问题
- SPI引脚配置错误:接收端作为SPI从设备,需监听主设备的
MOSI引脚接收数据,当前错误使用MISO引脚。修正为:spi = busio.SPI(board.SCK, MOSI=board.MOSI)。 - CS引脚操作错误:接收端CS为输入引脚,不能直接设置
cs.value = False,应监听CS电平变化触发接收。 - 接收数据长度不足:当前仅接收4字节,远小于图像大小,需先接收文件长度再同步接收完整数据。
- 文件路径拼写错误:
"/lmage.jpg"应为"/image.jpg"。 - 缺失time模块导入:代码使用
time.sleep(1)但未导入time模块。 - 文件打开模式错误:用
"a"追加模式会损坏图像,首次接收应使用"wb"写入模式。 - 接收逻辑不完善:无循环接收完整数据的逻辑,未同步CS时序。
修正后的接收端代码:
import board import busio import digitalio import time # 接收文件长度(4字节大端格式) def receive_file_length(spi, cs): length_buf = bytearray(4) cs.value = False spi.readinto(length_buf) cs.value = True return int.from_bytes(length_buf, byteorder='big') try: spi = busio.SPI(board.SCK, MOSI=board.MOSI) spi.configure(baudrate=5000000, phase=0, polarity=0) while not spi.try_lock(): pass cs = digitalio.DigitalInOut(board.D2) cs.direction = digitalio.Direction.INPUT # 等待CS拉低触发接收 while cs.value: time.sleep(0.001) # 先接收文件长度 file_length = receive_file_length(spi, cs) # 准备接收完整图像数据 receiver = bytearray(file_length) cs.value = False spi.readinto(receiver) cs.value = True spi.unlock() with open("/image.jpg", "wb") as image: image.write(receiver) image.flush() print("接收完成") except Exception as e: print(f"接收错误: {e}")
硬件连线要求
- 主设备(Pico #1)SCK ↔ 从设备(Pico #2)SCK
- 主设备MOSI ↔ 从设备MOSI
- 主设备CS(D2)↔ 从设备CS(D2)
- 两台Pico必须共地
内容的提问来源于stack exchange,提问作者Anton9101
相关产品推荐
相关产品推荐

