【问题标题】:receiving wrong data sent from a pi pico on a raspberry pi 4 using wiringPi使用 wiringPi 接收从树莓派 4 上的 pi pico 发送的错误数据
【发布时间】:2023-01-10 21:59:22
【问题描述】:

所以我正在使用 pi pico 的 c/c++ sdk 来尝试通过 spi 将数据发送到树莓派 4。在 Pi 4 上,我使用 wiringPi 库来实现 SPI 功能。但是,当我将我想在 SPI 上从我的 PICO 发送的值(在我检查范围时发送)发送到 Pi 4 时,pi 4 收到错误的信息,例如打印看似随机的字符而不是预期价值。

对此的任何帮助将不胜感激,请参阅下面我的 Pico 和我的 Pi 4 的代码,我希望收到 5 的值。我已将 pico 和 pi 4 中的 len 参数更改为 1、2、4 和 8,结果都相同。

#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){

    //printf("here top");
    gpio_put(CS, 0);
    spi_write_blocking(SPI_PORT, &test_send, 1);
    //spi_read_blocking(SPI_PORT, 0, test_read, 1);
    gpio_put(CS, 1);
    //printf("here\n");

   
    }
}

这是我用于 Pi 4 的代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
//#include </home/dean21/Documents/mosquitto-master/include/mosquitto.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];
unsigned char test;

static int myFd;


int main(){
wiringPiSetupGpio();
//holder[0] = 0x5;

unsigned char result;

wiringPiSPISetup (CHANNEL, 500000);


// even though this function is for read and write im only using it as a read

while(1){

wiringPiSPIDataRW(CHANNEL, //Enable / CS pin
 holder, //Data
 1); //Lenth

cout << "holder value is: " << holder << endl;

//delay(1000);

}

}

输出示例如下所示,当它应该接收值 5 时

持有人的价值是:(

持有人的价值是:

持有人的价值是:@

持有人的价值是:P

持有人的价值是:

持有人的价值是:

持有人的价值是:

【问题讨论】:

  • test_send = 5; 是一个字符。 0x05 是查询。对于数字 5,合适的数字是 0x35'5'。检查 ascii 表asciitable.com。始终初始化数组。

标签: c++ spi raspberry-pi4 raspberry-pi-pico


【解决方案1】:

您的代码存在一些问题。

  1. 您的unsigned char holder[100]; 似乎未初始化,因此无法知道这 100 个字节中有什么数据。您应该始终初始化数据。
  2. 看起来您一次只将 1 个字节读入 holder,但您正在尝试打印整个缓冲区。您可能只想cout &lt;&lt; holder[0]; 。似乎正在发生的事情是它将尝试打印直到到达
猜你喜欢
  • 2021-10-18
  • 2022-12-16
  • 1970-01-01
  • 2020-02-16
  • 2022-11-08
  • 1970-01-01
  • 2021-07-29
  • 2022-11-13
  • 2016-08-28
相关资源
最近更新 更多