1. 项目概述:这块板子的DTM到底能帮你干什么
搞蓝牙开发和射频测试的人,对Nucleo-WBA25CE1这块板子应该不陌生。它是ST在STM32WBA系列上推出的一款Nucleo-64开发板,核心用的是STM32WBA25CE,Arm Cortex-M33主频100MHz,1MB Flash / 128KB RAM,支持Bluetooth LE 5.4。今天要聊的不是常规的BLE应用开发,而是它最容易被忽略、但做硬件调试和认证时又绕不开的一个功能:Direct Test Mode,也就是DTM。
DTM是什么?一句话解释:它是蓝牙规范里定义的一种测试模式,让测试仪器或电脑上的测试软件直接控制蓝牙芯片的射频收发器,绕过协议栈的上层逻辑,用来做发射功率、接收灵敏度、调制特性、频率误差这些射频指标的测量。你可以把它理解成射频链路的一场裸考——不穿协议栈的衣服,直接看硬件本身行不行。
实际工作中,DTM一般出现在三个场景。第一,板子刚贴片回来,要快速验证射频链路有没有焊好、有没有短路、天线匹配对不对,DTM是最快的验证手段。第二,产品要过蓝牙认证,认证实验室就是用DTM模式配合综测仪跑RF-PHY那堆测试用例。第三,量产产测阶段,很多工厂也是用DTM的简化版接口配合PC端软件做射频快速校验。所以不管你是硬件工程师、嵌入式软件工程师,还是刚入行的射频测试工程师,DTM这套东西迟早要碰。这篇内容就基于Nucleo-WBA25CE1,把DTM从原理到实操完整走一遍。
2. DTM的原理与三种实现路径
2.1 蓝牙规范里的DTM定义在哪个位置
先花点时间把DTM在蓝牙协议栈里的位置说清楚。蓝牙协议栈从上到下是应用层、Host(主机)、Controller(控制器),其中Controller里包含了链路层和物理层。DTM直接作用于物理层,它绕过了整个Host,也绕过了链路层的正常连接流程,由测试设备(Tester)直接向被测设备(IUT)的控制器下发命令,让射频部分按照指定参数工作。
这个机制在蓝牙核心规范里是单独成章的,卷号是Core Specification Vol 6 Part F,叫做Direct Test Mode。规范里规定了两种访问DTM的途径:一种是标准HCI接口,测试仪通过HCI指令和被测设备通信;另一种是2-wire UART接口,专门给那些不带完整Host、只带控制器的设备用。Nucleo-WBA25CE1这两种都支持,但实际用起来差别很大。
为什么需要区分这两种路径?因为测试对象不同。如果被测设备是一个完整的蓝牙SoC,比如手机上那颗蓝牙芯片,它跑着完整的协议栈,测试仪想进入DTM就得通过HCI命令下发;但如果被测对象是模块里边那颗纯控制器,或者为了产测方便不想初始化整个协议栈,那2-wire UART这种简化接口就更有优势,命令格式简单,一个字节就能触发一次测试,对产测脚本非常友好。
2.2 2-wire UART的帧格式
2-wire UART DTM接口在规范里有明确的帧格式规定,比特率固定115200 bps,8数据位、1停止位、无校验。数据包是16位固定格式:第0位是停止位,固定为1;接着8位是命令,分三类:0x00是发射测试命令,0x01是接收测试命令,0x02是测试结束命令;再往后的位根据命令类型填充频率通道号、数据包长度、载荷格式这些参数。
这里有个容易踩的坑:频率通道号的编码规则是通道索引乘以2,比如测试物理通道索引0,实际编码值是0;通道索引39,编码值是78。换算关系很简单,但很多人在写上位机脚本时容易直接填39,导致射频根本不在目标通道上工作。我见过不止一次这种低级错误,测了半天数据不对,最后发现是通道号没有乘以2。
2.3 STM32WBA系列DTM的实现结构
STM32WBA系列的DTM实现和STM32WB系列类似,ST在STM32CubeWBA固件包里提供了完整的DTM工程和预编译固件。对于Nucleo-WBA25CE1这块板子,ST官方给的标准做法是:直接烧录STM32CubeMonitor-RF配套的DTM固件,然后通过ST-LINK的虚拟串口和上位机交互。这个方案走的是2-wire UART路径,不需要额外接线,USB一插就能开测,非常方便。
如果是产品化开发阶段,就需要把DTM功能集成到自己的固件里。ST的SDK里有一个BLE_DTM的示例工程,展示了如何用HCI命令触发DTM测试,适合那些协议栈已经跑起来的项目。两种实现路径的选择逻辑其实很清晰:开发调试阶段怎么快怎么来,跑官方固件就行;产品量产阶段则要把DTM代码固化在量产固件里,还要做密码保护或者命令隐藏,避免终端用户误触发射频测试。
3. 环境准备与硬件连接
3.1 硬件清单与板载资源确认
在跑DTM之前,先确认一下手头的东西是否齐全。Nucleo-WBA25CE1这块板子的关键资源包括:板载ST-LINK/V3调试器(带虚拟串口)、一个用于射频输出的SMA连接器、板上印刷天线,以及USB Type-C供电接口。需要特别注意的是,板子上的射频路径选择是由板载跳线或电阻配置的,SMA口和PCB天线之间二选一。
如果要用频谱仪测发射功率,强烈建议走SMA口接同轴线到频谱仪,不要对着天线用辐射法测,虽然也能测但误差很大,除非你专门做了暗室环境标定。板子上默认出厂配置通常是SMA口没有焊接,需要自己装好SMA头或者通过板上标注切换天线路径。具体看板子丝印,找到标着SMA和ANT的跳线区域,按需用0欧电阻或跳线帽切换。
3.2 固件准备:直接烧ST官方DTM固件
最快的起步方式,是到ST官网下载STM32CubeMonitor-RF工具以及STM32CubeWBA固件包,在固件包里找到Projects/NUCLEO-WBA25CE1/Applications/BLE/DTM_2Wire_UART这个工程,用STM32CubeIDE编译后烧录。如果不想折腾编译环境,ST在CubeMonitor-RF的安装目录里通常会附带对应板卡的预编译DTM固件,直接烧录即可。
烧录方式有两种,任选其一:用STM32CubeProgrammer通过ST-LINK烧录,或者直接把hex文件拖到板载ST-LINK映射出的U盘里(Windows下Nucleo-64会识别出一个移动磁盘)。第二种方式对不熟悉命令行的人最友好,把固件hex文件拖进去,然后按一下板子上的复位键,固件就生效了。
3.3 STM32CubeMonitor-RF的配置要点
打开STM32CubeMonitor-RF后,第一步选择正确的串口。这里有个很容易迷惑的点:ST-LINK的虚拟串口在系统里可能枚举出两个COM口,一个是ST-LINK本身的调试串口,另一个才是DTM固件用的串口。怎么分辨?看设备管理器里USB设备描述,选带"Virtual COM Port"的那个,通常是那个不带"STLink"字样的COM口。选错端口的表现是上位机一直报连接失败,这时不用急着怀疑硬件,先换个端口试试。
波特率设置成115200,这个不要动。连接成功后,工具界面会显示当前设备已经进入DTM模式,接下来就可以配置发射测试和接收测试了。
4. 实操:跑通完整的DTM测试流程
4.1 发射测试(TX Test)参数详解
这是DTM里最常做的测试。打开STM32CubeMonitor-RF的TX测试界面,需要配置的参数有几个:测试通道(0到39,对应2.4GHz频段中BLE使用的40个物理通道)、PHY类型(1M、2M、Coded S2、Coded S8)、数据包长度(0到255字节)、载荷模式(PRBS9、PRBS15、0x0F、0x55等)。
载荷模式的选择很关键。PRBS9和PRBS15是伪随机序列,频谱特性最接近真实数据,适合测调制特性和频谱模板;0x55(二进制01010101)是方波模式的交替比特,容易暴露调制质量问题;0x0F则偏向能量集中。我的习惯是:快速验证时用PRBS9,做认证预测试时按蓝牙规范要求跑全序列。
发射功率等级在DTM里也是一个可配置参数。STM32WBA25CE的发射功率范围大约是-20dBm到+4dBm,分多个等级。注意DTM命令里填的power level索引和实际dBm值不是一一对应的,需要查芯片数据手册里的映射表。用CubeMonitor-RF时这个映射工具已经帮你处理好了,直接选dBm值就行。
配置好参数后,点发射按钮,用频谱仪看中心频率:如果选的是通道0,中心频率就是2402MHz;通道39对应的中心频率是2480MHz。频谱仪上会看到一个宽度约1MHz(或2MHz,取决于PHY)的调制信号。这时可以做几件事:测输出功率、测占用带宽、观察频谱模板是否在规范要求的mask内、测单边带相位噪声。
4.2 接收测试(RX Test)与误码率统计
接收测试比发射测试稍微绕一点。在CubeMonitor-RF里切到RX测试界面,配置好测试通道和PHY类型,点开始接收,这时芯片的接收机在工作,但没有信号进来时界面是收不到数据的。你需要用另一台信号发生器(或者一台跑着DTM的另一块板子)朝被测板发送测试信号。
更常见的做法是两台Nucleo-WBA25CE1背靠背对测:一块配置为TX模式持续发射PRBS9,另一块配置为RX模式接收,然后RX那侧的CubeMonitor-RF会实时显示收到的数据包数量和误码率。这个方法不需要综测仪就能做基础的链路验证,对预算有限的团队非常实用。
接收灵敏度的评估比较讲究。要得到可信的灵敏度数据,需要信号源输出精确的功率等级,一般从-20dBm开始逐档往下压,找到误码率超过30.8%(这是BLE认证对64字节PRBS9数据的PER要求)的那个功率点,大体就是接收灵敏度了。注意DTM的RX统计是基于收到多少有效包来计算的,如果信号源和被测板之间的频偏过大、调制指数偏差超标,即使功率很足,误码率也会偏高,所以测试前最好确认发射端频偏是正常的。
4.3 用DTM做天线调试的实操技巧
天线调试是DTM一个特别实用的场景。很多工程师在调天线匹配网络时喜欢用网络分析仪,但网络分析仪测的是S参数,反映的是阻抗匹配好坏,实际辐射性能还得靠整机测试。DTM配合频谱仪或者临时天线,可以在不写应用代码的情况下快速评估天线改动前后的发射射功率变化。
具体操作方法是:板子进入DTM模式后固定在某个通道发射,比如通道19(2440MHz,处于频段中间),用频谱仪记录天线端的辐射功率。调整匹配电路的电感电容值,再记录新的辐射功率,反复对比,找到一个峰值点,这个点就是当前匹配网络的最佳值。实测下来这个方法比单纯追求S11最低更直观,因为S11最低点不代表辐射效率最高,两者之间往往有偏差。
对于接收方向的调试,可以用DTM RX模式配合信号源发射已知功率的信号,观察误码率变化来间接推断灵敏度。这个方法精度不如传导法高,但在没有专业暗室的情况下,足够用来判断天线改动是变好还是变坏。
5. 常见问题与排查技巧实录
5.1 连接不上串口:先从驱动和端口找原因
最典型的问题就是CubeMonitor-RF连不上设备。遇到这个情况,我的排查顺序是:第一步看设备管理器,确认ST-LINK的虚拟串口驱动是否正常安装,有没有出现未知设备;第二步确认串口号,把串口逐个试一遍;第三步检查DTM固件是否真的烧录成功,最简单的方式是重新烧录后按复位键,再试着连接;第四步确认串口没有被其他程序占用,比如串口调试助手、固件烧录工具之类的软件,占用后上位机就看不到设备了。
还有一个容易被忽略的点:某些ST-LINK虚拟串口需要先在STM32CubeProgrammer里做一次固件升级,否则虚拟串口功能可能不完整。升级方式就是把板子接到电脑上,打开STM32CubeProgrammer,选择ST-LINK固件升级选项,按提示操作。
5.2 频谱仪上没信号或者功率严重偏低
发射测试已经点了,频谱仪上也设好了中心频率,但看不到信号,这是第二个高频问题。先排除基础的测量配置错误:频谱仪的中心频率是否对准了测试通道频率,Span是否设置得够大(建议至少设5MHz),参考电平是否合理(建议先从+10dBm开始)。这些都没问题后,再检查板子的射频路径,SMA口是否焊好、天线路径的跳线是否切到了SMA侧、同轴线缆是否完好。
功率严重偏低往往也有迹可循。如果测得的功率比预期低了20dB以上,先怀疑射频走线、焊接问题,特别是SMA连接器和芯片射频引脚之间的微带线。这块板子的射频走线是50欧姆阻抗设计,如果焊接时用了过长的引线,或者SMA头没有按照丝印方向焊接,都会造成不必要的损耗。另外确认供电是否稳定,USB供电时如果板子上还有其他外设吃电流,可能导致射频PA供电不足。
5.3 测试模式退不出,程序再也不响应
这个现象在从DTM回到正常应用模式时偶尔出现。原因多半是DTM命令没有正确结束,芯片的链路层还停在测试状态。解决思路有两个:一是用上位机再发一次Test End命令,确认返回了正确的事件报告;二是直接按复位键,让芯片重新初始化。如果复位后仍然不响应,那就检查固件本身,确认是不是DTM工程里的测试结束回调处理有问题。
在自研固件时,要注意DTM状态和协议栈状态之间的切换。DTM测试结束后,链路层需要重新初始化才能恢复正常蓝牙广播和连接,这个流程在ST的SDK示例里是有的,但很多人在裁剪代码时会不小心把这个环节删掉,导致退出DTM后设备再也搜不到。我的经验是保留SDK示例里完整的状态切换逻辑,不要在DTM相关代码上做过度裁剪,除非你非常确定自己在做什么。
5.4 常见问题速查表
| 现象 | 大概率原因 | 处理办法 |
|---|---|---|
| 上位机连接失败 | 串口选错/被占用 | 逐个选择串口,关闭调试工具后重试 |
| 连接成功但无响应 | DTM固件没烧进去 | 重新烧录固件后按复位键 |
| 频谱仪不出信号 | 通道号填了索引没乘2 | 检查通道编码值,索引乘以2 |
| 功率比预期低很多 | 射频通路损耗或供电不足 | 检查SMA焊接、跳线、USB供电 |
| 误码率异常偏高 | 信号源频偏/调制超标 | 用标准信号源,检查发射端频偏 |
| 退出DTM后无广播 | 链路层未重新初始化 | 复位或检查状态切换代码 |
6. 产测落地的几点经验
如果只是调试阶段用DTM,上面的内容已经够了。但如果你想在量产产测里用这套方案,有几个坑得提前说透。
第一,产测不要指望每个工位都用CubeMonitor-RF这种GUI工具,效率太低。真正量产时是用Python或LabVIEW写自动化脚本,通过串口直接向DTM固件发2-wire UART命令,然后解析返回值。命令格式就那几个字节,文档里写得很清楚,脚本化改造并不难,就是注意串口超时和重试机制,产测现场环境杂,偶发串口异常一定要能自动恢复。
第二,产测的射频环境要做归一化处理。每个工位的射频线缆、衰减器、SMA转接头损耗都不一样,必须用校准板(参考板)在产测前做一次标准校准,把所有线损记录下来,测试软件里做差值补偿。不做这一步,测出来的绝对功率值根本不可信,不同产线之间也没法横向对比。
第三,关于产测标准怎么定,我建议不要只看绝对功率和灵敏度这两个值,还要关注频偏和调制特性。手机端、音箱端这些复杂产品对频偏很敏感,频偏超标的产品即使在灵敏度测试时能过,到了整机互操作阶段也会暴露问题。产测脚本里把频偏测量加进去,能拦截掉一大批隐患。
第四,量产固件里做DTM功能时,一定要加保护逻辑。常见的做法是:连续收到三次正确格式的管理帧才进入DTM模式,或者加一层简单的加密校验,防止产品在市场流通后被人通过串口误触发进入测试模式。这个坑我是真实踩过的,第一批产品还没出完,客户那边就有人通过串口进了测试模式,导致设备无法正常连接手机,后面加了个握手保护才解决。