OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7493|回复: 5

哪位大神帮我看下这AD9854的程序,好几天都没有进展,我都有放弃电子设计的念头了

[复制链接]

9

主题

21

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-11-19
在线时间
19 小时
发表于 2016-7-17 17:50:55 | 显示全部楼层 |阅读模式
60金钱
程序有点多,应该就是用D0--D7和A0--A5写数据进入AD9854出了问题,IO口全部正常,程序烧得进STM32就是送不进AD9854,因为出来的波形和原来默认的一样,改main函数的频率,输出波的频率毫无变化,后来我试着吧main函数内容全部去掉再烧进去结果波形还是一样不变,还有一周多比赛了,想去当个炮灰可能都不够资格,真心喜欢电子设计哦,又觉得自己很笨,现在我真想放弃了,当想到队友还那么努力,我实在不能放弃,哪位大神能指点下哦,同学告诉我,最有可能出现问题的地方我在下面单独写出来,请拉到底部看,上面代码是AD9854驱动原码,原码如下:
=

//=====================================================================

#include <AD9854.h>      //STC单片机头文件       
#include "delay.h"



uchar FreqWord[6];                                 //6个字节频率控制字

//**********************以下为系统时钟以及其相关变量设置**************************

/*
      此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个   
      CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ
      Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型
*/

/*
#define      CLK_Set            4
const ulong  Freq_mult_ulong  = 3518437;
const double Freq_mult_doulle = 3518437.2088832;
*/

/*
#define      CLK_Set            5
const ulong  Freq_mult_ulong  = 2814750;
const double Freq_mult_doulle = 2814749.76710656;
*/

/*
#define      CLK_Set            6
const ulong  Freq_mult_ulong  = 2345625;
const double Freq_mult_doulle = 2345624.80592213;
  */

/*
#define      CLK_Set            7
const ulong  Freq_mult_ulong  = 2010536;
const double Freq_mult_doulle = 2010535.54793326;
*/

/*
#define      CLK_Set            8
const ulong  Freq_mult_ulong  = 1759219;
const double Freq_mult_doulle = 1759218.6044416;
*/

/*
#define      CLK_Set            9
const ulong  Freq_mult_ulong  = 1563750;
const double Freq_mult_doulle = 1563749.87061476;
*/

/*
#define      CLK_Set            10
const ulong  Freq_mult_ulong  = 1407375;
const double Freq_mult_doulle = 1407374.88355328;
*/

/*
#define      CLK_Set            11
const ulong  Freq_mult_ulong  = 1279432;
const double Freq_mult_doulle = 1279431.712321164;
*/


#define      CLK_Set            12
const ulong  Freq_mult_ulong  = 1172812;
const double Freq_mult_doulle = 1172812.402961067;


/*
#define      CLK_Set            13
const ulong  Freq_mult_ulong  = 1082596;
const double Freq_mult_doulle = 1082596.064271754;
*/

/*
#define      CLK_Set            14
const ulong  Freq_mult_ulong  = 1005268;
const double Freq_mult_doulle = 1005267.773966629;
*/

/*
#define      CLK_Set            15
const ulong  Freq_mult_ulong  = 938250;
const double Freq_mult_doulle = 938249.9223688533;

*/
//**************************修改硬件时要修改的部分********************************



//**************************以下部分为函数定义********************************

static void AD9854_WR_Byte(u32 addr,u32 dat);
extern void AD9854_Init(void);                                                  
static void Freq_convert(long Freq);                           
extern void AD9854_SetSine(ulong Freq,uint Shape);          
static void Freq_double_convert(double Freq);                  
extern void AD9854_SetSine_double(double Freq,uint Shape);
extern void AD9854_InitFSK(void);                               
extern void AD9854_SetFSK(ulong Freq1,ulong Freq2);                                          
extern void AD9854_InitBPSK(void);                                          
extern void AD9854_SetBPSK(uint Phase1,uint Phase2);                                       
extern void AD9854_InitOSK(void);                                         
extern void AD9854_SetOSK(uchar RateShape);                                          
extern void AD9854_InitAM(void);                                         
extern void AD9854_SetAM(uint Shape);                                       
extern void AD9854_InitRFSK(void);                                         
extern void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate);                               

