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

使用树莓派Pico C/C++ SDK通过SPI控制AD5293无输出问题排查

问题:AD5293数字电位器SPI写入后Wiper无输出

我尝试通过SPI控制AD5293数字电位器调节输出电压,参考数据手册设置控制寄存器——将C3-C0设为0011(用于向RDAC写入数据并启用SPI数字接口),把控制位与目标值按位或后发送。已将SPI模式改为模式1(CPOL=0, CPHA=1),并添加了CS引脚延迟,示波器观测TX Data、CS、Clock波形未发现异常,但Wiper位置始终无变化。希望先排查代码问题,若代码无问题再转向硬件排查。

测试时发送值为6146(二进制前5位为0,其余为1)。

测试代码

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

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

using namespace std;

//----------SPI Init----------
#define SPI_Port_Dig_Pot spi0
#define CS_HV 4

#define MOSI_HV 3
#define SCK 2
//----------------------------

void SPI_Setup(){
    spi_init(SPI_Port_Dig_Pot, 5000000);  //init spi port to run at 5MHz, chosen as doesnt need to run any faster
                                          //and is 10x lower than the max the dig pot can support

    //-------CS for all setup-------
    gpio_init(CS_HV);
    gpio_set_dir(CS_HV, GPIO_OUT);
    gpio_put(CS_HV, true);

    //------------------------------

    gpio_set_function(SCK, GPIO_FUNC_SPI);
    gpio_set_function(MOSI_HV, GPIO_FUNC_SPI);


    spi_set_format(SPI_Port_Dig_Pot, 16, SPI_CPOL_0, SPI_CPHA_1, SPI_MSB_FIRST); //may need to change length
}

int main(){

    stdio_init_all();

    SPI_Setup(); 

    uint16_t control_bit = 0b0000110000000000; //ctrl bit value in binary
                                               //See ad5293 datasheet for derivation
    
    uint16_t SPI_Code_With_CTRL_Bit = (control_bit | 512);


    uint16_t spi_buffer[1];
    spi_buffer[0] = SPI_Code_With_CTRL_Bit;

    while(1){
        gpio_put(CS_HV, true);
        spi_write16_blocking(SPI_Port_Dig_Pot, spi_buffer, 1);
        gpio_put(CS_HV, false);

        busy_wait_us(1);
    } 
}

代码排查关键点

  • CS电平时序完全错误:AD5293的CS引脚是低电平有效,代码中先将CS设为高电平再发送数据,发送后才拉低,完全不符合芯片SPI时序要求。正确流程应为:拉低CS → 发送数据 → 拉高CS。
  • 控制位位置错误:AD5293的控制位C3-C0对应16位数据的最高4位(D15-D12),你定义的control_bit = 0b0000110000000000实际是将D13-D12设为11,D15-D14为0,虽然C3-C0是0011,但如果要发送测试值6146(二进制0001100000000010),正确的16位组合数据应该是0011100000000010(十进制14338),而非当前的错误组合。
  • 循环发送间隔过短:AD5293写入RDAC需要一定处理时间,代码中循环发送间隔仅1us且持续重复发送,可能导致芯片无法正确处理指令。建议单次发送后拉高CS,并增加至少10us的延迟,无需持续循环发送。

修改后的示例代码片段

int main(){
    stdio_init_all();
    SPI_Setup(); 

    // 修正控制位:C3-C0=0011,对应D15-D12=0011
    uint16_t control_bit = 0b0011000000000000;
    // 测试值6146仅保留低12位,与控制位组合
    uint16_t SPI_Code_With_CTRL_Bit = (control_bit | (6146 & 0x0FFF));

    uint16_t spi_buffer[1];
    spi_buffer[0] = SPI_Code_With_CTRL_Bit;

    while(1){
        // 正确时序:拉低CS
        gpio_put(CS_HV, false);
        spi_write16_blocking(SPI_Port_Dig_Pot, spi_buffer, 1);
        // 发送完成后拉高CS
        gpio_put(CS_HV, true);
        // 增加足够延迟,避免重复发送过快
        busy_wait_us(100);
    } 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:07:41