求助各位大佬,我用Stm32F411 想控制AD9833,用的网上一个例程的代码,然后SPI用的硬件设置,都跟那边设置的一样的,然后电路的LED确实亮了,但是一直没有波形,用的示波器,求助一下各位。 贴一下代码 具体是stm32F411CEU6
AD9833.c
#include "ad9833.h"
#include "spi.h"
void AD9833_GPIOinit(void)
{
CS_9833_1(); //首先拉高片选,不使能,防止输入错误数据
}
/*
*******************************************************
向AD9833发送一个16bit的数据
*******************************************************
*/
void AD9833_Write(unsigned short TxData) //TxData是2字节
{
unsigned char data[2] ; //一个char一个字节,数组为2个字节
data[0] = (unsigned char)((TxData>>8) &0xff); //data[0]存储高位
data[1] = (unsigned char)(TxData&0xff); //data[1]存储低位
CS_9833_0(); //拉低片选,准备写入
HAL_SPI_Transmit (&hspi1 , data, 2, 0x02) ; //用HAL库的SPI发送函数发送数据
CS_9833_1(); //发送完毕,拉高片选
}
/*
*******************************************************
Reset: 0为有输出,1为没输出,此位只控制有无输出,不复位寄存器
SleeppMode: 3为关闭内部DAC和时钟,0为不关闭
optionbit|modebit: 00正弦01三角10方波11保留
*******************************************************
*/
void AD9833_CtrlSet(unsigned char Reset,unsigned char SleeppMode,unsigned char optionbit,unsigned char modebit)
{
unsigned short regtemp = 0; //对输出模式的一些选择
regtemp = regtemp|(((unsigned short)Reset&0x01)<<8); //以下就是把每个位对应到相应的寄存器上,不过好像少了个DIV2,DIV2默认为0了?
regtemp = regtemp|((SleeppMode&0x03)<<6);
regtemp = regtemp|((optionbit&0x01)<<5);
regtemp = regtemp|((modebit&0x01)<<1);
AD9833_Write(regtemp); //写入数据,不过不需要先声明将要写入吗?
}
/*
*******************************************************
设置频率,设置完后暂不输出,用CtrlSet函数设置输出
频率值:0.1Hz-12.5MHz(最大值为25M晶振时钟的一半)
单位:Hz;例如,输出1M,则输入1000000
*******************************************************
*/
void AD9833_FreqSet(double Freq) //Freq是用户输入的以Hz为单位的频率
{
int frequence_LSB,frequence_MSB; //LSB和MSB分别对应频率寄存器里的LSB和MSB
double frequence_mid,frequence_DATA; //mid是一个中间值,用于将输入频率转换为AD9833可以接受的格式;DATA为输入进去的频率的十进制
long int frequence_hex; //hex为输入进去的频率的16进制
frequence_mid = 268435456/25; //f_{out}=dds输出频率;F_{cw}=f_{DATA};f_{ref}=25M;2^28=268435456;1000000=1M
frequence_DATA = Freq; //公式:f_{out}=(F_{cw})*(f_{ref})/(2^28)=(f_{DATA})*25M/(2^28)
frequence_DATA = frequence_DATA/1000000; //这里的f_{DATA}(化作以M为单位)=(Freq/1000000)*[(2^28)/(25)],;f_{DATA}作为f_{cw}输入进公式,刚好得到f_{out}=Freq,且以Hz为单位
frequence_DATA = frequence_DATA*frequence_mid;
frequence_hex = frequence_DATA;
frequence_LSB = frequence_hex;
frequence_LSB = frequence_LSB&0x3fff; //以下就是一些与或操作,用来输入寄存器
frequence_MSB = frequence_hex>>14;
frequence_MSB = frequence_MSB&0x3fff;
frequence_LSB = frequence_LSB|0x4000;
frequence_MSB = frequence_MSB|0x4000; //4000==0100 0000 0000 0000,把前两位变成01,代表freq0寄存器
AD9833_Write(0x2100); //2100==0010 0001 0000 0000;bit8为1->不reset;0010->连续写LSB、MSB标志
AD9833_Write(frequence_LSB);
AD9833_Write(frequence_MSB);
}
AD9833.H
#include "main.h"
#define CS_9833_0() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET)
#define CS_9833_1() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET)
void AD9833_GPIOinit(void);
void AD9833_Write(unsigned short TxData);
void AD9833_CtrlSet(unsigned char Reset,unsigned char SleeppMode,unsigned char optionbit,unsigned char modebit);
void AD9833_FreqSet(double Freq);
HAL库配置的硬件SPI
void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(spiHandle->Instance==SPI1)
{
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
main.c
int main(void)
{
arm_status status;
arm_cfft_radix4_instance_f32 fft_inst;
status = arm_cfft_radix4_init_f32(&fft_inst, FFT_SIZE,0,1);
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
MX_SPI1_Init();
HAL_TIM_Base_Start(&htim2);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)g_adc_dma_buf, 2*FFT_SIZE);
AD9833_GPIOinit();
HAL_Delay(10);
AD9833_FreqSet(1000);
AD9833_CtrlSet(1, 3, 0, 0);
HAL_Delay(1000);
AD9833_CtrlSet(0, 0, 0, 0);
}(仅展示AD9833的部分)