stm32控制AD9854问题

2019-07-20 22:42发布

原子哥,我用的是您的程序,驱动9854为什么不行呢?两个正弦信号均没有输出。板子是现成的模块,接线地址口A5-A0接PC13-PC8,数据口D7-D0接PC7-PC0,RDB接PB13。
IO-Updata接PB15,WRB接PB14,MASTER RESET接PB12。
#define AD9854_DATA  GPIOC->ODR #define AD9854_ADDR  GPIOC->ODR #define ad9854_reset  Bout(12) #define ad9854_rd     PBout(13) #define ad9854_wr     PBout(14) #define ad9854_updata PBout(15)
unsigned char ControlRegister[]={0x14,0x4f,0x00,0x60};   //AD9852控制寄存器初始值,Mode 0 unsigned char FTW[]={0x00,0x00,0x37,0xec};               //Frequency Tuning Word 1 倍频300MHz后输出频率对应的FTW值 unsigned char PAR[]={0x00,0x00};                         //Phase Adjust Register 1 unsigned char OSK[]={0x0a,0xff};                         //Output shaped keying multiplier,  650mv
void single_wave(unsigned long int fre); void Init_AD9854(void); void AD9854_Set_Mode0(void); void AD9852_Send(unsigned char addr,unsigned char data); void change_frequency(unsigned long int fre_temp);
void Init_Port(void);
int main( void ) { Stm32_Clock_Init(9); // 9倍频 delay_init(72); // 72M晶振时延时 delay_ms(200);
Init_Port(); Init_AD9854();
single_wave(1000000);   while(1); }
  void Init_Port(void) { RCC->APB2ENR |= 1<<3 ; GPIOB->CRH &= 0x0000ffff ; //通用推挽输出模式PB15-12 GPIOB->CRH |= 0x33330000 ; GPIOB->ODR |= 0xf000 ;
RCC->APB2ENR |= 1<<4 ; GPIOC->CRL &= 0x00000000 ;  //通用推挽输出 GPIOC->CRL |= 0x33333333 ; GPIOC->CRH &= 0x00000000 ; GPIOC->CRH |= 0x33333333 ; GPIOC->ODR |= 0xffff ; }

void AD9852_Send(unsigned char addr,unsigned char data)   //按照并行输入时序 { ad9854_wr = 1; // AD9854_WR_SET;                            AD9854_ADDR &= 0x00ff|addr<<8; AD9854_ADDR |= 0xff00&addr<<8;
ad9854_wr = 1; // AD9854_WR_SET; 
AD9854_DATA &= 0xff00|data; AD9854_DATA |= 0x00ff&data;
ad9854_wr = 0; // AD9854_WR_CLR; ad9854_wr = 1; // AD9854_WR_SET; ad9854_updata = 1; // AD9854_UPDATA_SET; ad9854_updata = 0; // AD9854_UPDATA_CLR; }
void Init_AD9854(void) { unsigned char addr; unsigned char i;           ad9854_reset = 0 ; // AD9854_RESET_CLR; ad9854_wr = 1 ; // AD9854_WR_SET; ad9854_rd = 0 ; // AD9854_RD_CLR; ad9854_updata = 0 ; // AD9854_UPDATA_CLR;    addr = 0x1d;
for(i=4;i>0;i--) { AD9852_Send(addr,ControlRegister[4-i]); //控制寄存器模式0 addr++; } }
void AD9854_Set_Mode0(void)                   //Mode 0 设置 { unsigned char addr; unsigned char counter;   for(addr=0x00,counter=2;counter>0;counter--) //设置Phase Adjust Register 1 { AD9852_Send(addr,PAR[2-counter]); addr++; }    for(addr=0x04,counter=4;counter>0;counter--) //设置Frequency Tuning Word 1 { AD9852_Send(addr,FTW[4-counter]); addr++; }    for(addr=0x21,counter=2;counter>0;counter--) //设置Output shaped keying multiplier { AD9852_Send(addr,OSK[2-counter]); addr++; }  }
void single_wave(unsigned long int fre) { unsigned char addr,i; unsigned long int ff; unsigned char *p;
ff=(unsigned long int)(4294967296*fre/300000000);    p=(unsigned char*)&ff;    for(addr=0x04,i=0;i<4;i++)                  //设置Frequency Tuning Word 1 { AD9852_Send(addr,*(p+3-i));        addr++; }    for(addr=0x00,i=0;i<2;i++)                  //设置Phase Adjust Register 1 { AD9852_Send(addr,PAR); addr++; }    for(addr=0x21,i=2;i>0;i--)                  //设置Output shaped keying multiplier { AD9852_Send(addr,OSK[2-i]); addr++; }  }
void change_frequency(unsigned long int fre_temp) { unsigned char addr,counter; unsigned char *p; p=(unsigned char*)&fre_temp;    for(addr=0x04,counter=0;counter<4;counter++) //设置Frequency Tuning Word 1 { AD9852_Send(addr,*(p+3-counter));        addr++; } }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。