TI中文支持网
TI专业的中文技术问题搜集分享网站

ADC09QJ1300: 建链断断续续,不稳定

Part Number:ADC09QJ1300

你好:

      我在调试ADC09QJ1300的过程中,发现建链不稳定的情况,配置AD的采样率为600M,4lane模式,7.425G的lane速率,发送prbs31给FPGA,FPGA的ibert检测信号误码率、眼图。

    1.硬件连接

      采用AD9517时钟芯片产生两路150MHz时钟,LVPECL电平,一路给ADC的clk+/-,一路给FPGA -zu4ev(xilinx Zynq UltraScale+ MPSOC )的MGTHREFCLK+/-,AD的D0+/-~D3+/-共4路差分对与FPGA的gth口rx相连。

    2.AD配置

AD输入时钟150MHz,经过cpll后产生600MHz的采样时钟。JESD配置为JMODE8模式,66/64b编码,4lane输出,线速率为600MHzX12bitX66/64=7.425Gbps,发送prbs31,配置寄存器如下

send_buf[0]=0x00;
send_buf[1]=0x00;
send_buf[2]=0xb0;//复位
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

while(recv_buf[2]!=0x01)
{
send_buf[0]=0x82;
send_buf[1]=0x70;
send_buf[2]=0x00;//等待初始化完成
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);
}

send_buf[0]=0x00;
send_buf[1]=0x58;
send_buf[2]=0x81;//spi控制,PLL使能
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x02;
send_buf[1]=0x00;
send_buf[2]=0x00;//先关闭JESD
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x61;
send_buf[2]=0x00;//CAL_EN关闭
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x02;
send_buf[1]=0x01;
send_buf[2]=0x08;//配置JMODE 8
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x29;
send_buf[2]=0xb6;//开启sys_ref
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x29;
send_buf[2]=0xF6;//开启sys_ref 配置sysfre_window
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x2a;
send_buf[2]=0x00;//配置LVPECL
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x30;
send_buf[2]=0x00;//配置模拟信号Vpp采样最大值
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x31;
send_buf[2]=0xA0;//配置模拟信号Vpp采样最大值
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x5c;
send_buf[2]=0x01;//CPLL_RESET
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x3f;
send_buf[2]=0x4a;// CPLL_VCOCTRL1
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x3d;
send_buf[2]=0x0a;//0x06;//CPLL_FBDIV1
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x3e;
send_buf[2]=0x04;//0x08;//CPLL_FBDIV2
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x5d;
send_buf[2]=0x41;//VCO_CAL_CTRL
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x5c;
send_buf[2]=0x00;//CPLL_RESET 释放
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x48;
send_buf[2]=0x08;//预加重
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x02;
send_buf[1]=0x02;
send_buf[2]=0xff;//KM1 Register
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x02;
send_buf[1]=0x05;
send_buf[2]=0x0e;//测试模式选择 发送prbs31
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x61;
send_buf[2]=0x01;//CAL_EN
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x02;
send_buf[1]=0x00;
send_buf[2]=0x01;//打开JESD
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x6c;
send_buf[2]=0x00;//打开CAL_SOFT_TRIG
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

send_buf[0]=0x00;
send_buf[1]=0x6c;
send_buf[2]=0x01;//打开CAL_SOFT_TRIG
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);

u8 result;
u32 addr=0x10000;
u32 wr_data;
u32 rd_data;

while(1)
{
send_buf[0]=0x82;
send_buf[1]=0x08;
send_buf[2]=0x00;//
XSpiPs_PolledTransfer(SpiInstancePtr, send_buf,recv_buf, 3);
usleep(5000);
result=recv_buf[2];
if((result & 0x44)!=0x44)//判断link up是否成功
{
i=0;
while(i==0);
}

}

3.FPGA配置

ibert的输入时钟为150MHz,4lane rx,设置线速率为7.425G,查看AD与FPGA的通信质量

4.现象如下

建链不稳定。通过读取AD的0x208寄存器,发现LINK_UP和SPLL_LOCKED两个bit位发生跳变,时而为1,时而为0,不知道具体原因

Amy Luo:

您好,

您是使用的自己设计的板子还是EVM?

您是按照datasheet 中 9.2.2 Initialization Set Up章节(141页)初始化顺序配置的寄存器吗?

,

??? ?:

自己画的板子。你可以看看我的寄存器配置顺序

,

Amy Luo:

您是否可以详细说明您的代码,SPI写入的是什么?send_buf 数组表示的是什么?

不稳定链路可能是由输入时钟不稳定引起的,您是否可以用示波器测量ADC的输入时钟,看信号波形是否干净波形质量无问题?

,

??? ?:

spi写入的是adc09qj1300寄存器

send_buf[0]和send_buf[1]是寄存器的地址,send_buf[2]是寄存器的值,send_buf[0]的最高位为0表示写,为1表示读寄存器。

示波器量过ad的输入时钟,是稳定的150M,也读取了cpp_lock状态,是锁定的

,

??? ?:

spi写入的是adc09qj1300寄存器

send_buf[0]和send_buf[1]是寄存器的地址,send_buf[2]是寄存器的值,send_buf[0]的最高位为0表示写,为1表示读寄存器。

示波器量过ad的输入时钟,是稳定的150M,也读取了cpp_lock状态,是锁定的

,

Amy Luo:

好的,感谢反馈!

第6步中寄存器的配置顺序不符合9.2.2 Initialization Set Up顺序要求,您修改下再看寄存器状态是怎样的?

,

??? ?:

我的寄存器配置顺序复合手册中的配置顺序。我的诉求是建链不稳定,跑一会儿会断开,断开后又建链成功

,

??? ?:

请您帮忙给出正确的解决方法

,

Amy Luo:

为更加有效地解决您的问题,我已将您的问题咨询了更了解这款芯片的资深工程师,收到他的反馈后我会同步到这里。

,

Amy Luo:

收到的回复如下:

Sorry for the delayed response I have been working through this problem. I believe this problem could be related to sysref retiming the clock. Can suggest your customer turn off the sysref receiver and processing and see if the issue remains.

他认为此问题可能与sysref retiming 时钟有关,建议您关闭 sysref 接收器并进行处理,查看问题是否仍然存在。

,

??? ?:

I have tried to turn off the sys_ref,the value of  the register 0x29 is 0x80,default value,but the issue remains,the s_pll locked is always lost,sometimes is locked

,

Amy Luo:

好的,已将上述信息反馈给咨询的工程师,若有进展后我会同步到这里

,

Amy Luo:

Can you share a schematic and layout of the clock connections to the adc please. I think this could be the problem.

赞(0)
未经允许不得转载:TI中文支持网 » ADC09QJ1300: 建链断断续续,不稳定
分享到: 更多 (0)