STM32/STM8技术论坛
直播中

孙得洋

未满1年用户 8经验值
擅长:可编程逻辑
私信 关注
[问答]

stm32F411 AD9833 无输出波形问题

求助各位大佬,我用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

/* SPI1 init function */
void MX_SPI1_Init(void)
{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  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();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}

void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(spiHandle->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspInit 0 */

  /* USER CODE END SPI1_MspInit 0 */
    /* SPI1 clock enable */
    __HAL_RCC_SPI1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**SPI1 GPIO Configuration
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI
    */
    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);

  /* USER CODE BEGIN SPI1_MspInit 1 */

  /* USER CODE END SPI1_MspInit 1 */
  }
}

main.c

int main(void)
{

  /* USER CODE BEGIN 1 */
	arm_status status;
	arm_cfft_radix4_instance_f32 fft_inst;
	status = arm_cfft_radix4_init_f32(&fft_inst, FFT_SIZE,0,1);
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  MX_TIM2_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */
	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的部分)
已退回20积分

回帖(1)

chenwei6991627

2025-7-25 08:46:23
板子是自己做的吗?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分