void AD9854_IO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure ;
       
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);         //使能PB,PE端口时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
    GPIO_Init(GPIOB ,&GPIO_InitStructure) ;
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_8| GPIO_Pin_2;
        GPIO_Init(GPIOA ,&GPIO_InitStructure) ;
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All^(GPIO_Pin_14| GPIO_Pin_15);
        GPIO_Init(GPIOC ,&GPIO_InitStructure) ;

}

//====================================================================================
//函数名称:void AD9854_WR_Byte(uchar addr,uchar dat)
//函数功能:AD9854并行口写入数据
//入口参数:addr     6位地址
//         dat      写入的数据
//出口参数:无
//====================================================================================
        u32 dat1,dat2;

void AD9854_WR_Byte(u32 addr,u32 dat)
{
        dat1= dat|(addr<<8);
       
        AD9854_AdrBus=(dat1&0x3fff)|((dat1^0x3fff)<<16);
       
        AD9854_WR      = 0;
        AD9854_WR      = 1;
}

//====================================================================================
//函数名称:void AD9854_Init(void)
//函数功能:AD9854初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_Init(void)
{
        AD9854_IO_Init();
        AD9854_WR=1;//将读、写控制端口设为无效
    AD9854_RD=1;
    AD9854_UDCLK=0;
    AD9854_RST=1;                 //复位AD9854
    AD9854_RST=0;

        AD9854_WR_Byte(0x1d,0x00);                   //关闭比较器
        AD9854_WR_Byte(0x1e,CLK_Set);           //设置系统时钟倍频            
        AD9854_WR_Byte(0x1f,0x00);           //设置系统为模式0,由外部更新
        AD9854_WR_Byte(0x20,0x60);           //设置为可调节幅度,取消插值补偿

        AD9854_UDCLK=1;               //更新AD9854输出
    AD9854_UDCLK=0;
}
//====================================================================================
//函数名称:void Freq_convert(long Freq)
//函数功能:正弦信号频率数据转换
//入口参数:Freq   需要转换的频率,取值从0~SYSCLK/2
//出口参数:无   但是影响全局变量FreqWord[6]的值
//说明:   该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK
//         得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK
//         为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
//====================================================================================
void Freq_convert(long Freq)   
{
    ulong FreqBuf;
    ulong Temp=Freq_mult_ulong;                  

        uchar Array_Freq[4];                             //将输入频率因子分为四个字节
        Array_Freq[0]=(uchar)Freq;
        Array_Freq[1]=(uchar)(Freq>>8);
        Array_Freq[2]=(uchar)(Freq>>16);
        Array_Freq[3]=(uchar)(Freq>>24);

        FreqBuf=Temp*Array_Freq[0];                  
    FreqWord[0]=FreqBuf;   
    FreqBuf>>=8;

    FreqBuf+=(Temp*Array_Freq[1]);
    FreqWord[1]=FreqBuf;
    FreqBuf>>=8;

    FreqBuf+=(Temp*Array_Freq[2]);
    FreqWord[2]=FreqBuf;
    FreqBuf>>=8;

        FreqBuf+=(Temp*Array_Freq[3]);
    FreqWord[3]=FreqBuf;
    FreqBuf>>=8;

    FreqWord[4]=FreqBuf;
    FreqWord[5]=FreqBuf>>8;                       
}  

