☰
AD9122高速DAC调试实战:SPI配置与LVDS接口详解
2026/9/28 17:18:09 网站建设 项目流程

1. 芯片概览与接口设计的第一步:先分清三个时钟域

我最近在调一块基于AD9122的高速DAC板卡,这颗芯片在ADI的TxDAC+系列里属于常青树级别,16位分辨率,最大采样率可以到1.2GSPS量级,常用于基站发射通道、仪器仪表任意波形发生、雷达信号模拟这些场景。第一次接触这颗芯片的人,往往不是被模拟输出部分难住,而是被它的数字接口配置绕晕。AD9122的输入数据是通过LVDS差分对进来的,配置寄存器走SPI,两者看起来各自独立,实际调试时却互相牵扯,哪一个没弄对,DAC输出都是白噪或者干脆没有波形。

先别急着写寄存器,我强烈建议先把AD9122的三个时钟域理清楚。第一个是DAC采样时钟,也就是最终决定模拟输出采样率的那个时钟,通常由外部高质量时钟源或者锁相环提供,比如用AD9528这类芯片来产生。第二个是数据输入速率,FPGA往DAC发送数据的字速率,这个速率等于DAC采样率除以插值倍数。第三个是DCI时钟,也就是LVDS接口的DDR时钟,由FPGA提供给AD9122,用来在双沿锁存数据。很多人一开始会把DAC采样时钟、数据速率、DCI频率混为一谈,其实它们之间差着插值倍数、Lane数和DDR双沿这三层关系。

举个例子,如果DAC采样率是1.2GSPS,配置2倍插值,那么FPGA侧的数据字速率就是600MSPS。再假设LVDS配置成4 Lane、16bit位宽,DCI因为双沿采样,频率等于数据位宽乘以字速率,再除以两倍的Lane数,算出来是1.2GHz。这个频率并不低,所以实际项目里通常会靠提高插值倍数、增加Lane数来把DCI压到FPGA能轻松处理的范围内。

有一个比较容易忽略的点:AD9122内部还有可选的PLL,可以把外部低频参考时钟倍频到DAC采样频率。如果用了PLL,那数据手册里的锁定时间、环路带宽这些参数都要注意,尤其在做信号发生器类项目时,PLL的相位噪声会直接影响输出信号的频谱纯度。我的习惯是先把这一串频率画成一张表格贴在调试笔记最前面,每改一个配置都回头看一眼这张表,能省掉后面大量的排查时间。

2. SPI配置实操:寄存器地图、写时序与推荐初始化序列

SPI是AD9122的配置入口,虽然寄存器数量不算少,但实际项目里经常用到的就那十几个。芯片的SPI接口支持三线制和四线制,三线制只有CSB、SCLK、SDIO三个引脚,四线制多了一个SDO用于读回。我的建议是能用三线就不用四线,省IO,读回功能SDIO在写指令里切换方向也能做。

AD9122的SPI写时序有个特点,每次传输先发一个8位指令字,包含读写标志、字节数和6位寄存器地址,后面再跟数据字节。所有数据都是MSB在前,SCLK空闲时为低电平,数据在上升沿被DAC锁存。用FPGA实现这个时序很简单,状态机分IDLE、CMD、DATA三步就行。如果用STM32这类MCU做主控,需要特别注意SPI外设的CPOL和CPHA配置,实测下来CPOL=0、CPHA=1最稳妥,也就是空闲低电平、第二个边沿采样。

初始化序列的顺序比具体寄存器值更重要。我习惯按这个顺序来:先软件复位,确认芯片ID能读回来,再配时钟、插值、LVDS接口,最后配输出电流并使能DAC。下面的伪代码是当前项目里验证过的流程,具体数值在不同版本芯片上可能有差异,但顺序基本通用。

