> 技术文档 > STM32 HAL AD9959模块使用教程 康威科技

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


AD9959模块使用教程

文章目录

  • AD9959模块使用教程
    • 前言
    • 使用方法
      • 将以下两个.c与.h文件增加到你的user文件夹
      • cubemx配置IO端口
      • 将与AD9959链接的IO端口名定义如下

前言

本模块适用于且只在康威科技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_tControlValue = 0; uint8_tValueToWrite = 0; uint8_tRegisterIndex = 0; uint8_ti = 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