正点原子STM32f103mini开发版驱动AD9954输出正弦波,但是一直输出杂波

用正点的stm32f103mini开发版驱动AD9954输出正弦波,但是一直出杂波,不知道为啥,请问各位强者帮分析是不是指令有问题的😥。STC单片机能驱动,但是移植到STM32就一直出问题.stm32f103rct6的.

//这是定义的IO口
#define PWRDWNCTL  PCout(0) 
#define IOSYNC       PCout(10)
#define reset PCout(1)
#define SDO        PCout(9)
#define CS           PCout(6)
#define SCLK       PCout(2)
#define OSK           PCout(7)
#define UPDATA     PCout(8)
#define SDIOn       PCout(3)

//这是PC串口初始化
void PCIO_Init ()
{
    RCC->APB2ENR|=1<<4; //使能 PORTC 时钟 
    GPIOC->CRL&=0X00FF0000;     //不完全手册p105,清掉这个位原来的设置,同时也不影响其他位的设置
    GPIOC->CRH&=0XFFFFF000;
    GPIOC->CRL|=0X33003333;//PB6 通用开漏输出 
    GPIOC->CRH|=0X00000333;//PB7 通用推挽输出
    GPIOC->ODR|=0X14E; //PA8 输出高
}

//这是一个寄存器控制指令的数组
unsigned char ControlWord[]=
{
    0x00,//0A   第0组:功能控制字
    0x10,//0B
    0x00,//0C
    0x00,//0D

     0xA7,   //1A 0x(10100这里算是0x14为20倍频)1111组:模拟部分控制字  采用20M有源输入,20倍频,VCO范围 
                     设置为250M到400MHz,锁相环泵电流为150UA
    0x00,//1B
    0x00,//1C
  
    0x00,//2A   第2组:ASF
    0x00,//2B

    0x00,//3A   第3组:ARR

    0x0A,//4A 第4组:频率控制字,4字节共320xD7,//4B
    0xA3,//4C
    0x00,//4D

    0x00,//5A    第5  相位控制字                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             组:相位偏移字
    0x00,//5B
};


//这是写入寄存器地址和对应指令的函数,指令在上面的那个数组里面
void AD9952WriteByte (unsigned char commond, unsigned char *databyte,unsigned char lengh)
{ 
    uchar j; 
    uchar i;
    uchar SPDR;

    for(i=8;i>0;i--)         //写命令字
    {
        SCLK = 0;
        SDIOn =    commond & 0x80;
//        delay_us(2);
        SCLK = 1;
//        delay_us(2);
//        SCLK = 0;
        commond = commond<<1;
    }
    
    for(j=lengh;j>0;j--)        //写lengh位的data
    {
        SPDR=databyte[j-1];        //取出高 byte
        for(i=8;i>0;i--)        //1 byte
        {
            SCLK = 0;
            SDIOn =    SPDR & 0x80;
//            delay_us(2);
            SCLK = 1;
//            delay_us(2);
//            SCLK = 0;
            SPDR = SPDR<<1;
        }    
    }
} 




//这是AD9954的初始化函数
void Init_AD9952(void) //初始化AD9952使输出为1MHZ
{   
    PWRDWNCTL=0;
    CS=0;
    UPDATA=0;       //上升沿传输控制字
    IOSYNC=0;      //多片DDS芯片级联时候,使用,不适用时接GND

    reset=1;
    delay_ms(5);
    reset=0;
    
    AD9952WriteByte(0X00,ControlWord,4); 
    AD9952WriteByte(0X01,ControlWord+4,3);
    AD9952WriteByte(0X02,ControlWord+7,2);
    AD9952WriteByte(0X03,ControlWord+9,1);
    AD9952WriteByte(0X04,ControlWord+10,4);
    AD9952WriteByte(0X05,ControlWord+14,2);

    UPDATA = 1;
    UPDATA = 0;
}





//==============================================================================================
//函数名称:void Freq_convert(ulong Freq)
//函数功能:正弦信号频率数据转换
//入口参数:Freq  需要转换的频率,取值从0—SYSCLK/2
//出口参数:无   但是影响全局变量ControlWord[10-13]的值
//===========================================================================================
void Freq_convert(ulong Freq)
{
      ulong Temp;            
      Temp=(ulong)Freq*10.73741824;       //将输入频率因子(频率变换字?)分为四个字节  10.73741824=(2^32)/400000000
      ControlWord[10]=(uchar)Temp;
      ControlWord[11]=(uchar)(Temp>>8);    //数组,地址连续,相邻8个位就是下一个数组元素
      ControlWord[12]=(uchar)(Temp>>16);
      ControlWord[13]=(uchar)(Temp>>24);    //13放的最高八位的值,10放低八位的。强制转换为uchar截断
      AD9952WriteByte(0X04,ControlWord+10,4);
    AD9952WriteByte(0X05,ControlWord+14,2);
      UPDATA = 1;
    UPDATA = 0;
}

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

已经解决