STM32与AD9833的源程序

2019-07-21 01:46发布

#include "ad9833.h"

void AD9833_Write(u16 Data)
{
// NSS_LOW = 1;
// NSS_LOW = 0;
//  SPI2_WriteByte(Data);
//  while((SPI2->SR & 1<<1) == 0);
// while((SPI1->SR & 1<<7) == 1);
//  NSS_LOW = 1;
// __nop();
// __nop();
u8 i;
AD9833_SCLK = 1;
AD9833_SDTA = 1;
AD9833_NSS = 1;

delay_us(2);

AD9833_NSS = 0;


for(i=0;i<16;i++)
{
 if(Data & 0x8000)
{
 AD9833_SDTA = 1;
}
else
{
 AD9833_SDTA = 0;
}

AD9833_SCLK = 0;


AD9833_SCLK = 1;


Data = Data<<1;
}

AD9833_NSS = 1;

AD9833_SCLK = 0;
}

void AD9833_Init(void)
{
RCC->APB2ENR |= 1<<3;//使能PORTB时钟
  GPIOB->CRH &= 0X0F00FFFF;//IO口清除原有设置
GPIOB->CRH |= 0X30330000;//PB13(SCK)、PB15(MOSI)、PB14(MIS0)采用复用功能推挽输出,输出最大速度为50MHZ,PA12(NSS)采用软件模式
  GPIOB->ODR |= (0xB)<<12;//PB12、PB13、PB14、PB15输出上拉设置

// AD9833_Write(0x0100); 
// AD9833_Write(0x2000);       //写寄存器,AD9833写1复位,确定传输数据为28位
AD9833_Write(0x2100);       //写寄存器,AD9833写1复位,确定传输数据为28位
AD9833_Write(0x4000);       //对频率寄存器0的LSB进行清0
AD9833_Write(0x4000);       //对频率寄存器0的MSB进行清0
AD9833_Write(0x2900);       //写寄存器,AD9833写1复位,确定传输数据为28位
// AD9833_Write(0x2000);       //写寄存器,AD9833写1复位,确定传输数据为28位
// AD9833_Write(0x0100); 
// AD9833_Write(0x2800);       //写寄存器,AD9833写1复位,确定传输数据为28位

AD9833_Write(0x8000);       //对频率寄存器1的LSB进行清0
AD9833_Write(0x8000);       //对频率寄存器1的MSB进行清0
AD9833_Write(0xD000);       //对相位寄存器0进行清0,16位
AD9833_Write(0xF000);       //对相位寄存器1进行清0,16位
// AD9833_Write(0x2000);       //写寄存器,AD9833写0取消复位,确定传输数据为28位

}

void AD9833_Out(u32 Freq_value,u16 Phase_value)//Freq_value取值范围为0~12,500,500HZ
{
u32 dds;
u16 dds1,dds2;
dds = Freq_value * (268.435456/25);
dds1 = dds & 0x3fff;
dds1 |= 0x4000;
dds = dds >> 14;
dds2 = dds & 0x3fff;
dds2 |= 0x4000;
AD9833_Write(0x2000);
AD9833_Write(dds1);
AD9833_Write(dds2);
  AD9833_Write(Phase_value);
}

[mw_shl_code=c,true]#ifndef __AD9833_H #define __AD9833_H #include "sys.h" #include "spi.h" #include "delay.h" #define AD9833_NSS PBout(12) //定义AD9833_NSS代表PB12的NSS,也代表AD9833的片选端 #define AD9833_SCLK PBout(13) //定义AD9833_SCLK代表PB13的SCK,也代表AD9833的时钟信号端 #define AD9833_SDTA PBout(15) //定义AD9833_SDTA代表PB12的MOSI,也代表AD9833的数据传输端 void AD9833_Write(u16 Data); //写指令和数据 void AD9833_Init(void); //AD9833初始化 void AD9833_Out(u32 Freq_value,u16 Phase_value);//Freq_value取值范围为0~12,500,500HZ #endif [/mw_shl_code] [mw_shl_code=c,true]int main() { Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 //SPI2_Init_Master(); AD9833_Init(); while(1) { AD9833_Out(2500000,0xC000); while(1); } }[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
明书
2019-07-21 14:41
回复【3楼】浪客剑心lu:
---------------------------------
上面的就是的,第一个是AD9833的C语言,第二个是AD9833的H文件,第三个就是主函数。没出来有可能是你的低通滤波的选择截止频率要选择好,还有你们的IO口选择配置要对,其次就是你的有源晶振要有输出,最后就是你的AD9833芯片要检查有没有问题。

一周热门 更多>