STM32 HAL AD9959模块使用教程 康威科技

AD9959模块使用教程

前言

本模块适用于且只在康威科技AD9959测试过

使用方法

将以下两个.c与.h文件增加到你的user文件夹

/**
  ******************************************************************************
  * @file           : 9959.c
  * @author         : Silencecmsj
  * @brief          : None
  * @attention      : None
  * @date           : 2024/7/29
  ******************************************************************************
  *                             _ooOoo_
  *                            o8888888o
  *                            88" . "88
  *                            (| -_- |)
  *                            O\  =  /O
  *                         ____/`---'\____
  *                       .'  \\|     |//  `.
  *                      /  \\|||  :  |||//  \
  *                     /  _||||| -:- |||||-  \
  *                     |   | \\\  -  /// |   |
  *                     | \_|  ''\---/''  |   |
  *                     \  .-\__  `-`  ___/-. /
  *                   ___`. .'  /--.--\  `. . __
  *                ."" '<  `.___\_<|>_/___.'  >'"".
  *               | | :  `- \`.;`\ _ /`;.`/ - ` : | |
  *               \  \ `-.   \_ __\ /__ _/   .-` /  /
  *          ======`-.____`-.___\_____/___.-`____.-'======
  *                             `=---='
  *          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ******************************************************************************
  */

#include "ad9959.h"

uint8_t FR1_DATA[3] = {
   
   0xD0,0x00,0x00};//VCO gain control[23]=1系统时钟高于255Mhz; PLL[22:18]=10100,20倍频,20*25M=500MHZ; Charge pump control = 75uA
//uint8_t FR1_DATA[3] = {0xB0,0x00,0x00};//VCO gain control[23]=1系统时钟高于255Mhz; PLL[22:18]=01100,12倍频,12*25M=300MHZ; Charge pump control = 75uA

//uint8_t FR2_DATA[2] = {0x00,0x00};	// 双方向扫描,即从起始值扫到结束值后,又从结束值扫到起始值
uint8_t FR2_DATA[2] = {
   
   0x80,0x00};// 单方向扫描,即从起始值扫到结束值后,又从起始值扫到结束值,以此类推


double ACC_FRE_FACTOR = 8.59;	//频率因子8.589934592=(2^32)/500000000 其中500M=25M*20(倍频数可编程)
//double ACC_FRE_FACTOR = 14.3;	//频率因子8.589934592=(2^32)/300000000 其中500M=25M*20(倍频数可编程)

uint8_t CFR_DATA[3] = {
   
   0x00,0x03,0x02};//default Value = 0x000302	   //通道功能寄存器




/************************************************************
** 函数名称 :void AD9959_Init(void)
** 函数功能 :初始化控制AD9959需要用到的IO口,及寄存器
** 入口参数 :无
** 出口参数 :无
** 函数说明 :无
**************************************************************/
void AD9959_Init(void)
{
   
   
    GPIO_InitTypeDef  GPIO_InitStructure;
//PA,PB,PC端口时钟使能

//初始化管脚PA2.3.4.5.6.7.8.9.10
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
//    GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIOA
//
//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10;//初始化管脚PB0.1.10
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;		 //IO口速度为2MHz
//    GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB
//
//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	//初始化管脚PC0
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;		 //IO口速度为2MHz
//    GPIO_Init(GPIOC, &GPIO_InitStructure);					 //根据设定参数初始化GPIOC

    Intserve();  //IO口电平状态初始化
    IntReset();  //AD9959复位

    //初始化功能寄存器
    AD9959_WriteData(FR1_ADD,3,FR1_DATA);//写功能寄存器1
    AD9959_WriteData(FR2_ADD,2,FR2_DATA);//
}

//延时
void delay1 (uint32_t length)
{
   
   
    length = length*12;
    while(length--);
}
/************************************************************
** 函数名称 :void Intserve(void)
** 函数功能 :IO口电平状态初始化
**************************************************************/
void Intserve(void)
{
   
   
    HAL_GPIO_WritePin(AD9959_PDC_GPIO_Port,AD9959_PDC_Pin,0);//    AD9959_PWR = 0;
    HAL_GPIO_WritePin(AD9959_CS_GPIO_Port,AD9959_CS_Pin,1);//    CS = 1;
    HAL_GPIO_WritePin(AD9959_SCLK_GPIO_Port,AD9959_SCLK_Pin,0);//    SCLK = 0;
    HAL_GPIO_WritePin(AD9959_UPDATE_GPIO_Port,AD9959_UPDATE_Pin,0);//    UPDATE = 0;
    HAL_GPIO_WritePin(AD9959_SP0_GPIO_Port,AD9959_SP0_Pin,0);//    PS0 = 0;
    HAL_GPIO_WritePin(AD9959_SP1_GPIO_Port,AD9959_SP1_Pin,0);//    PS1 = 0;
    HAL_GPIO_WritePin(AD9959_SP2_GPIO_Port,AD9959_SP2_Pin,0);//    PS2 = 0;
    HAL_GPIO_WritePin(AD9959_SP3_GPIO_Port,AD9959_SP3_Pin,0);//    PS3 = 0;
    HAL_GPIO_WritePin(AD9959_SDIO0_GPIO_Port,AD9959_SDIO0_Pin,0);//    SDIO0 = 0;
    HAL_GPIO_WritePin(AD9959_SDIO1_GPIO_Port,AD9959_SDIO1_Pin,0);//    SDIO1 = 0;
    HAL_GPIO_WritePin(AD9959_SDIO2_GPIO_Port,AD9959_SDIO2_Pin,0);//    SDIO2 = 0;
    HAL_GPIO_WritePin(AD9959_SDIO3_GPIO_Port,AD9959_SDIO3_Pin,0);//    SDIO3 = 0;
}

