AnsweredAssumed Answered

AD9522 PLL cann't be Locked

Question asked by hanson on Jun 7, 2011
Latest reply on Jul 1, 2011 by neilw

Hi, appreciate your help first

 

    There are high speed AD, DA, FPGA, DSP and two Clock generation chip AD9522 on the board, one for AD and DA, one for FPGA MGT and DSP.

The AD9522 schematics are attached as fpga.pdf, and the value of resistors and caps are the same as Clock Generation Plot on page 24 of attached AD9522-1.pdf.

 

     We use FPGA Soft Cpu to programe AD9522 registers, and the sequence is list as below

   int Status;

         Xil_AssertNonvoid(XAd9522Ptr != NULL);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.SerialPortConfig.addr,

                            XAd9522Ptr->Xad9522Regs.SerialPortConfig.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.IoUpdata.addr,

                                     XAd9522Ptr->Xad9522Regs.IoUpdata.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.ReadbackControl.addr,

                            XAd9522Ptr->Xad9522Regs.ReadbackControl.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.ErpomVerIdLsb.addr,

                            XAd9522Ptr->Xad9522Regs.ErpomVerIdLsb.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.EpromVerIdMsb.addr,

                            XAd9522Ptr->Xad9522Regs.EpromVerIdMsb.reg);

 

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PfdChargePump.addr,

                            XAd9522Ptr->Xad9522Regs.PfdChargePump.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.RcounterLsb.addr,

                            XAd9522Ptr->Xad9522Regs.RcounterLsb.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.RcounterMsb.addr,

                            XAd9522Ptr->Xad9522Regs.RcounterMsb.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.Acounter.addr,

                            XAd9522Ptr->Xad9522Regs.Acounter.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.BcounterLsb.addr,

                            XAd9522Ptr->Xad9522Regs.BcounterLsb.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.BcounterMsb.addr,

                            XAd9522Ptr->Xad9522Regs.BcounterMsb.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_1.addr,

                            XAd9522Ptr->Xad9522Regs.PllCtrl_1.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_2.addr,

                            XAd9522Ptr->Xad9522Regs.PllCtrl_2.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_3.addr,

                            XAd9522Ptr->Xad9522Regs.PllCtrl_3.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_4.addr,

                            XAd9522Ptr->Xad9522Regs.PllCtrl_4.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_5.addr,

                            XAd9522Ptr->Xad9522Regs.PllCtrl_5.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_6.addr,

                            XAd9522Ptr->Xad9522Regs.PllCtrl_6.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_7.addr,

                            XAd9522Ptr->Xad9522Regs.PllCtrl_7.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_8.addr,

                            XAd9522Ptr->Xad9522Regs.PllCtrl_8.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_9.addr,

                            XAd9522Ptr->Xad9522Regs.PllCtrl_9.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllReadback.addr,

                            XAd9522Ptr->Xad9522Regs.PllReadback.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_0.addr,

                            XAd9522Ptr->Xad9522Regs.OutControl_0.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_1.addr,

                            XAd9522Ptr->Xad9522Regs.OutControl_1.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_2.addr,

                                     XAd9522Ptr->Xad9522Regs.OutControl_2.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_3.addr,

                                     XAd9522Ptr->Xad9522Regs.OutControl_3.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_4.addr,

                                     XAd9522Ptr->Xad9522Regs.OutControl_4.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_5.addr,

                                     XAd9522Ptr->Xad9522Regs.OutControl_5.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_6.addr,

                                     XAd9522Ptr->Xad9522Regs.OutControl_6.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_7.addr,

                                     XAd9522Ptr->Xad9522Regs.OutControl_7.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_8.addr,

                                     XAd9522Ptr->Xad9522Regs.OutControl_8.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_9.addr,

                                     XAd9522Ptr->Xad9522Regs.OutControl_9.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_10.addr,

                                     XAd9522Ptr->Xad9522Regs.OutControl_10.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.OutControl_11.addr,

                                     XAd9522Ptr->Xad9522Regs.OutControl_11.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.EnableOutputOnCsdldLsb.addr,

                                     XAd9522Ptr->Xad9522Regs.EnableOutputOnCsdldLsb.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.EnableOutputOnCsdldMsb.addr,

                                     XAd9522Ptr->Xad9522Regs.EnableOutputOnCsdldMsb.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerLsb_0.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerLsb_0.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerNsb_0.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerNsb_0.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerMsb_0.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerMsb_0.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerLsb_1.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerLsb_1.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerNsb_1.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerNsb_1.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerMsb_1.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerMsb_1.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerLsb_2.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerLsb_2.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerNsb_2.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerNsb_2.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerMsb_2.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerMsb_2.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerLsb_3.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerLsb_3.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerNsb_3.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerNsb_3.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.DividerMsb_3.addr,

                                     XAd9522Ptr->Xad9522Regs.DividerMsb_3.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.VcoDivider.addr,

                                     XAd9522Ptr->Xad9522Regs.VcoDivider.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.InputClks.addr,

                                     XAd9522Ptr->Xad9522Regs.InputClks.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PowerdownSync.addr,

                                     XAd9522Ptr->Xad9522Regs.PowerdownSync.reg | 0x01);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PowerdownSync.addr,

                                     XAd9522Ptr->Xad9522Regs.PowerdownSync.reg & 0xFE);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_3.addr,

                                     XAd9522Ptr->Xad9522Regs.PllCtrl_3.reg & 0xFE);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.IoUpdata.addr,

                                     XAd9522Ptr->Xad9522Regs.IoUpdata.reg);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.PllCtrl_3.addr,

                                     XAd9522Ptr->Xad9522Regs.PllCtrl_3.reg | 0x01);

 

         Status = Ad9522_WriteSingleReg(XAd9522Ptr, XAd9522Ptr->Xad9522Regs.IoUpdata.addr,

                                     XAd9522Ptr->Xad9522Regs.IoUpdata.reg);

 

   The value of registers are generated using a software of AD9522 evaluation kit as ad9522.stp.

   We have read the datasheet, the calibration sequence and IO Update sequence are just as the datasheet says. Actually, the registers are all read back, and just as we programed.

   The value of PLL_Readback register at address 0x01F is 0x42, that is to say, the calibration sequence is completed, and refclk_in1 is all right, but ... the PLL cann't lock.

 

   Now all the board, all the AD9522 are all the same, and the status pins are all 1V (strange yes?) except the SYNC pin is 3.3V.

   We use AD9516 in the past, the are all OK and all show good performance. But the same method debugging AD9522 cann't work here.

 

   So, there is no way for us to find out the solution now. Could you give some advice? Thanks in advance.

Attachments

Outcomes