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

树莓派Pico使用SPI发送16位数据的技术求助

树莓派Pico SPI发送16位数据问题解决

问题描述

我正在使用Visual Studio以C++编程树莓派Pico,需要通过SPI发送一个4位十六进制值(16位),可通过两次8位发送或一次16位发送实现。当前使用"hardware/spi.h"库,仅能成功发送8位数据,例如发送0x2100时仅能看到前8位,无法发送完整数据。请问是否有方法或其他库可实现完整发送0x2100?

用户提供的代码:

#include "pico/stdlib.h"
#include <stdio.h>
#include <iostream>
#include <string.h>
#include "hardware/spi.h"

#define MOSI 3
#define SCK 2
#define CS 5

#define SPI_PORT spi0

using namespace std;


int main(){

    stdio_init_all();

    // 29-31 is setting up the SPI and SPI modes
    spi_init(SPI_PORT, 5000000);
    gpio_set_function(MOSI, GPIO_FUNC_SPI);
    gpio_set_function(SCK, GPIO_FUNC_SPI);

    //Config Chip Select
    gpio_init(CS);  // Initialise CS Pin
    gpio_set_dir(CS, GPIO_OUT); // Set as output
    gpio_put(CS, 1);



     gpio_init(25);
     gpio_set_dir(25, GPIO_OUT);


    while (1){
    gpio_put(1, 1);

    uint16_t data [2];
    uint8_t data1 [2]; //testing
    
    data[0] = 0x2100;

    

    gpio_put(CS, 0);
    spi_write16_blocking(SPI_PORT, data, 1);
   // spi_write_blocking(SPI_PORT, data1, 1);
    gpio_put(CS, 1);

    sleep_ms(10);

    gpio_put(25, 1);
    }

}     

解决方法

1. 配置SPI 16位帧格式

原代码未明确设置SPI的数据位宽,默认可能以8位帧发送,导致spi_write16_blocking无法按预期传输完整16位数据。在spi_init后添加帧格式配置:

spi_set_format(SPI_PORT, 16, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
  • 参数说明:
    • 16:设置数据位宽为16位
    • SPI_CPOL_0/SPI_CPHA_0:对应SPI模式0(根据外设需求调整,常见模式为0或3)
    • SPI_MSB_FIRST:高位优先发送(若外设需要低位优先,改为SPI_LSB_FIRST)

2. 拆分8位发送(直观可控)

如果不想调整16位帧配置,可直接将16位数据拆分为两个8位字节,分两次发送,明确控制传输顺序:

gpio_put(CS, 0);
uint16_t data = 0x2100;
// 高位优先发送:先0x21,再0x00
spi_write_blocking(SPI_PORT, (uint8_t*)&data + 1, 1);
spi_write_blocking(SPI_PORT, (uint8_t*)&data, 1);
gpio_put(CS, 1);

若外设要求低位优先,调换两次发送顺序即可。

3. 代码冗余优化

原代码中数组data[2]仅使用第一个元素,直接用单个uint16_t变量更简洁;同时优化调试LED的闪烁逻辑,便于观察发送状态。

修正后的完整代码

#include "pico/stdlib.h"
#include <stdio.h>
#include <iostream>
#include <string.h>
#include "hardware/spi.h"

#define MOSI 3
#define SCK 2
#define CS 5

#define SPI_PORT spi0

using namespace std;

int main(){
    stdio_init_all();

    // 初始化SPI时钟
    spi_init(SPI_PORT, 5000000);
    // 配置16位SPI帧格式,模式0,高位优先
    spi_set_format(SPI_PORT, 16, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
    
    // 设置SPI引脚功能
    gpio_set_function(MOSI, GPIO_FUNC_SPI);
    gpio_set_function(SCK, GPIO_FUNC_SPI);

    // 初始化片选引脚
    gpio_init(CS);
    gpio_set_dir(CS, GPIO_OUT);
    gpio_put(CS, 1);

    // 初始化调试LED
    gpio_init(25);
    gpio_set_dir(25, GPIO_OUT);

    while (1){
        uint16_t send_data = 0x2100;

        // 拉低片选,发送数据
        gpio_put(CS, 0);
        spi_write16_blocking(SPI_PORT, &send_data, 1);
        gpio_put(CS, 1);

        // LED闪烁提示发送完成
        gpio_put(25, 1);
        sleep_ms(10);
        gpio_put(25, 0);
        sleep_ms(990);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:06:17