已回答假定已回答

请教DDS芯片AD9959的调试问题

Yamei 在 2013-1-25 詢問的問題
最後回覆由153319760@qq.com於2015-1-13提供

大家好,我在使用DDS芯片AD9959做波形发生器遇到问题。

现在板子上25MHz的晶振工作正常,AD9959四分频输出6.25MHz方波信号也正常,但在运行程序调试中有问题,单片机不能将控制字写入寄存器,例如用下面的程序设定系统时钟倍频,25*8=200,四分频输出应该变为50MHz,但示波器检测仍是6.25MHz,显然控制字没有写进寄存器。

所用单片机为AT89S52,P2口控制DDS,输出电平经电阻分压后在AD9959输入端口电平为3.5V,AD9959外围电路见附件,AVDD、DVDD、DVDD_I/O分别为1.8V、1.8V、3.3V,调试程序如下所示,请大家帮忙看看问题出在哪里?为什么控制字写不进去?

谢谢!

void main()

{

delay10ms();

AD9958_init();

 

write_FR1(0x20,0x00,0x00);  // 8*25

run();

    while(1);

}

 

void delay10ms()

{

unsigned char i,j;

for(i=230;i>0;i--)

for(j=20;j>0;j--);

}

 

 

void AD9959_init(void)

{

unsigned int i;

 

MASTER_RESET=0;

for(i=0;i<10000;i++); //50ms

CS=1;

SCLK=0;

SDIO_3=1;

MASTER_RESET=1;

for(i=0;i<10000;i++);

MASTER_RESET=0;

for(i=0;i<100;i++);

}

 

void run(void)

{

IO_UPDATA=0;

IO_UPDATA=0;

IO_UPDATA=0;

IO_UPDATA=0;

 

IO_UPDATA=1;

IO_UPDATA=1;

IO_UPDATA=1;

IO_UPDATA=1;

}

 

void write_a_byte(unsigned char w_data)

{

unsigned char i;

for(i=0;i<8;i++)

  {

   SDIO_0=(w_data & 0x80);

   w_data<<=1;

  

   SCLK="0";

   SCLK="0";

   SCLK="1";

   SCLK="1";

  }

}

 

void write_FR1(unsigned char w_data1,unsigned char w_data2,unsigned char w_data3)

{

SDIO_3=0;

SDIO_3=0;

CS=0;

CS=0;

write_a_byte(0x01);    //write address 1.  FR1's address is 0x01

write_a_byte(w_data1);

write_a_byte(w_data2);

write_a_byte(w_data3);

CS=1;

CS=1;

SDIO_3=1;

SDIO_3=1;

}

結果