☰
ADRV902x评估板实战:ARM bin生成与JESD204C配置详解
2026/10/5 2:54:16 网站建设 项目流程

手上这块ADRV9026评估板(ADRV902x系列)在实验室趴了几天,终于把JESD204C链路真实跑通。整个过程里,最让人困惑的不是射频指标,反而是看上去最简单的两件事:怎么用TES GUI生成ARM bin文件,怎么生成一份靠谱的JESD204C配置文件。网上资料不少,但多数在讲“点哪个按钮”,很少有人讲清楚“为什么要这样生成、生成的文件到底被谁用了、和FPGA侧怎么对齐”。这篇文章从我实际调试的视角,把ADRV902x评估中这两块拆开讲一遍,涵盖硬件连接、TES配置、ARM固件生成、JESD204C参数计算,以及我踩过的几个坑。适合正在做射频收发链路、FPGA高速接口,或者刚拿到ADRV902x评估板的工程师参考。

1. ADRV902x评估方案整体拆解

1.1 ADRV902x到底是什么样的芯片

ADRV902x系列是ADI面向基站和无线电应用推出的宽带收发器,典型代表有ADRV9025、ADRV9026和ADRV9027,覆盖大概75 MHz到6 GHz频段,单芯片集成4路发射、4路接收、ORX观测通道,以及DPD、CFR这些算法需要的路径。之所以在评估阶段要花大力气处理ARM bin和JESD204C配置,是因为这颗芯片不是简单“寄存器一配就能出数据”的器件,它内部有一颗ARM处理器负责上电初始化、校准、DPD系数计算和状态管理。

也就是说,ADRV902x是典型的“软件定义射频”芯片:模拟前端、数字上下变频、滤波、增益控制都集成在内部,而外部主控通过SPI访问寄存器和ARM处理器配合工作。这个架构带来的一个直接结果就是——你绕不开ARM固件,绕不开一串精心组织过的初始化参数。

Hmm,看到这里有些朋友可能会问:既然是评估板,直接跑ADI官方例程不是就完了吗?我的回答是:官方例程能让你“看灯亮”,但如果你的应用需要改采样率、改JESD204C lane数、改射频频率,或者要把这套东西搬到自己的FPGA工程里,就必须理解TES生成的ARM bin和profile配置是怎么流动的。否则出了问题,只能干瞪眼。

1.2 评估系统的组成:不只是“板子+PC”

ADRV902x评估系统一般由三部分构成:ADRV902x评估板、FPGA/数据采集板、以及PC上运行的TES软件。评估板通过FMC或HPC接口与FPGA相连,FPGA主要承担JESD204C链路的物理层和协议层处理,把ADRV902x送出的高速串行数据转换成并行数据,再交给上层做信号处理。

这里有个很多人容易忽略的点:ADRV902x和FPGA之间的链路是JESD204C,而不是普通并行总线。JESD204C一条lane的速率动辄上Gbps甚至十几Gbps,所以FPGA侧的JESD204C IP核配置必须与ADRV902x侧完全一致,否则两端各干各的,链路永远锁不上。这也是为什么TES生成的配置文件如此重要——它不是给人看的,是给两台设备“对齐语言”用的。

PC上的TES扮演三个角色:第一,通过USB转SPI接口直接读写ADRV902x寄存器,让你看到内部状态;第二,提供一个图形化界面,把复杂的PLL分频、JESD204C参数映射、DPD开关等配置项简化成下拉菜单;第三,生成最终的ARM bin和配置数据,供你在正式系统里加载。一句话总结:TES既是你调试时的“仪表盘”,也是你量产配置的“源头”。

1.3 为什么必须先想清楚“bin”和“配置”的关系

ARM bin和配置文件是两样东西,但很多人喜欢把它们混在一起说。ARM bin是ARM处理器上运行的可执行镜像,里面是实现上电校准、处理API请求、执行DPD/CFR算法的代码;配置文件则是一组描述“器件工作在什么状态”的参数,比如本振频率、增益、采样率、JESD204C的LMFS、SYSREF设置等等。

打个比方:ARM bin是“操作系统”,配置文件是“应用程序的参数”。操作系统负责管理硬件资源,而参数决定系统跑多快、跑什么应用。所以实际加载顺序一定是:先让ARM核跑起来(加载bin),再通过API逐项下发配置。如果你只改了配置文件却没更新ARM bin,或者ARM bin版本太老不认识新配置字段,就会出现各种奇怪的初始化错误。这个我在后面的排查章节会详细展开。

2. 环境搭建与连接检查

2.1 硬件准备清单