// 1. 软件复位并等待稳定 spi_write(0x00, 0x02); // 软件复位 delay_ms(10); spi_write(0x00, 0x00); // 清除复位状态 // 2. 确认SPI通信正常 uint8_t chip_id = spi_read(0x02); // 读芯片ID if (chip_id != 0x82) { // 具体ID以手册为准 // 通信异常,检查时序和电平 } // 3. 配置时钟相关寄存器 spi_write(0x10, 0x01); // 使能DCI时钟等 // 如果使用内部PLL,这里继续配置分频比和锁定阈值 // 4. 配置插值倍数与数字滤波器 spi_write(0x20, 0x01); // 设置2x插值,具体位域查手册 // 5. 配置LVDS输入 spi_write(0x1E, 0x41); // 4-Lane、16bit、LVDS使能 // 6. 配置数据格式与输出电流 spi_write(0x2F, 0x01); // 选择二进制补码输入格式 spi_write(0x25, 0x1F); // 设置满量程输出电流 // 7. 使能DAC输出 spi_write(0x2A, 0x01);

为什么第一步就要读芯片ID?因为SPI通信不正常时,后面写什么都白搭,而ID读回是最快的自检方式。调SPI的时候,逻辑分析仪比示波器好用得多,直接抓CSB、SCLK、SDIO三根线,对照手册时序图看指令字和数据字节。我遇到过几次“寄存器写不进去”的问题,最后都是因为主机在SCLK下降沿附近改变SDIO,导致DAC采样到不稳定电平,把数据改成在上升沿稳定之后就好了。

还有一个细节:AD9122里有些寄存器是带锁存性质的,写入之后不一定立即生效,需要按手册要求触发一次更新。不同批次的芯片在这一点上可能有细微差别,所以每改一个关键寄存器,我建议都读回一次确认,尤其是LVDS配置和输出电流这两个区域。

3. LVDS数据输入设计:Lane模式、DDR时序与FPGA约束思路

AD9122的LVDS输入是整个接口设计里最容易出问题的地方。它的数据线有D0P/N到D15P/N总共16对,还有一个DCI差分时钟对,由FPGA输出给DAC。FPGA端的LVDS输出电平要和AD9122输入的电平规范匹配,大多数FPGA的HP Bank在1.2V共模下可以兼容,但别想当然,上板前最好确认一下FPGA选用的IOSTANDARD和DAC输入共模范围。

Lane模式和位宽的配置是一组联动参数。AD9122支持1、2、4条Lane,位宽支持8bit和16bit。以16bit位宽、4-Lane模式为例,数据线D0P/N到D3P/N负责第一个4bit切片,D4P/N到D7P/N负责第二个切片,依此类推。DCI是双沿采样,每个时钟周期上升沿和下降沿各锁存一次,所以4条Lane在一个DCI周期内可以锁存8bit,一个16bit的字需要两个DCI周期传完。这也是DCI频率等于字速率两倍的原因。

DCI与数据之间的相位关系是整个接口设计的核心。AD9122手册里会给相对DCI建立时间和保持时间的要求,FPGA输出数据时要保证在DCI边沿到来之前信号已经稳定,并且稳定一段时间。实际项目中,我们一般先用FPGA的ODDR原语把数据和DCI同步输出,然后在硬件上通过DCI delay寄存器微调DCI相位,找到最佳的采样窗口。如果相位偏了,症状就是DAC输出噪声底抬升、波形杂乱,甚至完全无输出,但用示波器看单端波形又觉得数据是对的。

// Xilinx 7系列中的ODDR输出示例,产生DCI和数据 ODDR #( .DDR_CLK_EDGE("SAME_EDGE"), .INIT(1'b0), .SRTYPE("SYNC") ) dci_oddr ( .Q(dci_p), .D1(1'b1), // DCI在上升沿后为高 .D2(1'b0), // 下降沿后为低 .C(dci_clk), .CE(1'b1), .R(1'b0), .S(1'b0) ); ODDR #( .DDR_CLK_EDGE("SAME_EDGE"), .INIT(1'b0), .SRTYPE("SYNC") ) data_oddr_inst ( .Q(data_p[0]), .D1(tx_data[0]), .D2(tx_data[1]), .C(dci_clk), .CE(1'b1), .R(1'b0), .S(1'b0) );

