最近得到一个AD9833模块,想用它来做个简易波形发生器。可是调试了半天就是不行,用的是模拟SPI,现将程序贴出,求大神解答。模块本身好的,我在一块
STM32F103CBT6小板上实验成功,可是移植到NUCLEO-F412ZG板子,就是不行,实在无解。程序就那么几行,看来看去找不出问题。求大神帮忙看看.
主要程序如下:
AD9833.H
- #ifndef __AD9833_H
- #define __AD9833_H
- #include "sys.h"
- #define TRI_WAVE 0 //输出三角波
- #define SIN_WAVE 1 //输出正弦波
- #define SQU_WAVE 2 //输出方波
- //void AD9833_WaveSeting(void);
- void AD9833_Init(void);
- void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase );
- void AD9833_Init_GPIO(void);
- #endif
复制代码AD9833.C
- #include "AD9833.h"
- /* 1.Freq: 频率值, 0.1 hz - 12Mhz
- 2.Freq_SFR: 0 或 1
- 3.WaveMode: TRI_WAVE(三角波),SIN_WAVE(正弦波),SQU_WAVE(方波)
- 4.Phase : 波形的初相位*/
- //***************************
- // Pin assign
- // STM32 AD9833
- // GPIOB_Pin_12 ---> FSYNC
- // GPIOB_Pin_13 ---> SCK
- // GPIOB_Pin_15 ---> DAT
- //***************************
- /*端口定义 */
- #define PORT_FSYNC GPIOB
- #define PIN_FSYNC GPIO_Pin_12
- #define PORT_SCK GPIOB
- #define PIN_SCK GPIO_Pin_13
- #define PORT_DAT GPIOB
- #define PIN_DAT GPIO_Pin_15
- //****************************************************************
- #define FSYNC_0() GPIO_ResetBits(PORT_FSYNC, PIN_FSYNC)
- #define FSYNC_1() GPIO_SetBits(PORT_FSYNC, PIN_FSYNC)
- #define SCK_0() GPIO_ResetBits(PORT_SCK, PIN_SCK)
- #define SCK_1() GPIO_SetBits(PORT_SCK, PIN_SCK)
- #define DAT_0() GPIO_ResetBits(PORT_DAT, PIN_DAT)
- #define DAT_1() GPIO_SetBits(PORT_DAT, PIN_DAT)
- //初始化AD9833 GPIO
- void AD9833_Init_GPIO()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = PIN_SCK|PIN_DAT|PIN_FSYNC;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉
-
- GPIO_Init(PORT_SCK, &GPIO_InitStructure);
-
- }
- /*
- *********************************************************************************************************
- * 函 数 名: AD9833_Delay
- * 功能说明: 时钟延时
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void AD9833_Delay(void)
- {
- uint16_t i;
- for (i = 0; i < 1; i++);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: AD9833_Write
- * 功能说明: 向SPI总线发送16个bit数据
- * 形 参: TxData : 数据
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void AD9833_Write(unsigned int TxData)
- {
- unsigned char i;
- SCK_1();
- // AD9833_Delay();
- FSYNC_1();
- // AD9833_Delay();
- FSYNC_0();
- // AD9833_Delay();
- for(i = 0; i < 16; i++)
- {
- if (TxData & 0x8000)
- DAT_1();
- else
- DAT_0();
-
- AD9833_Delay();
- SCK_0();
- AD9833_Delay();
-
- SCK_1();
-
- TxData <<= 1;
- }
- FSYNC_1();
-
- }
- void AD9833_Init()
- {
- AD9833_Write(0x0100); //复位AD9833
- AD9833_Write(0x2100); //选择数据一次写入
- AD9833_Write(0x69F1); //L14
- AD9833_Write(0x4000); //H14 频率寄存器0为1KHz
- AD9833_Write(0x93E3); //L14
- AD9833_Write(0x8001); //H14 频率寄存器1为2KHz
- AD9833_Write(0x2000); //芯片进入工作状态,寄存器频率0输出1KHz波形
- }
- /*
- *********************************************************************************************************
- * 函 数 名: AD9833_WaveSeting
- * 功能说明: 向SPI总线发送16个bit数据
- * 形 参: 1.Freq: 频率值, 0.1 hz - 12Mhz
- 2.Freq_SFR: 0 或 1
- 3.WaveMode: TRI_WAVE(三角波),SIN_WAVE(正弦波),SQU_WAVE(方波)
- 4.Phase : 波形的初相位
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )
- {
- int frequence_LSB,frequence_MSB,Phs_data;
- double frequence_mid,frequence_DATA;
- long int frequence_hex;
- /*********************************计算频率的16进制值***********************************/
- frequence_mid=268435456/25;//适合25M晶振
- //如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz
- frequence_DATA=Freq;
- frequence_DATA=frequence_DATA/1000000;
- frequence_DATA=frequence_DATA*frequence_mid;
- frequence_hex=frequence_DATA; //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;
- frequence_LSB=frequence_hex; //frequence_hex低16位送给frequence_LSB
- frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
- frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB
- frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
- Phs_data=Phase|0xC000; //相位值
- AD9833_Write(0x0100); //复位AD9833,即RESET位为1
- AD9833_Write(0x2100); //选择数据一次写入,B28位和RESET位为1
- if(Freq_SFR==0) //把数据设置到设置频率寄存器0
- {
- frequence_LSB=frequence_LSB|0x4000;
- frequence_MSB=frequence_MSB|0x4000;
- //使用频率寄存器0输出波形
- AD9833_Write(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入
- AD9833_Write(frequence_MSB); //H14 频率寄存器的高14位数据输入
- AD9833_Write(Phs_data); //设置相位
- //AD9833_Write(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/
- }
- if(Freq_SFR==1) //把数据设置到设置频率寄存器1
- {
- frequence_LSB=frequence_LSB|0x8000;
- frequence_MSB=frequence_MSB|0x8000;
- //使用频率寄存器1输出波形
- AD9833_Write(frequence_LSB); //L14,选择频率寄存器1的低14位输入
- AD9833_Write(frequence_MSB); //H14 频率寄存器1为
- AD9833_Write(Phs_data); //设置相位
- //AD9833_Write(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/
- }
-
- /*显示处理函数*/
- if(WaveMode==TRI_WAVE) //输出三角波波形
- {
- AD9833_Write(0x2002);
-
- }
- if(WaveMode==SQU_WAVE) //输出方波波形
- {
- AD9833_Write(0x2028);
- }
- if(WaveMode==SIN_WAVE) //输出正弦波形
- {
- AD9833_Write(0x2000);
-
- }
- }
复制代码最后main.c
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "AD9833.h"
- int main(void)
- {
- //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
- delay_init(168); //初始化延时函数
- AD9833_Init_GPIO(); //AD9833 GPIO 初始化
- AD9833_Init();
- LED_Init(); //初始化LED端口
- uart_init(9600); //串口初始化波特率为115200
- printf("AD9833实验开始!") ;
- while(1)
- {
- AD9833_WaveSeting(10,0,TRI_WAVE,0);
- delay_ms(10000);
- AD9833_WaveSeting(20000000,0,SIN_WAVE,0 );
- delay_ms(10000);
- AD9833_WaveSeting(500,0,SQU_WAVE,0);
- delay_ms(10000); //测试波形
- }
-
- }
复制代码
一周热门 更多>