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条回答
明书
1楼-- · 2019-07-21 06:10
经发现,AD9833的初始化程序,写“AD9833_Write(0x0100); AD9833_Write(0x2000)”先复位在写控制与“AD9833_Write(0x2100)”复位、控制一起写是没有什么区别,所以网上有人提供的源程序有以上两种编写方式,皆是正确无误的。在我验证AD9833的波形的过程中,发生波形没法产生的现象,原因不是编写AD9833_Write函数的时序问题(这个不是很严格的,只要你大于手册里面最小时间即可),也不是AD9833初始化配置错误,而是在选定三个输出端口的配置上出现问题。我原来想用SPI通信方式来产生波形,但后来转用软件模拟SPI却没把SPI的复用推挽输出设置改为IO端口的通用推挽输出,所以才会一直看不到波形的产生。
浪客剑心lu
2楼-- · 2019-07-21 10:20
 精彩回答 2  元偷偷看……
明书
3楼-- · 2019-07-21 14:41
回复【3楼】浪客剑心lu:
---------------------------------
上面的就是的,第一个是AD9833的C语言,第二个是AD9833的H文件,第三个就是主函数。没出来有可能是你的低通滤波的选择截止频率要选择好,还有你们的IO口选择配置要对,其次就是你的有源晶振要有输出,最后就是你的AD9833芯片要检查有没有问题。
正点原子
4楼-- · 2019-07-21 19:45
 精彩回答 2  元偷偷看……
jtjtjtt
5楼-- · 2019-07-21 23:45
楼主为什么要用软件模拟spi,为什么不用片上的spi
明书
6楼-- · 2019-07-22 05:06
jtjtjtt 发表于 2016-1-29 16:34
楼主为什么要用软件模拟spi,为什么不用片上的spi

这个是其中一个办法,只是我之前可能因为元器件的原因,使用片上SPI总是输出波形有问题,所以后来使用了软件模拟SPI

一周热门 更多>