永发信息网

stm32中ad9959的使用例程。编译环境最好是keil。

答案:3  悬赏:0  手机版
解决时间 2021-03-31 14:06
  • 提问者网友:两耳就是菩提
  • 2021-03-31 02:06
stm32中ad9959的使用例程。编译环境最好是keil。
最佳答案
  • 五星知识达人网友:大漠
  • 2021-03-31 03:05

#include "ad9959.h"
#include "usart.h"
#define PLL_DIV 10 //倍频系数
#define PLL 16 //外部晶振频率
#define systemp_frequency (PLL*1000000*PLL_DIV) //AD9959 系统频率


static uint16_t Write_DDS_Byte(unsigned char aByte)
{
    
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1,aByte);
    
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

    
    return SPI_I2S_ReceiveData(SPI1);
}


void InitAd9959(void)
{
    int i ;
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_SetBits(GPIOC,GPIO_Pin_4) ;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
  
}


void write_CSR(char w_data)
{
    CLR_DDSCS;
    Write_DDS_Byte(0x00);    //write address 0.  CSR's address is 0.
    Write_DDS_Byte(w_data);
    SET_DDSCS;
}


void write_FR1(char w_data1,char w_data2,char w_data3)
{
    CLR_DDSCS;
    Write_DDS_Byte(0x01);    //write address 1.  FR1's address is 0x01
    Write_DDS_Byte(w_data1);
    Write_DDS_Byte(w_data2);
    Write_DDS_Byte(w_data3);
    SET_DDSCS;
}


void write_FR2(char w_data1,char w_data2)
{
    CLR_DDSCS;
    Write_DDS_Byte(0x02);    //write address 2
    Write_DDS_Byte(w_data1);
    Write_DDS_Byte(w_data2);
    SET_DDSCS;
}


void write_CFR(char w_data1,char w_data2,char w_data3)
{
    CLR_DDSCS;
    Write_DDS_Byte(0x03);
    Write_DDS_Byte(w_data1);
    Write_DDS_Byte(w_data2);
    Write_DDS_Byte(w_data3);
    SET_DDSCS;
}


void write_CFTW0(long F_word)  //Channel Frequency Tuning Word  (CTW0)
{
    CLR_DDSCS;
    Write_DDS_Byte(0x04);
    Write_DDS_Byte(((unsigned char *)(&F_word))[3]);
    Write_DDS_Byte(((unsigned char *)(&F_word))[2]);
    Write_DDS_Byte(((unsigned char *)(&F_word))[1]);
    Write_DDS_Byte(((unsigned char *)(&F_word))[0]);
    SET_DDSCS;
}


void write_CPW0(int P_word)                  //Channel Phase1 Offset Word (CPW0) (0x05)
{
    CLR_DDSCS;
    Write_DDS_Byte(0x05);
    Write_DDS_Byte(((unsigned char *)(&P_word))[1]&0x3F);
    Write_DDS_Byte((((unsigned char *)(&P_word))[0]));
    SET_DDSCS;
}


void write_ACR(long A_word)
{
    CLR_DDSCS;
    Write_DDS_Byte(0x06);
    Write_DDS_Byte(((unsigned char *)(&A_word))[2]);
    Write_DDS_Byte(((unsigned char *)(&A_word))[1]);
    Write_DDS_Byte(((unsigned char *)(&A_word))[0]);
    SET_DDSCS;
}


void write_LSR(char rising,char falling)
{
    CLR_DDSCS;
    Write_DDS_Byte(0x07);
    Write_DDS_Byte(rising);
    Write_DDS_Byte(falling);
    SET_DDSCS;
}


void write_RDW(long rising)
{
    CLR_DDSCS;
    Write_DDS_Byte(0x08);
    Write_DDS_Byte(((unsigned char *)(&rising))[3]);
    Write_DDS_Byte(((unsigned char *)(&rising))[2]);
    Write_DDS_Byte(((unsigned char *)(&rising))[1]);
    Write_DDS_Byte(((unsigned char *)(&rising))[0]);
    SET_DDSCS;
}


void write_FDW(long falling)
{
    CLR_DDSCS;
    Write_DDS_Byte(0x09);
    Write_DDS_Byte(((unsigned char *)(&falling))[3]);
    Write_DDS_Byte(((unsigned char *)(&falling))[2]);
    Write_DDS_Byte(((unsigned char *)(&falling))[1]);
    Write_DDS_Byte(((unsigned char *)(&falling))[0]);
    SET_DDSCS;
}


void write_CTWn(char n,long w_data)
{
    CLR_DDSCS;
    Write_DDS_Byte(n+0x09);   //CTWn's address is n+0x09.n>=1 and n<=15.
    Write_DDS_Byte(((unsigned char *)(&w_data))[3]);
    Write_DDS_Byte(((unsigned char *)(&w_data))[2]);
    Write_DDS_Byte(((unsigned char *)(&w_data))[1]);
    Write_DDS_Byte(((unsigned char *)(&w_data))[0]);
    SET_DDSCS;
}


void set_frequency(u32 f)
{
    long temp;
    temp=(unsigned long int)f*(0xFFFFFFFF*1.0/(float)systemp_frequency+1.0/systemp_frequency);
    write_CFTW0(temp);
}


void SetAd(int FreKhz)
{
    int i  = 0xff;
//通道2 比通道3 多50 khz
    write_CSR(0x80); //通道3
    set_frequency((u32)(FreKhz*1000));
    write_CSR(0x40); //通道2
    set_frequency((u32)((FreKhz+50)*1000));

    SET_IOUPDATE;
    while (i--);
    CLR_IOUPDATE;
}延时没有很精确,仅做参考。
来自:求助得到的回答
全部回答
  • 1楼网友:雾月
  • 2021-03-31 03:20
了解adc的原理, 看码,看码,看码,一直看到吐,吐过几次之后你就会了
希望能解决您的问题。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