已回答假定已回答

求助:AD9851的问题

Yamei 在 2013-1-22 詢問的問題

本人用ATmega16 和 ad9851制作一个信号发生器,采用串行的方式输入40位控制字,但是就是没有波形输出,也不知道是不是电路不对,所以也附上本人的电路图,麻烦有知道的高手帮忙看一下,附件是本人的ad9851的接口电路,麻烦看看有没有错:

下面是我参考网上写的串行输出驱动:

#define AD9851_SCLK_PORT    PORTA                   //PORTA W_CLK
#define AD9851_LOAD_PORT    PORTA                   //PORTA FQUD
#define AD9851_DATA_PORT    PORTA                   //PORTA DATA
#define AD9851_SCLK_H       0x01                         //PORTA0 out    程序中置位的方法,详细见本程序          
#define AD9851_LOAD_H       0x02                        //PORTA1 out    同上
#define AD9851_DATA_H       0x04                        //PORTA2 out    同上
#define AD9851_LOW          0x00                       

/***************  AD9851驱动程序  ************/
void ad9851(float freq)
{
    float fw;
    unsigned char i,j,temp;
    unsigned char s,6REF_ON;
    unsigned char d[5];

6REF_ON=1;
    fw="freq"*35.79139413;                       //d[4]中存放控制字最高位,即相位控制字
                                               //Freq=MCLK*FW/2^32
    d[4]=(unsigned long)6REF_ON;
    d[0]=(unsigned long)fw;
    d[1]=(unsigned long)fw>>8;
    d[2]=(unsigned long)fw>>16;
    d[3]=(unsigned long)fw>>24;
 
  
    AD9851_LOAD_PORT&=AD9851_LOW;        //load=0;
    AD9851_SCLK_PORT&=AD9851_LOW;        //sclk=0;
    AD9851_SCLK_PORT|=AD9851_SCLK_H;     //sclk=1;
    AD9851_SCLK_PORT&=AD9851_LOW;        //sclk=0;
    AD9851_LOAD_PORT|=AD9851_LOAD_H;     //load=1;
    AD9851_LOAD_PORT&=AD9851_LOW;        //load=0;
   
    for(i=0;i<5;i++)
    {
        temp="d"[i];
        for(j=0;j<8;j++)
        {
            AD9851_SCLK_PORT&=AD9851_LOW;         //sclk=0;
           
   if(temp&1)
      AD9851_DATA_PORT|=AD9851_DATA_H;   //sdata=1;
            else AD9851_DATA_PORT&=AD9851_LOW;    //sdata=0;
           
   AD9851_SCLK_PORT|=AD9851_SCLK_H;      //sclk=1;
           
   temp=temp>>1;
         }
      }
     
   AD9851_LOAD_PORT|=AD9851_LOAD_H;          //load=1;
      AD9851_LOAD_PORT&=AD9851_LOW;             //load=0;
 
}

結果