看了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)的函数。帮忙看一下。我用示波器看时序是没有问题的,测数字电位器两端的电阻一直是中间位置的数值。求帮忙。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
SPI的话对着示波器看命令、地址、数据对的话就没问题啊
一周热门 更多>