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条回答
fengyelancao
1楼-- · 2019-07-22 05:21
 精彩回答 2  元偷偷看……
szl961005
2楼-- · 2019-07-22 07:53
本帖最后由 szl961005 于 2018-4-23 13:20 编辑

用模拟spi与ad9833通讯可以,用硬件的不行不知道为什么,有成功的吗分享一下。(两个stm32片子可以用spi正常通讯)SPI_CPOL_High; SPI_CPHA_1Edge;我用的stm32F207的片子
RenJianYu
3楼-- · 2019-07-22 13:16
请教一下楼主,你用AD9833的时候有没有使用DDS驱动板?
chiyoohui
4楼-- · 2019-07-22 19:11
 精彩回答 2  元偷偷看……
RenJianYu
5楼-- · 2019-07-22 21:46
楼主楼主,AD9833的峰峰值怎么调节?
fengli
6楼-- · 2019-07-23 00:53
 精彩回答 2  元偷偷看……

一周热门 更多>