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
相关产品推荐
相关产品推荐

