我的9850程序。lz调试的时候可以先关闭6倍频。把9851当50用。程序里两种计算方法,一种用了64bit数,一种用浮点,都是尽量为了获取更精确的频率配置字。我的小板子直接用了125M晶振,所以计算的时候你要根据自己需要修改,你如果要用6倍频改成180M常量就是了。
main.c
int main(void)
{
RCC_Configuration();
ad9850_init();
delayus(1000);
ad9850_wr_serial(0,15000000.0);
while (1);
}
ad9850.c
/************************/
/* platform dependent */
/************************/
#include "stm32f10x.h"
#include "platform_config.h"
#include "core_cm3.h"
#include "bitband.h"
void delayus(__IO uint32_t nTime);
#define FQUP GPIO_Pin_14
#define SCLK GPIO_Pin_13
#define SDAT GPIO_Pin_12
#define DATA_PORT GPIOB
#define ad9850_bit_data PB12
#define ad9850_w_clk PB13
#define ad9850_fq_up PB14
void ad9850_gpio_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = SCLK;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DATA_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SDAT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DATA_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = FQUP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DATA_PORT, &GPIO_InitStructure);
}
/************************/
/* platform independent */
/************************/
void ad9850_serial_init()
{
ad9850_w_clk = 0;
delayus(1);
ad9850_w_clk = 1;
delayus(1);
ad9850_w_clk = 0;
delayus(100);
ad9850_fq_up=0;
delayus(10);
ad9850_fq_up=1;
delayus(10);
ad9850_fq_up=0;
}
void ad9850_init()
{
ad9850_gpio_init();
ad9850_serial_init();
}
#if 1 /* uint64 or double float */
const uint64_t deltaphase = 0xffffffff00000000 / 125000000;
void ad9850_wr_serial(unsigned char w, uint32_t frequence)
{
uint32_t i;
uint32_t M;
uint64_t delta = deltaphase * frequence;
M = delta >> 32; //频率控制字
ad9850_w_clk = 0; //初始化
ad9850_fq_up = 0;
//写频率控制字
for(i=0;i<32;i++)
{
ad9850_w_clk = 0;
ad9850_bit_data = ((M>>i)&1);
ad9850_w_clk = 1; //上升沿写入数据
}
//写相位控制字
for(i=0;i<8;i++)
{
ad9850_w_clk = 0;
ad9850_bit_data = (w>>i)&1;
ad9850_w_clk = 1; //上升沿写入数据
}
//移入始能
ad9850_fq_up = 0;
ad9850_fq_up = 1; //上升沿将40位数一次性打入数据寄存器
ad9850_fq_up = 0;
}
#else
const double deltaphase = 4294967295.0 / 125000000.0;
void ad9850_wr_serial(unsigned char w, double frequence)
{
unsigned char i;
unsigned long int M;
//计算频率值
frequence = frequence * deltaphase;
M = frequence; //频率控制字
ad9850_w_clk = 0; //初始化
ad9850_fq_up = 0;
//写频率控制字
for(i=0;i<32;i++)
{
ad9850_w_clk = 0;
ad9850_bit_data = ((M>>i)&1);
ad9850_w_clk = 1; //上升沿写入数据
}
//写相位控制字
for(i=0;i<8;i++)
{
ad9850_w_clk = 0;
ad9850_bit_data = (w>>i)&1;
ad9850_w_clk = 1; //上升沿写入数据
}
//移入始能
ad9850_fq_up = 0;
ad9850_fq_up = 1; //上升沿将40位数一次性打入数据寄存器
ad9850_fq_up = 0;
}
#endif