FPGA约束里有一项容易漏掉:LVDS差分对的等长约束。PCB上对内等长要控制在5mil以内,DCI时钟到各数据lane的等长控制在50mil以内。有人会觉得5mil太苛刻,但对于600Mbps以上的LVDS信号,这个要求其实很合理。等长控制不好,数据和DCI之间的相位差会在不同通道之间变化,结果就是某些bit误码率特别高,而且这种问题用示波表在板子上很难抓,因为波形宏观上看起来是好的。

另外,每条LVDS差分对在接收端都要加100Ω终端电阻,靠近DAC的输入引脚放置。这个终端电阻一是匹配传输线阻抗,二是给LVDS接收器提供直流工作点。有些FPGA内部可配置差分终端,但如果经过连接器或者较长的走线,我倾向于在DAC侧外部再放一个,电器上更可靠。

4. 从FPGA到DAC输出:一次完整的调通流程与验证手段

把SPI和LVDS分开看都不难,难在把它们串起来调通。我的调通流程是固定的,每次都有效。第一步,上电后先不写任何寄存器,直接读芯片ID,确认SPI物理链路OK。第二步,配置时钟和插值,先不使能DAC输出,只把FPGA到DAC的LVDS链路打通。第三步,FPGA发送斜坡数据,DAC配置成输出数据直通模式,用示波器看模拟输出是不是一个干净的正向斜坡。第四步,换成正弦波查找表,用频谱仪看单音频谱质量。

FPGA内部的数据生成建议先用斜坡而不是正弦,因为斜坡能直观反映数据位有没有错乱。如果LVDS Lane映射或位序错了,斜坡会变成乱序跳变,示波器上一眼就能看出来。正弦波如果位序错误,看起来可能还是正弦,但频谱上会有大量杂散,反而不容易定位。等斜坡完全正常了,再切到正弦做频谱指标验证。

AD9122的数据格式也值得多说一句。它支持二进制补码和偏移二进制两种输入格式,配置错了最典型的症状是输出波形整体偏置或者看起来像削波。比如你发一个满幅正弦的补码数据,但寄存器里设成了偏移二进制,DAC的输出会在零点和满幅之间上下跳动,而不是对称的正弦。这个问题在寄存器配置阶段就能规避,但很多人没注意,浪费了不少时间。

验证手段方面,示波器看时域,频谱仪看频域,两者缺一不可。时域上看的是波形形状、幅度、是否有毛刺;频域上看的是基波、谐波、杂散,尤其是SFDR和无杂散动态范围。DAC输出是差分电流,接法一般是经过变压器转成单端再进频谱仪,或者直接跨接电阻用差分探头测。如果用变压器,要注意变压器的带宽是否覆盖目标信号频率,很多低频测试用的小变压器在几百兆赫兹就衰减得很厉害。

AD9122还内置了一些数字测试模式,可以在不依赖FPGA数据的情况下让DAC输出固定的测试码型,比如全0、全1、交替码、伪随机码等。调试时先把这些内置模式跑一遍,能快速确认DAC本身的数据通路和模拟输出是不是好的,再把问题范围缩小到FPGA到DAC的LVDS接口上。这个思路和排查通信链路时先做自环测试是一样的逻辑。

5. 高速接口的布线与电源细节:高不成低不就的坑都在这

SPI和LVDS配置层面都搞定之后,如果输出频谱不好看,大概率问题在布线和电源上。高速DAC对电源噪声极其敏感,尤其是模拟电源。AD9122内部有数字、模拟、时钟等多个电源域,PCB设计时最好每个电源域都单独用磁珠或LDO隔离,去耦电容按照手册要求放在对应的电源引脚附近。