ADRV902x评估的环境准备其实比想象中琐碎。我在这块踩过最大的坑就是“少根线/选错时钟”导致的误判。建议按下面的清单逐项确认:

  • ADRV902x评估板(我这里用的是ADRV9026-EVAL)
  • 配套FPGA板,比如Xilinx ZCU102、KCU105,或者ADI的HSDC采集卡
  • 评估板原装电源适配器(注意电压电流,别用实验台可调电源乱怼)
  • USB线,用于TES与评估板的SPI/串口通信
  • 可选:高性能信号源,用于注入射频信号验证收发链路
  • 可选:频谱仪或示波器,检查时钟和射频输出
  • 时钟源或评估板上的板载参考时钟(常见是10 MHz/100 MHz/122.88 MHz等)

我自己的建议是:第一次上电尽量用评估板默认配置,包括板载参考时钟,不要一上来就外接时钟源。很多板子对外部时钟的驱动电平和幅度有要求,USB供电不稳或者时钟源输出幅度不对,会直接导致PLL失锁,而新人在这个状态下很容易把问题归咎于配置文件。

2.2 TES软件安装与版本匹配

TES全称是Transceiver Evaluation Software,在ADI官网注册后就可以下载。当前ADRV902x系列的TES版本和旧的AD937x系列已经不共用了,安装的时候注意选择ADRV902x对应的版本。

这里要强调一个项目上很容易掉的坑:TES版本、评估板硬件版本、以及你使用的Linux驱动版本,三者要尽量匹配。我有一次在旧版TES里配置好JESD204C参数,导出给新版Linux驱动用,结果驱动直接报ARM固件校验失败。后来查证是旧版TES生成的ARM bin缺少新版固件要求的某个校验段,驱动加载时拒绝执行。

所以,拿到板子第一件事,不是去TES里乱点,而是先去ADI官网确认你这块板子的硬件修订版(板子上一般有丝印REV),再下载对应版本的TES和固件包。软件安装过程基本都是下一步下一步,唯一要注意的是USB驱动:有的Windows系统需要手动安装FTDI虚拟串口驱动,否则TES里识别不到设备。

2.3 上电前的检查清单与常见失误

在按下电源键之前,建议花几分钟过一遍下面的检查项,能省下半天排查时间:

  • FMC接口是否插牢固,有没有歪针或接触不良——JESD204C高速信号对连接器接触非常敏感
  • 评估板和FPGA板的电源指示灯是否正常
  • USB线是否插到评估板的USB调试口,有些板子有多个USB口,别插错
  • 确认SYSREF信号的连接:如果用外部SYSREF,要接到指定SMA口;如果用板载,要确保跳线帽配置正确
  • 对照评估板原理图确认拨码开关设置,尤其是“ARM启动模式”和“接口电压选择”这一类关键开关

我见过最典型的低级错误是:评估板通过FMC连了FPGA板,但FPGA板没有单独上电,导致FMC接口上的JESD204C lane供电异常,ADRV902x侧怎么配置都锁不上链路。还有一个常见问题是SYSREF没接,TES配置里要求SYSREF使能,但硬件上根本没提供这个信号,结果链路反复在“link established”和“sync error”之间跳。

3. 用TES GUI生成ARM bin文件的核心流程

3.1 ARM bin在系统里的作用

有些人一听到“ARM bin”就以为要用交叉编译器自己编译,其实在ADRV902x评估流程里,很多情况下你直接用ADI预编译好的固件就行。ADI把这部分固件称为Arm binary,里面跑的是公司内部封装好的一套控制逻辑。

这套固件干了什么呢?简单说:ADRV902x上电后,内部的ARM核首先启动,执行一系列自检和校准算法,比如TX/RX的DC失调校准、I/Q失衡校准、本振泄漏校准,然后进入待命状态。外部主控通过API命令(本质上是一系列SPI读写操作)向ARM处理器下发配置,ARM处理器再把这些配置翻译成具体的寄存器写入序列。

所以,如果你自己写的驱动只操作寄存器,不借助ARM固件,理论上也能让芯片工作,但你会损失所有基于固件的校准算法和DPD功能,而且大量内部状态寄存器读不到正确的值。ADI官方驱动之所以稳定,是因为它严格遵守“API—固件—寄存器”的分层结构。

TIPS:在Linux驱动源码里,你经常会看到类似adi_adrv9025_arm_bin这样的数组或文件引用。这个文件就是我们说的ARM bin。它可能是独立文件,也可能被编译成C数组塞进驱动镜像里。

3.2 TES里创建工程与器件配置

