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

Pi Pico向树莓派4发送SPI数据,wiringPi接收错误求助

SPI通信故障排查:Pi Pico发送5但树莓派4收到随机值

问题背景

使用Pi Pico的C/C++ SDK通过SPI向树莓派4发送数据,树莓派4端采用wiringPi库实现SPI功能。经示波器确认Pi Pico已发出预期值5,但树莓派4接收到的却是随机字符。调整两端len参数为1、2、4、8后问题依旧。

Pi Pico代码

#include <iostream>
#include <stdio.h>

#include "hardware/uart.h"
#include "pico/stdlib.h"
#include "hardware/spi.h"

using namespace std;

//-------SPI Ports-------
#define SPI_PORT spi0
#define SPI_PORT_1 spi1
//-----------------------

//-------Port 0 SPI pins--------
#define MOSI 3
#define MISO 4
#define SCK 2
#define CS 5
//------------------------------

//-------UART Setup-------
#define UART_ID uart0
#define BAUD_RATE_UART 115200

#define UART_TX_PIN 0
#define UART_RX_PIN 1
//------------------------

uint8_t test_send;

uint8_t test_read[3];

int main() {

    stdio_init_all();

    //-------------------UART init------------------
    uart_init(UART_ID, BAUD_RATE_UART);

    gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);
    gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);
    //----------------------------------------------

    spi_init(SPI_PORT, 500000);

    gpio_init(CS);
    gpio_set_dir(CS, GPIO_OUT);
    gpio_put(CS, 1);

    spi_set_format(SPI_PORT, 12, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);

    gpio_set_function(SCK, GPIO_FUNC_SPI);
    gpio_set_function(MOSI, GPIO_FUNC_SPI);
    gpio_set_function(MISO, GPIO_FUNC_SPI);

    test_send = 5;

    while(1){
        gpio_put(CS, 0);
        spi_write_blocking(SPI_PORT, &test_send, 1);
        gpio_put(CS, 1);
    }
}

树莓派4代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <errno.h>
#include <string.h>

using namespace std;

static const int CHANNEL = 0;
unsigned char holder[100];

int main(){
    wiringPiSetupGpio();
    wiringPiSPISetup(CHANNEL, 500000);

    while(1){
        wiringPiSPIDataRW(CHANNEL, holder, 1);
        cout << "holder value is: " << holder << endl;
    }
}

错误输出示例

holder value is:(
holder value is:
holder value is:@
holder value is:P
holder value is:
holder value is:

排查与修复方案

1. 修正SPI数据位宽度不匹配

Pi Pico代码中设置了12位数据宽度,但树莓派4端默认使用8位SPI模式,两端参数不一致会导致数据解析错误。将Pi Pico的SPI格式改为8位:

spi_set_format(SPI_PORT, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);

2. 修复树莓派端数据输出逻辑

当前代码直接输出字符数组holder,会将数值5(对应ASCII控制字符)显示为乱码/空白,且会把数组当作字符串截断。应输出数值本身:

cout << "holder value is: " << static_cast<int>(holder[0]) << endl;

3. 确保SPI时序与硬件接线正确

  • 确认Pi Pico的CS拉低后,树莓派端已准备好接收数据,可在Pico的gpio_put(CS, 0)后添加sleep_us(10)确保时序同步
  • 检查硬件接线:
    • Pico MOSI(3) → 树莓派 MOSI(GPIO10)
    • Pico SCK(2) → 树莓派 SCK(GPIO11)
    • Pico CS(5) → 树莓派 CE0(GPIO8)
    • 两端必须共地,避免信号干扰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:02:17