用正点的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倍频)111 第1组:模拟部分控制字 采用20M有源输入,20倍频,VCO范围
设置为250M到400MHz,锁相环泵电流为150UA
0x00,//1B
0x00,//1C
0x00,//2A 第2组:ASF
0x00,//2B
0x00,//3A 第3组:ARR
0x0A,//4A 第4组:频率控制字,4字节共32位
0xD7,//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天,您在需要使用的时候【私信】联系我,我会为您补发。
已经解决