打开TES之后,第一步是选择器件型号。ADRV902x系列中9025、9026、9027是不同的器件,初始采样率、ADC位宽不同,千万别选错。选好型号后,TES会自动尝试连接评估板,如果连接成功,主界面会显示芯片温度、PLL锁定状态、ARM处理器运行状态等信息。

连接之后,进入配置页面。这里主要设置以下几类参数:

  • 射频参数:本振频率、RX/TX带宽、增益模式(手动还是自动)、是否使能ORX
  • 时钟参数:采样率、参考时钟频率、内部PLL分频系数,以及JESD204C的device clock和SYSREF频率
  • 数字接口参数:JESD204B还是JESD204C、lane数量、是否是subclass 1、SYSREF触发方式等

这些参数看似独立,其实相互耦合。比如你改了采样率,PLL分频会自动重算,JESD204C的lane速率也会联动更新。我实际操作中喜欢“先从默认配置改最小变更”:比如只改本振频率,其他保持不变,先把链路跑通,再逐步调整采样率和lane数。

3.3 导出ARM bin的具体操作

配置参数调整完成后,需要把ARM固件和配置信息整理成文件。不同版本的TES界面会有差异,但大致路径是类似的:

  1. 在TES主界面找到“Load/Store”或“Firmware/ARM”相关菜单
  2. 选择“Load ARM Firmware”或“Load Binary”,此时TES会读取当前固件版本
  3. 如果需要导出,选择“Export”或“Save Binary”,指定保存路径和文件名,文件格式一般是.bin
  4. 如果只是测试,你也可以直接点“Download ARM”,让固件直接写入评估板上的器件SRAM运行,而不落盘

需要注意的是,导出的bin文件通常包含的是ARM核运行代码,不是你的应用配置。你的射频参数配置,是通过另一条路保存的:有些版本支持“Save Profile”导出成文本或XML,有些则需要你手工记录到驱动结构体里。后面第4章讲的JESD204C配置文件,就属于这个范畴。

我自己的习惯是:在TES里完成所有参数设置后,先点击“Save Profile”,再单独把ARM bin导出,两者分开存放。这样如果后续只需要调增益或频率,我就不用重新刷ARM bin,只需要修改配置参数即可。等于把“系统”和“配置”两部分解耦。

3.4 ARM固件版本不匹配的坑

前面说过,ARM bin版本必须和驱动、TES匹配。具体表现是:驱动加载ARM bin时,读回一个版本号,如果该版本号与驱动源码里定义的预期版本不一致,驱动会打印类似ARM firmware version mismatch的日志,然后拒绝继续初始化。

解决思路很明确:在驱动源码中找ADI_ADRV9025_FW_VERSION这类宏(具体型号会不同),再看ADI提供的固件包里对应的版本号,如果两者不一致,优先升级驱动到与固件匹配的版本。不要为了兼容旧驱动去手动patch固件校验段,那属于拆东墙补西墙。

另外提醒一点:在把ARM bin放到目标板文件系统之前,最好用md5sum算一下哈希,确保文件传输过程中没有被截断或损坏。传输到嵌入式设备后,有条件的再做一次校验,因为一些老旧的TFTP/FTP工具在传大文件时会有字节丢失。

4. JESD204C链路参数计算与配置文件生成

4.1 JESD204C相对JESD204B改了些什么

JESD204协议是ADC/DAC和FPGA/ASIC之间的高速串行接口标准,B版用的是8B/10B编码,C版改用64B/66B编码。这个改变带来的直接好处是编码开销大幅下降:8B/10B的额外开销是25%,64B/66B只有3%左右,所以JESD204C能在同样的有效数据速率下用更低的物理线速率,或者同样的物理线速率下承载更多的数据。

除此之外,JESD204C还引入了前向纠错FEC、更强的确定性延迟机制、多链路绑定等功能。对ADRV902x这类需要高采样率和多个收发通道的器件来说,JESD204C几乎是必然选择。当然,代价是链路调试复杂度增加——64B/66B对时钟抖动和信号完整性更敏感,PCB走线和连接器质量稍有波动,都可能导致误码。

用后端开发的话来说,JESD204B像是HTTP/1.1,协议文本清楚但头信息开销大;JESD204C像是HTTP/2,更高效但也引入了更复杂的lane管理。配置文件的概念也一样:你见过logback.xml、nginx.conf、fstab这些配置,射频领域同样有一套“配置”,只不过它是以C结构体、二进制参数块或者寄存器地址序列的形式存在。

4.2 配置文件里到底有什么

