TI论坛
直播中

klysa

13年用户 1276经验值
私信 关注
[问答]

调试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,不知道具体原因

回帖(3)

李造吉

2024-11-15 16:26:40
您是使用的自己设计的板子还是EVM?
您是按照datasheet 中 9.2.2 Initialization Set Up章节(141页)初始化顺序配置的寄存器吗?
举报

李慎梓

2024-11-15 16:26:50
    您是否可以详细说明您的代码,SPI写入的是什么?send_buf 数组表示的是什么?
不稳定链路可能是由输入时钟不稳定引起的,您是否可以用示波器测量ADC的输入时钟,看信号波形是否干净波形质量无问题?
举报

张玉兰

2024-11-15 17:52:34
在调试ADC09QJ1300的过程中,如果发现建链不稳定的情况,可以尝试以下几个步骤来解决:

1. 检查硬件连接:
   - 确保所有连接都正确无误,包括AD9517时钟芯片、ADC、FPGA等。
   - 检查LVPECL电平是否匹配,确保信号完整性。
   - 检查差分对连接是否正确,避免短路或接触不良。

2. 检查时钟配置:
   - 确认AD9517时钟芯片产生的两路150MHz时钟是否稳定,可以使用示波器检查时钟波形。
   - 确认ADC的输入时钟150MHz是否经过CPLL后产生600MHz的采样时钟,可以使用示波器检查采样时钟波形。

3. 检查JESD配置:
   - 确认JESD配置是否正确,包括JMODE8模式、66/64b编码、4lane模式等。
   - 确认lane速率是否为7.425G,可以使用示波器检查lane速率。

4. 检查FPGA配置:
   - 确认FPGA的gth口rx是否正确配置,包括速率、编码等。
   - 检查FPGA的ibert是否正确配置,包括误码率、眼图等。

5. 检查信号完整性:
   - 使用示波器检查ADC的D0+/-~D3+/-共4路差分对信号,确保信号完整性。
   - 检查信号是否有过冲、欠冲、反射等问题,这些问题可能导致建链不稳定。

6. 检查PRBS31信号:
   - 确认发送给FPGA的PRBS31信号是否正确,可以使用示波器检查PRBS31信号波形。
   - 检查PRBS31信号是否有误码,可以使用误码检测工具检查。

7. 检查FPGA代码:
   - 确认FPGA代码是否正确实现,包括JESD接口、gth口rx等。
   - 检查FPGA代码是否有bug,可能导致建链不稳定。

8. 逐步调试:
   - 逐步检查每个部分,包括硬件连接、时钟配置、JESD配置、FPGA配置等,找到问题所在。
   - 逐步调整配置,直到找到稳定的建链。

通过以上步骤,应该可以找到导致建链不稳定的原因,并进行相应的调整,以实现稳定的建链。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分