You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派与Arduino间SPI通信故障排查及代码修复请求

修复树莓派与Arduino SPI通信问题

核心问题分析

  1. 缺少片选(CS)引脚连接:SPI主从通信必须通过CS引脚选择从设备,现有连接未接入该引脚,导致树莓派无法触发Arduino的SPI中断,通信挂起。
  2. 树莓派代码递归调用引发崩溃:main()函数内递归调用自身,会快速耗尽栈内存,导致程序无响应或崩溃。
  3. Arduino未正确进入从机模式:未将SS引脚设置为输入,Arduino默认不会启用SPI从机功能。

硬件连接补充

添加以下接线:

  • 树莓派CE0(GPIO8,物理引脚24)→ Arduino SS(PIN10)

修复后的代码

树莓派主设备代码

import wiringpi
import time
import sys

SPI_CHANNEL = 0
SPI_CLOCK_SPEED = 1000000

def main():
    wiringpi.wiringPiSetup()
    fd = wiringpi.wiringPiSPISetup(SPI_CHANNEL, SPI_CLOCK_SPEED)

    if fd == -1:
        print("Failed to init SPI communication.")
        sys.exit(1)

    print("SPI communication successfully setup.")

    while True:
        buff = [23, 0]
        wiringpi.wiringPiSPIDataRW(SPI_CHANNEL, buff)
        print("Data returned: ", buff[1])
        time.sleep(1)

if __name__ == "__main__":
    main()

Arduino从设备代码

#include <SPI.h>

void setup() {
  pinMode(SS, INPUT);
  pinMode(MISO, OUTPUT);
  SPCR |= _BV(SPE);
  SPI.attachInterrupt();
}

ISR(SPI_STC_vect) {
  byte c = SPDR;
  SPDR = c + 10;
}

void loop() {}

额外排查建议

  1. 启用树莓派SPI驱动:Ubuntu系统下执行sudo modprobe spi_bcm2835加载驱动,或通过sudo raspi-config的「Interface Options」启用SPI。
  2. 权限处理:运行Python脚本时需加sudo,否则可能无权限访问SPI设备。
  3. 电平兼容性:树莓派为3.3V电平,Arduino Uno为5V电平,长期直接连接可能损坏树莓派GPIO,建议使用电平转换板。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 08:47:47