一份完整的JESD204C配置文件,在ADRV902x场景下基本围绕下面这组参数展开:

  • M:转换器数量。注意这里是“转换器”不是“通道”,因为I/Q复数信号下,一个物理通道对应两个转换器
  • L:JESD204C lane数量,决定用几条高速串行线把数据搬出去
  • F:每帧的字节数,和单lane承载的转换器数量、样本宽度相关
  • S:每个转换器在每帧里的样本数
  • N / N':每个样本的实际有效位宽和经过填充后的位宽(比如14位ADC,可能N=14,N'=16)
  • K:多帧长度,和链路同步、确定性延迟有关
  • 参考时钟频率、SYSREF频率、device clock频率
  • 链路线速率(lane rate),单位bps

组帧公式看起来吓人,但实际上TESt和ADI驱动都帮你做好了计算,你只需要搞清楚原理,以便在两个配置文件不一致时能快速判断哪个参数出了问题。

4.3 lane速率的推算思路

我拿ADRV9026一个比较典型的配置举例:假设ADC/DAC采样率为245.76 MSPS,4发4收全开,I/Q复数信号,那么转换器数量M=8(RX侧),N'=16,L=8条lane。

先算总有效数据速率:

总有效比特率 = fs × M × N' = 245.76M × 8 × 16 = 31.46 Gbps

8条lane每条的有效数据速率:

单lane有效速率 = 31.46 / 8 = 3.93 Gbps

加上JESD204C 64B/66B编码开销:

实际线速率约等于 3.93 × 66/64 ≈ 4.06 Gbps

这个4.06Gbps就是你在Xilinx JESD204C IP核里需要配置的lane rate估计值。真实工程里还会有对齐标记、同步开销等,所以TES自动算出来的实际值可能比这个公式略高一点,但量级不会差太多。这个计算方法能帮你快速判断:如果你在FPGA侧看到要求的lane rate和我算出来的差了一个数量级,那大概率是M或L配置理解错了。

4.4 从TES生成并导出JESD204C配置

在TES的JESD204C页面里,一般会有如下选项:

  • 接口标准选择:JESD204B / JESD204C
  • LMFS模式选择:有些版本直接提供预设,比如4L8F1S、8L4F1S等
  • lane速率显示和参考时钟频率输入
  • SYSREF使能和频率设置,以及multiframe trigger等高级选项
  • ORX是否参与JESD204C链路,如果要同时传输ORX数据,会挤占lane资源

把这些参数选好后,TES会重新计算PLL和时钟分频,并显示最终的lane rate。此时你可以把整个配置导出。需要注意的是,导出结果不一定是一个完整可直接运行的配置文件,有时候只是生成一段配置参数列表,你需要手动把它填到Linux驱动的profile结构体里。

具体到ADI的Linux驱动(adi_adrv9025.c等),JESD204C参数一般定义在类似adi_adrv9025_rx_profile的结构体中,包含deviceClock_kHz、laneRate_kbps、lmfs之类的字段。你如果从TES导出了参数,就把这些字段按照驱动代码里的注释逐个填上。还有一个更省事的方法是:ADI的repo里通常会针对不同评估板提供现成的profile,你只需要确认与自己的采样率和lane数一致即可。

4.5 配置文件与FPGA侧的“对齐”问题

这是整个JESD204C调试中最重要的一个环节,也是新手最容易忽略的:ADRV902x侧配置好了,FPGA侧的JESD204C IP核参数必须完全一致。这里的一致包括:

  • LMFS相同(尤其是L和F)
  • lane rate相同
  • 参考时钟同源(实际工程常通过同一时钟芯片分发)
  • SYSREF的配置和触发方式相同
  • 如果是多片ADRV902x,还要保证所有器件的SYSREF到达时刻一致

用Xilinx的JESD204C IP核配置界面举例,你会看到类似“Line Rate”“LMFS”“Reference Clock”“SYSREF”等设置项。把这些值和TES导出的配置逐一对照,任何一个不一致,IP核概要状态里就会报错,严重的情况下直接收紧输出。

我建议在硬件上把“参考时钟同源”当成强制要求。ADRV902x的device clock和FPGA的JESD204C IP核参考时钟最好来自同一个时钟芯片,否则即使数值都是122.88MHz,两个时钟源存在频偏和相位噪声差异,也会造成链路偶发性误码或无法同步。

5. 配置加载、链路调试与问题排查

5.1 ARM bin与配置文件加载到目标板的流程

