已回答假定已回答

用STM32F4的SPI驱动AD9837,没有输出,求助

olivehuang 在 2016-7-5 詢問的問題
最後回覆由hpkamen於2016-7-7提供

利用STM32F4的SI3发出命令和数据,用示波器看过SCL和SDA管脚,输出波形都是对的,但就是没有输出,希望可以帮忙看下,谢谢!代码如下:

SPI的时钟我也换过,利用IO口模拟SPI我也试过,但是就是没有输出,希望工程师能帮忙解决一下,谢谢!

先是一些宏定义,便于以后移植吧,可以忽略。

 

#define AD9837_CTRL    GPIOC//定义所用的IO口

#define RCC_AD9837_CTRL     RCC_AHB1Periph_GPIOC

#define RCC_AD9837_SPI      RCC_APB1Periph_SPI3 //SPI时钟

 

#define AD9837_SYNC        GPIO_Pin_5//PC5
#define AD9837_SDA        GPIO_Pin_12//PC12

#define AD9837_SDA_Pin      GPIO_PinSource12

#define AD9837_SCK_Pin      GPIO_PinSource10

#define AD9837_SCK        GPIO_Pin_10  //PC10

 

 

#define AD9837_SPI          GPIO_AF_SPI3   //SPI管脚使能
#define AD9837_SPI_x        SPI3//指明使用哪个SPI

 

 

#define SYNC_SET      GPIO_SetBits(AD9837_CTRL,AD9837_SYNC)
#define SYNC_CLR      GPIO_ResetBits(AD9837_CTRL,AD9837_SYNC)

 

 

 

void AD9837_GPIO_Init(void)

  GPIO_InitTypeDef GPIO_InitStructure;

 

  RCC_AHB1PeriphClockCmd(RCC_AD9837_CTRL,ENABLE);

  RCC_APB1PeriphClockCmd(RCC_AD9837_SPI,ENABLE);

 

  //配置SCK,MOSI,

  GPIO_InitStructure.GPIO_Pin = AD9837_SDA |AD9837_SCK;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  //推挽复用输出

    GPIO_Init(AD9837_CTRL, &GPIO_InitStructure);

    GPIO_PinAFConfig(AD9837_CTRL, AD9837_SDA_Pin, AD9837_SPI);

    GPIO_PinAFConfig(AD9837_CTRL, AD9837_SCK_Pin, AD9837_SPI);

  //配置SYNC信号

     GPIO_InitStructure.GPIO_Pin   = AD9837_SYNC;

  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 

  GPIO_Init(AD9837_CTRL, &GPIO_InitStructure); 

}

//以下为SPI初始化代码

void SPI_Configration(void)

{

     SPI_InitTypeDef  SPI_InitStructure;

     SPI_I2S_DeInit(AD9837_SPI_x);

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //双线双向全双工

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;   //主SPI

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;   //SPI发送接收16位帧结构

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //第1个跳变沿数据被采样

     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由软件控制

     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//16->2.625M  SPI2->42M系统时钟

     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始

     SPI_InitStructure.SPI_CRCPolynomial = 7;   //设置CRC校验多项式,提高通信可靠性,大于1即可。

     SPI_Init(AD9837_SPI_x ,&SPI_InitStructure);

     SPI_Cmd(AD9837_SPI_x , ENABLE);

}

 

void WriteToAD9837Word(u16 va)

      SYNC_CLR;    //拉低SYNC

    while (SPI_I2S_GetFlagStatus(AD9837_SPI_x,SPI_I2S_FLAG_BSY)==SET){}//等待发送区空

    SPI_I2S_SendData(AD9837_SPI_x,va);   

SYNC_SET;    //锁存命令或者数据

}

 

 

void AD9837_Configration(void)

{

     AD9837_GPIO_Init();

  SPI_Configration();

}

 

void WriteToAD9837_Freq(void)

{

    WriteToAD9837Word(0X0100);

//Write a full 28-Bit Word to Frequency Register: B28=1, RESET=1

  WriteToAD9837Word(0X2100);

//Frequency0

  WriteToAD9837Word(0X599A); //FREQ0  14LSB

  WriteToAD9837Word(0X4666);//FREQ0  14MSB

 

//Phase0 and Phase1

  WriteToAD9837Word(0XC000);//PHASE0  14LSB

 

//Select the Frequency Source and CLEAR RESET: RESET BIT=0, FSEL=0,PSEL=0

WriteToAD9837Word(0X0000);// 选择FREQ0和PHASE0输出正弦波

}

結果