/************************************************************
** 函数名称 :void IntReset(void)
** 函数功能 :AD9959复位
**************************************************************/
void IntReset(void)
{
   
   
    HAL_GPIO_WritePin(AD9959_RESET_GPIO_Port,AD9959_RESET_Pin,0);//Reset = 0;
    delay1(1);
    HAL_GPIO_WritePin(AD9959_RESET_GPIO_Port,AD9959_RESET_Pin,1);//Reset = 1;
    delay1(30);
    HAL_GPIO_WritePin(AD9959_RESET_GPIO_Port,AD9959_RESET_Pin,0);//Reset = 0;
}

/************************************************************
** 函数名称 void IO_Update(void)
** 函数功能 : AD9959更新数据
**************************************************************/
void IO_Update(void)
{
   
   
    HAL_GPIO_WritePin(AD9959_UPDATE_GPIO_Port,AD9959_UPDATE_Pin,0);//UPDATE = 0;
    delay1(2);
    HAL_GPIO_WritePin(AD9959_UPDATE_GPIO_Port,AD9959_UPDATE_Pin,1);//UPDATE = 1;
    delay1(4);
    HAL_GPIO_WritePin(AD9959_UPDATE_GPIO_Port,AD9959_UPDATE_Pin,0);//UPDATE = 0;
}

/************************************************************
** 函数名称 :void AD9959_WriteData(u8 RegisterAddress, u8 NumberofRegisters, u8 *RegisterData)
** 函数功能 :使用模拟SPI向AD9959写数据
** 入口参数 :RegisterAddress: 寄存器地址
						NumberofRegisters: 要写入的字节数
						*RegisterData: 数据起始地址
** 出口参数 :无
** 函数说明 :无
**************************************************************/
void AD9959_WriteData(uint8_t RegisterAddress, uint8_t NumberofRegisters, uint8_t *RegisterData)
{
   
   
    uint8_t	ControlValue = 0;
    uint8_t	ValueToWrite = 0;
    uint8_t	RegisterIndex = 0;
    uint8_t	i = 0;

    ControlValue = RegisterAddress;
//写入地址
    HAL_GPIO_WritePin(AD9959_SCLK_GPIO_Port,AD9959_SCLK_Pin,0);//SCLK = 0;
    HAL_GPIO_WritePin(AD9959_CS_GPIO_Port,AD9959_CS_Pin,0);//CS = 0;
    for(i=0; i<8; i++)
    {
   
   
        HAL_GPIO_WritePin(AD9959_SCLK_GPIO_Port,AD9959_SCLK_Pin,0);//SCLK = 0;
        if(0x80 == (ControlValue & 0x80))
            HAL_GPIO_WritePin(AD9959_SDIO0_GPIO_Port,AD9959_SDIO0_Pin,1);//SDIO0= 1;
        else
            HAL_GPIO_WritePin(AD9959_SDIO0_GPIO_Port,AD9959_SDIO0_Pin,0);//SDIO0= 0;
        HAL_GPIO_WritePin(AD9959_SCLK_GPIO_Port,AD9959_SCLK_Pin,1);//SCLK = 1;
        ControlValue <<= 1;
    }
    HAL_GPIO_WritePin(AD9959_SCLK_GPIO_Port,AD9959_SCLK_Pin,0);//SCLK = 0;
//写入数据
    for (RegisterIndex=0; RegisterIndex<NumberofRegisters; RegisterIndex++)
    {
   
   
        ValueToWrite = RegisterData[RegisterIndex];
        for (i=0; i<8; i++)
        {
   
   
            HAL_GPIO_WritePin(AD9959_SCLK_GPIO_Port,AD9959_SCLK_Pin,0);//SCLK = 0;
            if(0x80 == (ValueToWrite & 0x80))
                HAL_GPIO_WritePin(AD9959_SDIO0_GPIO_Port,AD9959_SDIO0_Pin,1);//SDIO0= 1;
            else
                HAL_GPIO_WritePin(AD9959_SDIO0_GPIO_Port,AD9959_SDIO0_Pin,0);//SDIO0= 0;
            HAL_GPIO_WritePin(AD9959_SCLK_GPIO_Port,AD9959_SCLK_Pin,1);//SCLK = 1;
            ValueToWrite <<= 1;
        }
        HAL_GPIO_WritePin(AD9959_SCLK_GPIO_Port,AD9959_SCLK_Pin,0);//SCLK = 0;
    }
    HAL_GPIO_WritePin(AD9959_CS_GPIO_Port,AD9959_CS_Pin,1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值