使用树莓派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
相关产品推荐
相关产品推荐

