基于STM32的AD5174(SPI接口的数字电位器)问题,求各位大神帮忙

2019-07-14 18:49发布

看了AD5174的手册就开始写了个程序,研究了好长时间还是没有结果,希望大神们帮忙!程序如下:<<AD5174.h>>
#include "STM32f10x.h"
#ifndef __AD5174_H__
#define __AD5174_H__
#define CHANNEL_1  0
#define CHANNEL_2  1
extern void AD5174_init(void);//
extern void write_data_to_AD5174(float data_R);//写数据到AD5174
#endif



<<AD5174.c>>
#include "stm32f10x.h"
#include "stdio.h"
#include "AD5174.h"
#include "delay.h"
static void AD5174_SPI_Pin_init(void);
void AD5174_init(void);
void write_HEX_to(u16 data_R);

#define SYNC_LOW()          GPIO_ResetBits(GPIOB,GPIO_Pin_10);//SYNC拉低
#define SYNC_HIGH()         GPIO_SetBits(GPIOB,GPIO_Pin_10);//SYNC拉高



void AD5174_SPI_Pin_init(void)//SPI2,PB10为芯片SYNC脚
{
        GPIO_InitTypeDef GPIO_InitStructure;
        SPI_InitTypeDef SPI_InitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//SPI的SCLK、MOSI、MISO引脚设置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        
        /*SYNC引脚的设置(PB10)*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_10);
        
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI的通信方式,TX-->发送数据;RX-->接受数据
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置SPI的主从模式,Master(主模式),Slave(从模式)
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;//8位还是16位帧格式选这项
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//设置时钟极性,即时钟空闲状态时为高‘high’还是低‘low’
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//设置时钟相位,即第几个跳变沿开始传输数据
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//设置NSS信号又硬件还是软件来控制SPI_NSS_Soft软件控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//SPI波特率预分频值,9MHz
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//数据传输顺序,MSB(高位在前)为在前还是LSB(低位在前)为在前
        SPI_InitStructure.SPI_CRCPolynomial = 7;//设置CRC校验,提高通信可靠性,大于1即可
        SPI_Init(SPI2,&SPI_InitStructure);
        SPI_Cmd(SPI2,ENABLE);//使能SPI2
        
}

void AD5174_init(void)//把上边初始化函数重新封装
{
        AD5174_SPI_Pin_init();
}

void write_HEX_to(u16 data_R)
{
        SYNC_HIGH();
        delay_us(2);
        SYNC_LOW();                //产生下降沿,选中AD5174
        delay_us(2);
        SPI_I2S_SendData(SPI2, data_R);//发送数据
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);//等待发送结束
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
        delay_us(200);
        SYNC_HIGH();        //拉高同步信号,AD5174执行指令
        delay_us(2);        
}

以上就是我写的AD5174程序,主函数就不写了,就一个初始化和循环void write_HEX_to(u16 data_R)的函数。帮忙看一下。我用示波器看时序是没有问题的,测数字电位器两端的电阻一直是中间位置的数值。求帮忙。





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。