1. 为什么我建议每个SDR开发者都吃透AD936x评估软件
做软件无线电这些年,我见过太多人拿到AD936x评估板之后的第一反应是——先把Linux驱动跑起来,然后直接调API。结果十有八九会在射频指标上栽跟头:要么发射频谱带着一堆杂散,要么接收灵敏度比手册标称值差好几个dB。问题往往不是出在驱动或者应用代码上,而是你压根没搞懂射频前端到底被配置成了什么状态。
AD936x Evaluation Software(也就是通常说的AD936x评估软件)存在的意义,就是把芯片内部那些上百个寄存器映射成一套可视化的配置界面,让你在不用写一行代码的情况下,先把整个射频链路的状态摸清楚、调明白。它不仅是评估板的配套工具,更是一面能照见芯片内部真实工作状态的镜子。
这篇文章我会基于实际使用经验,从寄存器设置到滤波器优化这条主线,把评估软件里最常用的配置路径、最容易踩的坑、以及从评估状态迁移到自研板卡时必须注意的细节一次讲清楚。无论你是刚接触Zynq+AD936x组合的初学者,还是已经在产品里用上这片子但总感觉指标差口气的老手,这篇内容都值得你花十五分钟看完。
2. 打开软件之前:硬件连接与软件版本匹配
2.1 评估板的连接方式
AD936x评估套件通常由射频子板(比如AD-FMCOMMS2/3/4/5)和对应的FPGA/SoC基带板组成。最常见的组合是AD-FMCOMMS3-EBZ配上ZedBoard或者ZC706。连接的时候要注意几点:
- 必须使用配套的12V电源适配器,不要试图通过JTAG或者USB取电,满载工作时电流可能超过1A,USB供电会直接导致电压跌落,进而让AD936x的LDO输出异常,表现就是软件里能识别到芯片但SPI读写超时。
- Jumper的设置要跟软件里的预期一致。尤其是AD-FMCOMMS3板上的FMC供电选择,如果FPGA板卡需要从FMC接口取电(有些第三方板卡不支持),那就必须把对应的跳线帽插到正确位置。
连接完成之后,用USB线把FPGA板的UART口连到电脑(注意不是JTAG口),打开设备管理器确认一下虚拟串口的COM口号,后面软件连接要用。
2.2 软件版本和驱动安装
AD936x Evaluation Software有Windows版本和Linux版本。Windows版本最省事,安装包在ADI官网的AD936x评估软件页面下,下载之后直接下一步,它会顺带装上USB驱动程序。
有一个非常容易忽略的细节:评估软件和板载HDL工程的版本要匹配。ADI官方提供的HDL工程在某个版本之后,对SPI寄存器映射做了调整(尤其是涉及多芯片同步和BIST相关的寄存器地址),如果你用新版本软件去连旧版本的HDL工程,软件可以打开,但读出来的寄存器值要么全零要么全是0xFF,点任何按钮都没有反应。
提示:拿到评估板之后,先去releases页面确认当前HDL工程版本,再下载对应版本的评估软件,避免"连不上"的假故障。
我自己的经验是,在Windows下用官方最新版HDL工程的时候,配套使用ADI官网同一个release tag下打包的评估软件,一次性连接成功率最高。如果你一定要混搭版本,至少确认一下SPI读写测试能通过再往下走。
2.3 连接流程
软件打开之后,选择对应的串口(COM号),波特率默认115200,点Connect。正常情况下软件右侧的状态栏会显示AD936x的DEVICE ID和硅片版本号(比如Silicon Rev 2),这说明SPI通信已经建立。
如果连接失败,按这个顺序排查:
- 板卡是否上电,电源指示灯是否亮起
- USB串口驱动是否正确安装(设备管理器里有没有感叹号)
- 软件里选的COM口是否正确
- HDL工程烧录的是不是带有adi_ad936x_ip核的版本
3. 寄存器设置不是抄手册:理解配置块的联动关系
3.1 从tDD还是FDD模式开始
打开评估软件,最先面对的是配置主界面。这里有一个总控开关:FDD还是TDD。很多人随手选一个就开始调,但这个选择直接影响后续所有寄存器配置的联动关系。
- FDD模式下,收发链路同时工作,本振频率由RX和TX各自独立配置,滤波器带宽也是独立设置的。
- TDD模式下,收发分时工作,但有一个关键选项叫"TX/RX LO Sharing",也就是收发共用一个本振。
如果你用的是TDD模式但选错了FDD,最直接的现象是LO频率设置界面会多出一组"针对RX/TX独立设置"的选项,这本身不影响正常工作,但在后续做多芯片同步或者基带算法切换时,TDD的时序控制寄存器不会被正确配置,可能导致GPIO控制的收发切换信号没有真正连到AD936x内部状态机上。
我建议:从场景需求出发选模式,而不是从个人习惯出发。做FDD LTE类应用就选FDD,做TDD雷达或者跳频通信就选TDD。评估软件里有一个"Mode"下拉框,选完之后下面的RF Band、LO Frequency、Baseband Filter等参数会自动显示当前模式下的可配置范围,这个联动关系就是寄存器组被自动设置了。
3.2 频率设置与PLL锁定状态
在RF Settings页面里,RX和TX各有一个LO Frequency。这里输入的频率是实际载波频率,软件会根据AD936x内部的LO分布参数自动计算VCO子频段、分频比、电荷泵电流等寄存器值。
有一个非常关键的显示项:LO Locked状态指示灯。设完频率之后,看一眼这个灯是否变绿。如果显示红色或者一直闪烁,说明PLL没有锁定。常见原因有三个:
- 参考时钟频率设置有误。AD936x评估板上默认参考时钟是40MHz(FMCOMMS3板载TCXO或者由FPGA提供),软件里Reference Clock这一栏必须和板子实际使用的参考频率一致,否则VCO校准会失败。
- 频率设置超出了当前频段下VCO的可覆盖范围。AD936x覆盖70MHz到6GHz,但内部VCO的工作范围是6GHz到12GHz(通过分频),软件在选择频率后会自动计算是否合法,如果你在某个频段边缘反复尝试都无法锁定,先看看是不是频率落到了"需要改变LO分频模式"的边界上。
- 供电异常。PLL锁定需要干净的模拟供电,如果你用劣质USB转串口线供电(评估板的模拟部分已经从LDO稳压,一般不受影响),但如果是自研板卡,一定要检查VCO供电引脚上的纹波。
PLL锁定是整个射频链路正常工作的前提。寄存器设置里有大量与频率相关的参数,比如VCO Calibration、Charge Pump Current等,但绝大多数情况下用软件默认的自动模式就够了,手动覆盖这些值需要你对AD936x内部PLL构架有足够深的理解,否则很容易把锁定的裕量调没。
3.3 增益与衰减:用一个具体案例搞懂链路预算
寄存器设置里还有一个高频使用项——RX的增益控制(RX Gain)和TX的衰减(TX Attenuation)。
在评估软件上,RX Gain有几种模式:
- MGC(手动增益控制):直接写增益值
- AGC(自动增益控制):由芯片内部状态机自动调整
调试的时候建议先用MGC,手动设置一个固定增益,这样方便你看清每个模块的输出状态。比如我常用的一个做法:
- 信号源输出-30dBm的单音信号到RX输入
- RX Gain Mode设为MGC,增益值从0dB开始每次增加6dB
- 观察RX RSSI读数(软件里可以直接看)
- 当增益加到某个值之后,RSSI读数不再线性增长,说明进入饱和区
这个"拐点"对应的增益值,就是当前输入功率下的最大可用增益,超过这个值只会增加失真不会增加有效信号强度。
这个测试结果可以反推链路预算:-30dBm输入时,若拐点在30dB增益处,那么进入ADC前的信号电平约在-30+30+基带增益(假设0dB)约等于0dBFS附近,已经接近满量程。如果你想在AGC模式下给ADC留6dB的headroom,那么AGC的max gain上限就应该设定在24dB左右。
TX侧则更简单直观:TX Attenuation值越大,输出功率越小。寄存器层面它控制的是TX链路上衰减器的衰减量,从0到89.75dB,步进0.25dB。在做发射指标测试时,先把衰减值设到40dB以上,再慢慢减小,这样即使意外接错负载也不至于立刻烧毁PA(AD936x内部PA本身就是小功率,但外部板卡上的PA就另说了)。
3.4 不常碰但很重要的寄存器区域
评估软件里还有一个"Advanced"或"Register Map"类的视图,可以直接读写单个寄存器地址。很多人用不到就不管了,但以下几个区域建议你了解一下:
- 0x010~0x01F:状态和控制寄存器,包括SPI配置、时钟分频等
- 0x2A0~0x2E0:TDD时序控制,涉及TX/RX切换的延时时序
- 0x3F0~0x3FF:BIST(内建自测试)相关,产线测试常用
- 0x290~0x293:辅助DAC输出控制,可以输出直流电平控制器件或LED等
实际做产品时,你会需要这些寄存器来做一些评估软件界面上没有暴露的功能,比如调整一个辅助DAC让外部LNA的增益控制引脚得到特定的电压值。界面上可能没提供,就必须在寄存器级别操作。这也是为什么我说评估软件不只是配置工具,更是学习手册的活教材——你想了解某个寄存器,直接在软件里改,观察现象,比干读datasheet效率高得多。
4. 滤波器优化:基带滤波器、抗混叠与插值/抽取的配合
4.1 滤波器参数的界面映射
AD936x的接收通道和发射通道里各有一个可编程的基带低通滤波器,评估软件里对应的是"Baseband Filter"或者"TX/RX Filter"设置项。具体表现是有一个"Filter Bandwidth"输入框,单位kHz或MHz。
这个低通滤波器的作用从名字就能看出来——把混频之后的有用信号带宽限制在预期范围内,同时衰减带外噪声和干扰。但很多人有一个误解:只要把Filter Bandwidth设成跟信号带宽一样就行了。实际上AD936x内部是模拟滤波器(连续时间)和数字滤波器(FIR/半带,离散时间)级联工作的,而界面上你设置的"Baseband Filter"带宽,最终会被解释成一组模拟滤波器调谐参数和数字滤波器系数。
这就解释了一个常见现象:你在评估软件里把滤波器带宽从10MHz改成20MHz,但实际测量时发现通带纹波和群延迟特性变化比想象中明显。因为这不仅仅是"滤波器更宽了",而是内部数字抽取/插值率和FIR级数可能都被重新分配了。
4.2 采样率与滤波器带宽的最佳配比
接收链路里有一个必须遵守的关系:
ADC采样率 ≥ 2 × 基带滤波器带宽 × 额外过采样系数
AD936x内部ADC最高采样率是640MSPS(在某些配置下可能低于这个值,取决于LVDS/CMOS接口位宽和速率),但通常我们工作在61.44MSPS或者更高一些的速率下。当基带滤波器带宽设置得很高时(比如40MHz),而ADC采样率只有61.44MSPS,那滤波器边缘就会非常贴近奈奎斯特边界,过渡带急剧收窄,滤波器阶数被迫抬高,群延迟增大,通带纹波也会变差。
建议的经验法则是:
| 信号带宽 | 推荐基带滤波器设置 | ADC采样率 | 备注 |
|---|---|---|---|
| 5MHz LTE | 5.5~6MHz | 30.72MSPS | 留0.5~1MHz过渡带 |
| 20MHz带宽 | 20.5~21MHz | 61.44MSPS | 常见默认配置 |
| 40MHz带宽 | 40.5~41MHz | 122.88MSPS | 需要高速LVDS模式 |
这个比值不是随便拍的。模拟滤波器滚降(典型为3到5阶巴特沃斯或者切比雪夫)在通带边缘有一个过渡区,而数字FIR可以在通带边缘做更陡峭的滚降,但代价是较大的处理延迟。评估软件里有实时的频率响应预览图,你可以很直观地看到设完参数后滤波器的幅频响应曲线,建议在优化时多看这个图。
4.3 一个量化实例:优化20MHz LTE信号的EVM
有一个实际案例可以说明滤波器优化的作用。一个20MHz带宽的LTE信号,我初始设置基带滤波器带宽为20MHz,ADC采样率61.44MSPS,测得的EVM约3.2%。对于LTE来说这个值已经很不错,但我想压到2%以内。
第一步,评估软件中把RX Baseband Filter带宽从20MHz降到19MHz,同时保持ADC采样率不变。理论上信号边缘子载波会被衰减,但实际上因为滤波器是"砖墙+滚降"的综合响应,LTE有用信号仅在边缘有少量功率分布,这个衰减对EVM的影响很小,反而是带外噪声被压掉不少,EVM降到2.8%。
第二步,提高ADC采样率到122.88MSPS,同时把基带滤波带宽调回20.5MHz。此时信号的频谱被更宽松地容纳,模拟滤波器的滚降裕量更大,带内平坦度提升,EVM进一步降到2.2%。
第三步,启用数字FIR预加重(如果AD936x支持FIR使能,评估软件里有对应选项),额外对带内纹波做校准,最终EVM稳定在2.0%左右。
这个案例的核心思路是:不要死守着"滤波器带宽=信号带宽"的公式,给过渡带留点裕量,让模拟滤波器和数字FIR分工合作,才能既保证带内质量又兼顾带外抑制。
4.4 发射链路的滤波器配置:镜像抑制与频谱纯净度
发射侧同样有基带滤波器,但它的作用除了限制信号带宽,还有一个关键点是抑制DAC产生的镜像频谱。
AD936x的DAC工作在高采样率下,数字上变频会把基带信号搬移到中频或者射频,而DAC的零阶保持效应会产生以采样率整数倍为间隔的镜像频谱。发射基带滤波器需要和数字上变频的插值滤波器配合,把DAC输出端的镜像频谱压到指标以下。
实际操作中,评估软件里TX Filter Bandwidth的设置同样影响着DAC采样率的选择和插值倍数。我遇到过这样一个问题:发射单音信号时,输出频谱在偏离载波一个采样率的位置出现了一个-40dBc的杂散,怎么调PA偏置都没用。后来在评估软件里把TX Filter带宽从原来的8MHz改成6MHz,同时调整TX采样率,镜像频谱直接被压到了-60dBc以下。这就是数字插值滤波器重配后对镜像抑制起的作用。
4.5 滤波器系数的导出与自研板卡烧写
评估软件的最大价值之一是能导出实际的滤波器配置参数。在Filter设置界面里,通常会有一个"Export"或者"Generate Register Values"按钮,点击之后会把当前所有滤波器相关的寄存器值生成一个表,或者直接生成一个C头文件。
这些导出的参数可以用在自研板卡的驱动里。比如你在评估板上花了两小时调试出了一组最优的滤波器配置,如果不导出,自研板卡上就要重新调一遍,而且很可能因为你使用的驱动版本不同,寄存器默认值不一样,导致效果差异。直接导出寄存器值,在Linux驱动里通过ad9361_do_multi_write或者类似的接口一次性写入,就能完美复现评估板上的滤波特性。
注意:导出寄存器值时要确保导出的是完整的滤波器配置组,不要只导出Filter Bandwidth一个参数。AD936x的滤波器配置涉及几十个寄存器的联动,少一个都可能让模拟滤波器的RC常数和数字滤波器的系数失配。
5. 从评估到量产:寄存器配置的固化与验证
5.1 把软件配置变成产品代码
当你在评估软件里完成了所有参数调整,下一步就是把配置迁移到实际产品中。这个迁移有三种层级:
- 用ADI提供的no-OS驱动API逐个写入参数,代码里调用ad9361_set_rx_rf_bandwidth、ad9361_set_tx_attenuation这样的函数
- 把评估软件导出的寄存器dump文件,直接通过SPI在初始化阶段批量写入
- 在设备树或驱动配置文件中使用ADI提供的标准属性
三种方式各有适用场景。我强烈建议:开发初期首选方式1,量测试产线用方式2,Linux驱动环境下优先使用方式3。
道理很简单:方式1能让你在代码里保留参数的语义化命名,后期调试容易定位问题;方式2效率最高,但可读性最差;方式3适合ZynqMP平台,但不适用于所有自定义的基带处理器。
5.2 校准数据的处理
AD936x在出厂时每一颗芯片都有独立的校准数据,存放在芯片内部的Efuse(一次性可编程存储器)里。这些校准数据包括发射功率检测校准、接收RSSI校准、温度传感器校准等。评估软件在与芯片建立连接时,会自动读取这些校准数据并加载到芯片内部的寄存器里。
自研板卡上,Linux驱动启动时同样会自动加载这些校准数据。但有一个坑:如果你在评估软件里手动修改了某些校准相关的寄存器(比如Tx Attenuation的0.25dB步进微调值),导出寄存器的时候会把原始校准值覆盖掉,量产时就会导致每一颗芯片的功率检测值不一致。
正确的做法是:
- 评估阶段可以随便调,但导出量产配置时,应该用"校准寄存器保持默认、只导出功能配置"的模式
- 在量产固件里,不要直接覆盖Efuse区域
- 如果需要在产品里微调某一颗芯片的增益,应该通过驱动接口里的校准偏移字段实现(比如rx_gain_offset、tx_atten_offset),而不是修改AD936x的校准寄存器
5.3 版本管理与回归验证
最后说一个经验总结。AD936x评估软件和HDL工程的版本迭代速度不慢,今天调好的寄存器配置,三个月后在新版软件里打开,可能因为界面布局改变或者寄存器地址调整导致配置对不上。
我在团队里推动了一套简单的管理方式:每次完成一版配置优化,就在评估软件里导出一个完整的寄存器dump文件,同时附带一份markdown说明,记录当时的信号参数、EVM/RSSI测试结果、软件版本号、HDL工程commit号、板卡批次编号。积累下来之后,任何一次指标回归,都能快速定位是硬件批次差异、驱动改动还是配置漂移造成的。
这套方法不复杂,但确实帮我省掉了无数次重复排查的麻烦。
6. 写在后面:调试过程中的一个小忠告
说到这,最后分享一个我自己的习惯。每次在评估软件上完成一组配置调整,我都会用频谱仪或者信号源做一个闭环验证,绝不相信界面显示的正常就收工。软件显示LO Locked、AGC已收敛、滤波器已更新,这些只是寄存器层面的状态,不代表射频端口上的真实物理效果。
有一次我在评估软件上看到RX RSSI读数一直很理想,但实际解调出来的星座图全是噪点,最后排查发现是GPIO控制的RX/TX切换开关没接对,评估板上的射频开关把信号直接引到了外部端口而不是板载ADC。这种问题在软件界面里根本看不出来,只能靠外部仪器做最终判定。
所以,评估软件是一个强大到让人安心、但永远不能替代射频测量的工具。把软件用熟,把寄存器的联动逻辑吃透,再拿仪器实测来兜底,这才是AD936x开发的正确姿势。