树莓派与Arduino间SPI通信故障排查及代码修复请求
修复树莓派与Arduino SPI通信问题
核心问题分析
- 缺少片选(CS)引脚连接:SPI主从通信必须通过CS引脚选择从设备,现有连接未接入该引脚,导致树莓派无法触发Arduino的SPI中断,通信挂起。
- 树莓派代码递归调用引发崩溃:
main()函数内递归调用自身,会快速耗尽栈内存,导致程序无响应或崩溃。 - 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() {}
额外排查建议
- 启用树莓派SPI驱动:Ubuntu系统下执行
sudo modprobe spi_bcm2835加载驱动,或通过sudo raspi-config的「Interface Options」启用SPI。 - 权限处理:运行Python脚本时需加
sudo,否则可能无权限访问SPI设备。 - 电平兼容性:树莓派为3.3V电平,Arduino Uno为5V电平,长期直接连接可能损坏树莓派GPIO,建议使用电平转换板。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

