#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]
|