//====================================================================================
//函数名称:void AD9854_SetSine(ulong Freq,uint Shape)
//函数功能:AD9854正弦波产生程序
//入口参数:Freq   频率设置,取值范围为0~(1/2)*SYSCLK
//         Shape  幅度设置. 为12 Bit,取值范围为(0~4095) ,取值越大,幅度越大
//出口参数:无
//====================================================================================
void AD9854_SetSine(ulong Freq,uint Shape)
{
        uchar count;
        uchar Adress;

        Adress = 0x04;                        //选择频率控制字地址的初值

        Freq_convert(Freq);                           //频率转换

        for(count=6;count>0;)                  //写入6字节的频率控制字  
    {
                AD9854_WR_Byte(Adress++,FreqWord[--count]);
    }
       
        AD9854_WR_Byte(0x21,Shape>>8);          //设置I通道幅度
        AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
       
        AD9854_WR_Byte(0x23,Shape>>8);          //设置Q通道幅度
        AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

        AD9854_UDCLK=1;                    //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void Freq_doublt_convert(double Freq)
//函数功能:正弦信号频率数据转换
//入口参数:Freq   需要转换的频率,取值从0~SYSCLK/2
//出口参数:无   但是影响全局变量FreqWord[6]的值
//说明:   有公式FTW = (Desired Output Frequency × 2N)/SYSCLK得到该函数,
//         其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK
//         为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
//注意:   该函数与上面函数的区别为该函数的入口参数为double,可使信号的频率更精确
//         建议在100HZ以下用本函数,在高于100HZ的情况下用函数void Freq_convert(long Freq)
//====================================================================================
void Freq_double_convert(double Freq)   
{
        ulong Low32;
        uint  High16;
    double Temp=Freq_mult_doulle;                       //23ca99为2的48次方除以120M
        Freq*=(double)(Temp);
//        1 0000 0000 0000 0000 0000 0000 0000 0000 = 4294967295
        High16 =(int)(Freq/4294967295);                  //2^32 = 4294967295
        Freq -= (double)High16*4294967295;
        Low32 = (ulong)Freq;

    FreqWord[0]=Low32;             
    FreqWord[1]=Low32>>8;
    FreqWord[2]=Low32>>16;
    FreqWord[3]=Low32>>24;
    FreqWord[4]=High16;
    FreqWord[5]=High16>>8;                       
}
//====================================================================================
//函数名称:void AD9854_SetSine_double(double Freq,uint Shape)
//函数功能:AD9854正弦波产生程序
//入口参数:Freq   频率设置,取值范围为0~1/2*SYSCLK
//         Shape  幅度设置. 为12 Bit,取值范围为(0~4095)
//出口参数:无
//====================================================================================
void AD9854_SetSine_double(double Freq,uint Shape)
{
        uchar count=0;
        uchar Adress;

        Adress=0x04;                                                     //选择频率控制字1地址的初值

        Freq_double_convert(Freq);                           //频率转换
         
        for(count=6;count>0;)                            //写入6字节的频率控制字  
    {
                AD9854_WR_Byte(Adress++,FreqWord[--count]);
    }
       
        AD9854_WR_Byte(0x21,Shape>>8);          //设置I通道幅度
        AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
       
        AD9854_WR_Byte(0x23,Shape>>8);          //设置Q通道幅度
        AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

        AD9854_UDCLK=1;                    //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_InitFSK(void)
//函数功能:AD9854的FSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitFSK(void)
{
        AD9854_WR=1;                        //将读、写控制端口设为无效
    AD9854_RD=1;
    AD9854_UDCLK=0;
    AD9854_RST=1;                        //复位AD9854
    AD9854_RST=0;       

        AD9854_WR_Byte(0x1d,0x00);               //关闭比较器
        AD9854_WR_Byte(0x1e,CLK_Set);           //设置系统时钟倍频
        AD9854_WR_Byte(0x1f,0x02);               //设置系统为模式1,由外部更新
        AD9854_WR_Byte(0x20,0x60);              //设置为可调节幅度,取消插值补偿

        AD9854_UDCLK=1;                  //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_SetFSK(ulong Freq1,ulong Freq2)
//函数功能:AD9854的FSK设置
//入口参数:Freq1   FSK频率1
//         Freq2   FSK频率2
//出口参数:无
//====================================================================================
void AD9854_SetFSK(ulong Freq1,ulong Freq2)
{
    uchar count=6;
        uchar Adress1,Adress2;

        const uint Shape=4000;              //幅度设置. 为12 Bit,取值范围为(0~4095)
       
        Adress1=0x04;                                 //选择频率控制字1地址的初值
        Adress2=0x0a;                                 //选择频率控制字2地址的初值
       
        Freq_convert(Freq1);               //频率转换1
       
        for(count=6;count>0;)                  //写入6字节的频率控制字  
    {
                AD9854_WR_Byte(Adress1++,FreqWord[--count]);
    }
       
        Freq_convert(Freq2);               //频率转换2

        for(count=6;count>0;)                  //写入6字节的频率控制字  
    {
                AD9854_WR_Byte(Adress2++,FreqWord[--count]);
    }

        AD9854_WR_Byte(0x21,Shape>>8);              //设置I通道幅度
        AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
       
        AD9854_WR_Byte(0x23,Shape>>8);             //设置Q通道幅度
        AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

        AD9854_UDCLK=1;                    //更新AD9854输出
    AD9854_UDCLK=0;               
}

//====================================================================================
//函数名称:void AD9854_InitBPSK(void)
//函数功能:AD9854的BPSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitBPSK(void)
{
        AD9854_WR=1;                    //将读、写控制端口设为无效
    AD9854_RD=1;
    AD9854_UDCLK=0;
    AD9854_RST=1;                   //复位AD9854
    AD9854_RST=0;

        AD9854_WR_Byte(0x1d,0x00);               //关闭比较器
        AD9854_WR_Byte(0x1e,CLK_Set);           //设置系统时钟倍频
        AD9854_WR_Byte(0x1f,0x08);              //设置系统为模式4,由外部更新
        AD9854_WR_Byte(0x20,0x60);              //设置为可调节幅度,取消插值补偿

        AD9854_UDCLK=1;                //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_SetBPSK(uint Phase1,uint Phase2)
//函数功能:AD9854的BPSK设置
//入口参数hase1   调制相位1
//         Phase2        调制相位2
//出口参数:无
//说明:   相位为14Bit,取值从0~16383,建议在用本函数的时候将Phase1设置为0,
//         将Phase1设置为8192,180°相位
//====================================================================================
void AD9854_SetBPSK(uint Phase1,uint Phase2)
{
        uchar count;

        const ulong Freq=60000;
    const uint Shape=4000;

        uchar Adress;
        Adress=0x04;                           //选择频率控制字1地址的初值

        AD9854_WR_Byte(0x00,Phase1>>8);                   //设置相位1
        AD9854_WR_Byte(0x01,(uchar)(Phase1&0xff));
       
        AD9854_WR_Byte(0x02,Phase2>>8);                  //设置相位2
        AD9854_WR_Byte(0x03,(uchar)(Phase2&0xff));

        Freq_convert(Freq);                            //频率转换

        for(count=6;count>0;)                                 //写入6字节的频率控制字  
    {
                AD9854_WR_Byte(Adress++,FreqWord[--count]);
    }

        AD9854_WR_Byte(0x21,Shape>>8);                          //设置I通道幅度
        AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
       
        AD9854_WR_Byte(0x23,Shape>>8);                       //设置Q通道幅度
        AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

        AD9854_UDCLK=1;                                //更新AD9854输出
    AD9854_UDCLK=0;       
}

//====================================================================================
//函数名称:void AD9854_InitOSK(void)
//函数功能:AD9854的OSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitOSK(void)
{
        AD9854_WR=1;                           //将读、写控制端口设为无效
        AD9854_RD=1;
        AD9854_UDCLK=0;
        AD9854_RST=1;                          //复位AD9854
        AD9854_RST=0;

    AD9854_WR_Byte(0x1d,0x00);                   //关闭比较器
        AD9854_WR_Byte(0x1e,CLK_Set);               //设置系统时钟倍频
        AD9854_WR_Byte(0x1f,0x00);                   //设置系统为模式0,由外部更新
        AD9854_WR_Byte(0x20,0x70);                   //设置为可调节幅度,取消插值补偿,通断整形内部控制

        AD9854_UDCLK=1;                        //更新AD9854输出
        AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_SetOSK(uchar RateShape)
//函数功能:AD9854的OSK设置
//入口参数: RateShape    OSK斜率,取值为4~255,小于4则无效
//出口参数:无
//====================================================================================
void AD9854_SetOSK(uchar RateShape)
{
        uchar count;

        const ulong Freq=60000;                         //设置载频
  const uint  Shape=4000;                        //幅度设置. 为12 Bit,取值范围为(0~4095)

        uchar Adress;
        Adress=0x04;               //选择频率控制字地址的初值

        Freq_convert(Freq);                       //频率转换

        for(count=6;count>0;)                                 //写入6字节的频率控制字  
    {
                AD9854_WR_Byte(Adress++,FreqWord[--count]);
    }

        AD9854_WR_Byte(0x21,Shape>>8);                          //设置I通道幅度
        AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
       
        AD9854_WR_Byte(0x23,Shape>>8);                          //设置Q通道幅度
        AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));           


    AD9854_WR_Byte(0x25,RateShape);                                       //设置OSK斜率

        AD9854_UDCLK=1;                                //更新AD9854输出
    AD9854_UDCLK=0;       
}

//====================================================================================
//函数名称:void AD9854_InitAM(void)
//函数功能:AD9854的AM初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitAM(void)
{
        uchar count;

        const ulong Freq=60000;                         //设置载频

        uchar  Adress;
        Adress=0x04;      //选择频率控制字地址的初值
       
    AD9854_WR=1;    //将读、写控制端口设为无效
    AD9854_RD=1;
    AD9854_UDCLK=0;
    AD9854_RST=1;     //复位AD9854
    AD9854_RST=0;

        AD9854_WR_Byte(0x1d,0x00);                          //关闭比较器
        AD9854_WR_Byte(0x1e,CLK_Set);                     //设置系统时钟倍频
        AD9854_WR_Byte(0x1f,0x00);                         //设置系统为模式0,由外部更新
        AD9854_WR_Byte(0x20,0x60);                          //设置为可调节幅度,取消插值补偿

        Freq_convert(Freq);                            //频率转换

        for(count=6;count>0;)                                 //写入6字节的频率控制字  
    {
                AD9854_WR_Byte(Adress++,FreqWord[--count]);
    }

        AD9854_UDCLK=1;                             //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_SetAM(uchar Shape)
//函数功能:AD9854的AM设置
//入口参数:Shape   12Bit幅度,取值从0~4095   
//出口参数:无
//====================================================================================
void AD9854_SetAM(uint Shape)
{
        AD9854_WR_Byte(0x21,Shape>>8);                          //设置I通道幅度
        AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
       
        AD9854_WR_Byte(0x23,Shape>>8);                          //设置Q通道幅度
        AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

        AD9854_UDCLK=1;                                   //更新AD9854输出
    AD9854_UDCLK=0;                       
}

//====================================================================================
//函数名称:void AD9854_InitRFSK(void)
//函数功能:AD9854的RFSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitRFSK(void)
{
        AD9854_WR=1;                      //将读、写控制端口设为无效
    AD9854_RD=1;
    AD9854_UDCLK=0;
    AD9854_RST=1;                     //复位AD9854
    AD9854_RST=0;
       
        AD9854_WR_Byte(0x1d,0x00);               //关闭比较器
        AD9854_WR_Byte(0x1e,CLK_Set);           //设置系统时钟倍频
        AD9854_WR_Byte(0x1f,0x24);                //设置系统为模式2,由外部更新,使能三角波扫频功能
        AD9854_WR_Byte(0x20,0x60);                //设置为可调节幅度,取消插值补偿       

        AD9854_UDCLK=1;                   //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_SetRFSK(void)
//函数功能:AD9854的RFSK设置
//入口参数:Freq_Low          RFSK低频率           48Bit
//         Freq_High         RFSK高频率           48Bit
//         Freq_Up_Down                 步进频率           48Bit
//                   FreRate           斜率时钟控制  20Bit
//出口参数:无
//注:     每两个脉冲之间的时间周期用下式表示(FreRate +1)*(System Clock ),一个脉冲,
//         频率 上升或者下降 一个步进频率
//====================================================================================
void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate)
{
        uchar count=6;
        uchar Adress1,Adress2,Adress3;
    const uint  Shape=4000;                           //幅度设置. 为12 Bit,取值范围为(0~4095)

        Adress1=0x04;                     //选择频率控制字地址的初值
        Adress2=0x0a;
        Adress3=0x10;

        Freq_convert(Freq_Low);                             //频率1转换

        for(count=6;count>0;)                                 //写入6字节的频率控制字  
    {
                AD9854_WR_Byte(Adress1++,FreqWord[--count]);
    }

        Freq_convert(Freq_High);                             //频率2转换

        for(count=6;count>0;)                                 //写入6字节的频率控制字  
    {
                AD9854_WR_Byte(Adress2++,FreqWord[--count]);
    }

        Freq_convert(Freq_Up_Down);                             //步进频率转换

        for(count=6;count>0;)                                       //写入6字节的频率控制字  
    {
                AD9854_WR_Byte(Adress3++,FreqWord[--count]);
    }

        AD9854_WR_Byte(0x1a,(uchar)((FreRate>>16)&0x0f));                                   //设置斜升速率
        AD9854_WR_Byte(0x1b,(uchar)(FreRate>>8));
        AD9854_WR_Byte(0x1c,(uchar)FreRate);                                    

        AD9854_WR_Byte(0x21,Shape>>8);                          //设置I通道幅度
        AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
       
        AD9854_WR_Byte(0x23,Shape>>8);                          //设置Q通道幅度
        AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

        AD9854_UDCLK=1;                                //更新AD9854输出
    AD9854_UDCLK=0;       
}

//测试正弦波,采用120MHZ SYSCLK时,出来10MHZ波形,波形很好,测试成功
//当采用300MHZ SYSCLK时,测试50MHZ波形时,DDS发热厉害,且波形衰减严重,幅度在35mV左右
//
//int main()
//{
//        AD9854_Init();
//        AD9854_SetSine(80000000,4095);
//        while(1);                       
//}


//测试正弦波,采用120MHZ SYSCLK时,出来87.697HZ波形,波形很好,测试成功
//
//int main()
//{
//        AD9854_Init();
//        AD9854_SetSine_double(87.697,4000);
//        while(1);                       
//}


//测试FSK,采用120MHZ SYSCLK,1K和6K,测试成功,结果对应"FSK波形.bmp"

//int main()
//{
//        AD9854_InitFSK();
//        AD9854_SetFSK(1000,6000);
//        while(1)
//        {
//                AD9854_FDATA = 1;
//                delay_us(30000);              //延时时间长,便于观察
//                AD9854_FDATA = 0;
//                delay_us(30000);
//        }                       
//}


//测试BPSK,采用120MHZ SYSCLK,测试成功

//int main()
//{
//        AD9854_InitBPSK();
//        AD9854_SetBPSK(0,8192);
//        while(1)
//        {
//                AD9854_FDATA = 1;
//                delay_us(10);             
//                AD9854_FDATA = 0;
//                delay_us(10);
//        }                       
//}



//测试OSK,采用120MHZ SYSCLK,测试成功

//int main()
//{
//        AD9854_InitOSK();
//        AD9854_SetOSK(10);
//        while(1)
//        {
//                AD9854_OSK=1;       
//                delay_us(30);
//                AD9854_OSK=0;       
//                delay_us(30);
//        }                       
//}


//测试AM,采用120MHZ SYSCLK,测试成功

//int main()
//{
//        AD9854_InitAM();
//        while(1)
//        {
//                AD9854_SetAM(2000);
//                delay_us(10);             
//                AD9854_SetAM(4000);
//                delay_us(10);
//        }
//}
//

//测试RFSK,采用120MHZ SYSCLK,测试成功

//int main()
//{
//        AD9854_InitRFSK();
//        AD9854_SetRFSK(1000,60000,100,30);
//        while(1)
//        {
//                AD9854_FDATA = 1;
//                delay_us(30000);              //延时时间长,便于观察
//                AD9854_FDATA = 0;
//                delay_us(30000);
//        }
//}               


























一些IO口的配置和问题所在代码如下:

#define AD9854_RST    PAout(6)   //AD9854复位端口
#define AD9854_UDCLK  PAout(4)   //AD9854更新时钟
#define AD9854_WR     PAout(5)  //AD9854写使能,低有效
#define AD9854_RD     PAout(8)   //AD9854读使能,低有效
#define AD9854_OSK    PAout(2)   //AD9854 OSK控制端
#define AD9854_FDATA  PBout(10)   //AD9854 FSK,PSK控制

#define AD9854_DataBus GPIOC->BSRR
#define AD9854_AdrBus  GPIOC->BSRR

#define uint  unsigned int
#define uchar unsigned char
#define ulong unsigned long

/====================================================================================
//函数名称:void AD9854_WR_Byte(uchar addr,uchar dat)
//函数功能:AD9854并行口写入数据
//入口参数:addr     6位地址
//         dat      写入的数据
//出口参数:无
//====================================================================================
        u32 dat1,dat2;

void AD9854_WR_Byte(u32 addr,u32 dat)
{
        dat1= dat|(addr<<8);
       
        AD9854_AdrBus=(dat1&0x3fff)|((dat1^0x3fff)<<16);
       
        AD9854_WR      = 0;
        AD9854_WR      = 1;
}


       

最佳答案

查看完整内容[请看2#楼]

要学会搜索。。。 论坛就有现成代码可以参考: http://www.openedv.com/forum.php?mod=viewthread&tid=21285&highlight=9854
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165464
金钱
165464
注册时间
2010-12-1
在线时间
2115 小时
发表于 2016-7-17 17:50:56 | 显示全部楼层
要学会搜索。。。
论坛就有现成代码可以参考:
http://www.openedv.com/forum.php ... &highlight=9854
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-8-8
在线时间
2 小时
发表于 2019-8-8 02:28:02 | 显示全部楼层
楼主,您好。我近期比赛遇到的问题和你一样,如果您问题已经解决了的话,可否能将解决方法教给小弟。不胜感激!1044478158@qq.com 谢谢楼主大大
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-8-8
在线时间
2 小时
发表于 2019-8-8 02:28:51 | 显示全部楼层
楼主,您好。我近期比赛遇到的问题和你一样,如果您问题已经解决了的话,可否能将解决方法教给小弟。不胜感激!1044478158@qq.com 谢谢楼主大大
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2020-8-1
在线时间
24 小时
发表于 2020-8-6 11:29:23 | 显示全部楼层
请问解决了吗 我也用的你这个代码也不行  解决方法求告知 472287500@qq.com
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-7-10
在线时间
4 小时
发表于 2022-7-21 14:31:36 | 显示全部楼层
代码没问题换个电脑试试,我的电脑用这个代码也没用,朋友的电脑就可以(很奇怪)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-26 18:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表