把TES生成的ARM bin和配置信息从Windows环境搬到目标Linux系统后,接下来的过程大致如下:

  1. 把ARM bin放到目标板文件系统的/lib/firmware/目录(不同驱动可能用不同路径)
  2. 加载驱动时,驱动会通过固件加载机制(如request_firmware)把bin读入内存
  3. 驱动通过SPI把bin传输到ADRV902x内部的ARM SRAM,并启动ARM核
  4. ARM核启动后,驱动开始通过API下发射频和JESD204C配置参数
  5. 链路建立成功后,驱动打印相关状态,比如“JESD204C link up”

如果你的系统没有文件系统固件加载能力,也可以把ARM bin转换成C数组编译进内核驱动。这样虽然省去文件系统依赖,但每次换固件都要重新编译内核,调试效率低。我自己的经验是:开发阶段用文件系统加载,量产时再考虑是否编译进内核。

5.2 怎么确认JESD204C链路真的锁住了

光看驱动日志不够,建议用三重手段交叉确认:

第一,读ADRV902x侧的链路状态寄存器。ADI驱动一般有相应API或debugfs节点,能看到lane状态、全局同步信号、误码计数等。如果所有lane都显示同步,说明ADRV902x侧发送数据正常。

第二,读FPGA侧的JESD204C IP核状态。Xilinx IP核有多个状态位,比如“link_up”“sync_acquired”“mframe_aligned”,这些都要置位才算链路OK。如果FPGA侧没有sync信号,问题几乎肯定出在配置不一致或SYSREF上。

第三,做PRBS测试。JESD204C标准里支持在物理层插入PRBS数据,让两端做自检。在ADRV902x和FPGA之间先跑一段PRBS,确认无误码后再切回正常业务数据。我见过一种情况:链路状态显示“up”,但一旦传输实际数据就满屏错误,最后排查发现是PRBS测试通过,但实际数据路径中S参数配置错误,导致数据帧错位。

5.3 常见问题速查表

把我调试中的问题和排查过程整理成下面的表,你可以直接当checklist用:

问题现象可能原因排查方法
TES连接不上评估板USB驱动问题、型号选错、板卡电源不正常检查设备管理器中COM口是否出现,确认板卡电源灯亮
ARM固件加载失败bin文件损坏、版本不匹配md5校验文件,核对驱动要求的固件版本号
ARM加载成功但初始化卡住SPI通信异常、配置参数超范围用TES回读寄存器,对比正常配置
JESD204C链路起不来两边LMFS或lane rate不一致逐个比较FPGA IP核和TES配置参数
链路偶尔丢失同步SYSREF时序不对、时钟抖动大示波器看SYSREF边沿,检查同源时钟
能lock但数据全是错N/N'位宽配置错误、F参数不一致检查样本位宽、帧长度,跑PRBS定位
温度一高就出错电源纹波、散热不良用频谱仪看电源噪声,检查评估板散热条件

5.4 调试技巧:用回读寄存器快速定位问题

最后一个经验,真的很建议每个人在调试前期就养成的习惯:不要只看驱动日志,要学会用TES回读寄存器。

ADRV902x的大多数关键状态都可以通过SPI寄存器读出来,包括PLL锁定状态、ARM处理器状态、JESD204C链路同步状态、误码监控值等。当你怀疑配置没有正确生效时,打开TES,找到对应的寄存器页,将当前值和驱动下发后的期望值做比对,很快就能判断问题到底出在驱动代码、ARM固件还是FPGA侧。

比如有一次我遇到PLL失锁,驱动日志只说了“pll unlock”,但TES里能看到是RF PLL还是digital PLL失锁,还能看到参考时钟的计数状态。这样几十秒就定位到是外部参考时钟幅度不够导致的参考检测失败,而不是驱动算法问题。这种排查效率,靠“逐行看代码”是远远达不到的。

另外,调试JESD204C时一定要善用SYSREF的示波器抓取。把示波器探头放在SYSREF SMA口上,检查信号边沿是否干净,频率是否和配置一致。如果SYSREF有毛刺或者边沿抖动过大,先解决信号源问题再谈链路同步。我见过一个极端案例,SYSREF的偏置电压不对,导致FPGA侧连续误判同步头,整条链路像癫痫一样反复up/down。

最后再分享一个小技巧:在开新板或者换新FPGA工程时,先不要把采样率调到很高的目标值。先用一个低速率的“练习配置”把整条链路跑通,比如把采样率降到122.88M,lane数用最少的,SYSREF用最简单的subclass 1模式,让ADRV902x和FPGA先把“握手”搞定。链路能起来,说明通信链路、时钟和基本配置是对的,然后再慢慢提速。直接冲刺高配置的好处是省时间,坏处是一旦起不来,各种变量混杂在一起,你会很难定位问题点。

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

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

立即咨询