时钟质量对DAC输出频谱的影响往往被低估。DAC采样时钟上的抖动会直接调制到输出信号上,表现为近端相噪恶化。所以给AD9122的采样时钟一般不建议直接从普通晶振接过来,而是用专门的时钟发生器或PLL芯片产生低抖动时钟。我自己踩过一回,用了一颗FPGA内部PLL分出来的时钟当DAC采样时钟,结果输出信号的相噪明显很差,换成独立时钟源后立刻改善。

模拟输出部分的布局同样关键。AD9122的输出是差分电流,通常通过变压器或差分放大器转成单端信号。变压器下方的地层要完整,次级侧的50Ω走线要短,尽量直接进连接器。如果走线太长,高频信号的插损和反射都会影响平坦度,频谱仪上看到的就是高频段滚降严重。

LVDS数据线的走线尽量放在内层,靠近完整的地平面,避免跨分割。差分对内等长前面说过了,还有一个容易忽略的是组间等长,也就是DCI时钟与所有数据线之间的长度差。这个偏差会转换成DCI与数据的相位差,直接影响建立保持时间裕量。做板时如果发现长度差的余量不够,优先保证DCI到每条数据线的一致性,其次再照顾数据线之间的相对偏差。

电源去耦的位置也很讲究。数字电源引脚附近的去耦电容可以用0402封装尽量靠近引脚,模拟电源和时钟电源的去耦要综合考虑电源完整性。有条件的话,在原理图阶段就给每个电源域留好测试点,调试时用示波器量纹波,能快速判断噪声是否来自电源。我见过不少DAC输出杂散异常的案例,最后都是电源纹波超标导致的。

6. 实际项目中踩过的几个坑与最终的稳定配置参考

调试这几个月,有几个坑印象特别深。第一个坑是SPI读回不一致。代码看起来写对了,逻辑分析仪抓波形也正常,但读回来的ID偶尔是错误值。后来发现是SPI的时钟线在PCB上走得太长,SCLK信号发生了振铃,上升沿附近有毛刺,导致DAC偶尔多采一个时钟。解决办法是在SPI时钟线上串了一个22Ω电阻,抑制过冲,现象立刻消失。所以SPI这种低速接口,在高速电路板上也不能掉以轻心。

第二个坑是DAC输出固定在一半满幅附近,上电后无论FPGA发什么数据都没反应。查了一圈发现是LVDS的DCI时钟没配置使能,AD9122没有DCI就锁存不到数据,自然没有输出。这类问题说穿了很简单,但排查时容易绕远路。现在我每次初始化完成后都会读一遍关键寄存器,确认DCI使能位确实置上了,不靠肉眼猜。

第三个坑是数据错位。用斜坡测试时,波形看起来像锯齿但顺序不对,一段上升一段跳变。原因是FPGA内部的数据位序和AD9122期望的Lane映射不一致。D0P/N接到FPGA的哪个引脚,软件里对应的bit又是哪一位,这三者必须一一对应。我后来专门画了一张引脚映射表,从FPGA顶层端口到物理引脚,再到DAC引脚号,一张表对照着填,再也没出过这类问题。

稳定配置的参考值如下表,适合通用的单音正弦输出测试,具体项目请以手册为准调整:

功能寄存器地址(示例)配置值(示例)说明
芯片ID0x02读回0x82验证SPI通信
时钟使能0x100x01使能DCI
插值倍数0x200x012x插值
LVDS配置0x1E0x414-Lane、16bit
数据格式0x2F0x01二进制补码
输出电流0x250x1F最大满量程
DAC使能0x2A0x01开启输出

根据我个人经验,调AD9122最忌讳一上来就堆配置代码。先把时钟频率表格画出来,再确认SPI物理链路,然后LVDS数据格式和时序,最后才是模拟输出和频谱指标。每个阶段都留好验证点,出了问题能快速定位到某个层面。这套方法论不仅适用于AD9122,其他高速DAC或者高速ADC的调试基本也能套用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询