Nordic DTM测试(NRF54L&H系列\NRF5340\NRF52系列)
BLE设备在做RF调试如调整频偏、二三次谐波、阻抗匹配、天线有源测试以及过诸如CE、FCC、SRRC、BQB等认证的时候,需要用到BLE的DTM(Direct test mode,即直接测试模式),DTM的指令是由SIG定义的标准HCI指令,是按照蓝牙规范中Direct test mode所要求数据格式来编写(数据格式定义参看:Bluetooth Core Specification v5.0->Vol 6->Part F第4小节),BLE设备烧录DTM程序后可以由电脑的DTM上位机控制BLE设备进入相对应的发射或是接受模式,也可以由蓝牙综合测试仪如CMW500通过串口控制,做环回测试。


DTM控制需要使用nRF Connect for Desktop中的Direct Test Mode插件。
注意:老的nRFgo Studio已经停止更新,DTM控制,程序下载等功能已经全部迁移到nRF Connect for Desktop中,因此建议使用nRF Connect for Desktop。
下载安装完成后,打开nRF Connect for Desktop,安装Direct Test Mode插件。

2、DTM控制
下载安装Direct Test Mode插件后,打开Direct Test Mode插件
(1)、将USB转串口和烧录好DTM的BLE设备连接并插在电脑上,可以看到列表中有USB转串口工具。
(2)、选择USB转串口工具即可

注:如果出现列表中没有USB转串口,则需要检查USB转串口的驱动是否有成功安装,查看方法:我的电脑 --> 设备 --> 端口

选择设备后,插件会进入如下界面

(1)、发射模式
(2)、接收模式
(3)、选择DTM模式,Single是控制BLE设备在单频点,Sweep可以控制BLE设备跳频,一般认证测试只会用到Single模式。
(4)、选择BLE信道,信道表详见右边 BLE Channel
(5)、设置发射功率
(6)、选择BLE的PHY
(7)、选择BLE包的类型,其中PRBS9、11110000、10101010都是调制波,Constant Carrier是单载波。
(8)、设置好上述选项后,点击Start开始定频,定频成功开启的如下图

注:Nordic的nRF51\52\53系列,都可以使用此插件来控制DTM定频
二、综测仪设置(以CMW500为例)
这里需要注意的是EUT Control中的设置

(1)、EUT Comm Protocol中需要选择 2-Wire 而不是 HCI,Nordic的DTM只支持 2-Wire,不支持HCI。
(2)、Virtual Comm Port是选择USB转串口的COM口,这里需要注意的是CMW500的操作系统是Windows,但因为市面上不同年代不同型号的CMW500的操作系统存在差异,所以需要选择能够和自己的CMW500兼容的USB转串口设备,设备的驱动可以正常安装在CMW500上,避免CMW500无法识别到USB转串口设备。
(3)、Baud Rate这里是选择串口波特率,Nordic默认的DTM串口波特率是19200,但是此波特率可以在DTM程序中更改,后面会详细介绍。
CMW500其他的设置和nRF Connect for Desktop中的Direct Test Mode插件的设置大通小异,参考Direct Test Mode插件即可。
这里关于CMW500的用法可以参考:CMW500的基本使用方法之BLE测试
三、DTM固件修改
Nordic现在有两套SDK,nRF5 SDK和nRF Connect SDK(简称NCS),一般来说,nRF51\52建议使用nRF5 SDK中的DTM,nRF5340、NRF54L系列和NRF54H系列及后续的型号使用NCS中的DTM。
1、nRF5 SDK
nRF5 SDK的DTM程序在nRF5_SDK\examples\dtm\direct_test_mode路径下,此路径下有一个hex文件夹,里面有编译好的DTM固件,但串口是固定的,串口定义如下:


注:PCA10028 对应的是 nRF51822
PCA10040 对应的是 nRF52832
PCA10040e 对应的是 nRF52810
PCA10056 对应的是 nRF52840
PCA10056e 对应的是 nRF52811
PCA10100 对应的是 nRF52833
PCA10100e 对应的是 nRF52820
PCA10112 对应的是 nRF52840+nRF21540DK
nRF51系列只支持到nRF5 SDK 12.3.0,所以使用nRF51系列的设备需下载对应版本的SDK。
想要修改串口的引脚定义就需要进入DTM程序的 uart_init() 函数,此函数定义了串口的引脚和波特率,所以想要修改串口引脚和波特率,只要修改此处的宏定义即可。

2、NCS(以NCS V2.9.0为例)
##2025年3月10日更新##
NCS中的DTM程序在NCS SDK\nrf\samples\bluetooth\direct_test_mode 路径下,因为NCS使用了Zephyr,所以修改串口引脚和波特率需要通过定义设备树 .overlay文件的形式来定义
因为NCS2.9.0支持NRF52、NRF53和NRF54系列,这三个系列芯片修改默认串口引脚会略有不同,下面会逐一介绍:
(1)NRF54L系列(以NRF54L15为例)
将下面的代码添加到 \nrf\samples\bluetooth\direct_test_mode\boards\nrf54l15dk_nrf54l15_cpuapp.overlay 中编译。这里需要注意的是在NRF54L15上,DTM默认用到的串口是UART20,而在NRF54L系列上有域的概念,也就是说NRF54L系列上的串口是无法像NRF52系列上那样去自由映射的,只能在域对应的Port去修改,这里给出UART20这个域对应的Port口,可以看到UART20只能映射在P1.xx和P2.xx这两组Port口上,但是映射到P2.xx这组Port口上需要跨电源域,所以这里建议UART20只使用P1.xx这组Port:


下面代码为SDK中默认的UART引脚,如需修改只要修改注释前对应的引脚即可。
&uart20 { status = "okay"; current-speed = <19200>; //修改串口波特率 pinctrl-0 = <&uart20_default>; pinctrl-1 = <&uart20_sleep>; pinctrl-names = "default", "sleep"; }; &pinctrl { /omit-if-no-ref/ uart20_default: uart20_default { group1 { psels = <NRF_PSEL(UART_TX, 1, 4)>; //定义TX引脚 }; group2 { psels = <NRF_PSEL(UART_RX, 1, 5)>; //定义RX引脚 bias-pull-up; }; }; /omit-if-no-ref/ uart20_sleep: uart20_sleep { group1 { psels = <NRF_PSEL(UART_TX, 1, 4)>, //定义TX引脚 <NRF_PSEL(UART_RX, 1, 5)>; //定义RX引脚 low-power-enable; }; }; };
(2)NRF54H系列(以NRF54H20为例)
将下面的代码添加到 \nrf\samples\bluetooth\direct_test_mode\boards\nrf54h20dk_nrf54h20_cpurad.overlay 中编译。这里需要注意的是在NRF54H系列上,DTM默认用到的串口是UART136,而在NRF54H系列上也是有域的概念,也就是说NRF54H系列上的串口是无法像NRF52系列上那样去自由映射的,只能在域对应的Port去修改,这里给出UART136这个域对应的Port口,可以看到UART136能映射在P0.xx、P1.xx和P2.xx这三组Port口上,


UART136对应的这几组Port口只能支持1.8V的电平,所以需要支持1.8V的USB转串口工具,这个可以根据关键词自行去某宝购买:

下面代码为SDK中默认的UART引脚,如需修改只要修改注释前对应的引脚即可。
&uart136 { status = "okay"; memory-regions = <&cpurad_dma_region>; current-speed = <19200>; //修改串口波特率 pinctrl-0 = <&uart136_default>; pinctrl-1 = <&uart136_sleep>; pinctrl-names = "default", "sleep"; }; &pinctrl { /omit-if-no-ref/ uart136_default: uart136_default { group1 { psels = <NRF_PSEL(UART_TX, 2, 6)>; //定义TX引脚 }; group3 { bias-pull-up; psels = <NRF_PSEL(UART_RX, 2, 4)>; //定义RX引脚 }; }; /omit-if-no-ref/ uart136_sleep: uart136_sleep { group1 { low-power-enable; psels = <NRF_PSEL(UART_TX, 2, 6)>, //定义TX引脚 <NRF_PSEL(UART_RX, 2, 4)>; //定义RX引脚 }; }; };
(3)NRF5340
将下面的代码添加到SDK\nrf\samples\bluetooth\direct_test_mode\sysbuild\remote_shell\boards\nrf5340dk_nrf5340_cpuapp.overlay中,在NRF5340上串口引脚是可以自由映射的,所以可以修改成任意引脚,如下是SDK中默认使用的引脚,如需修改只要修改注释前对应的引脚即可。
&uart0 {
status = "okay";
current-speed = <19200>; //串口波特率
};
&pinctrl {
uart0_default: uart0_default {
group1 {
psels = <NRF_PSEL(UART_TX, 1, 1)>, //定义TX引脚
<NRF_PSEL(UART_RTS, 0, 11)>;
};
group2 {
psels = <NRF_PSEL(UART_RX, 1, 0)>, //定义RX引脚
<NRF_PSEL(UART_CTS, 0, 10)>;
bias-pull-up;
};
};
uart0_sleep: uart0_sleep {
group1 {
psels = <NRF_PSEL(UART_TX, 1, 1)>, //定义TX引脚
<NRF_PSEL(UART_RX, 1, 0)>, //定义RX引脚
<NRF_PSEL(UART_RTS, 0, 11)>,
<NRF_PSEL(UART_CTS, 0, 10)>;
low-power-enable;
};
};
};
(4)NRF52系列
将下面的代码添加到SDK\nrf\samples\bluetooth\direct_test_mode\app.overlay中,在NRF52系列上串口引脚是可以自由映射的,所以可以修改成任意引脚,如下是SDK中默认使用的引脚,如需修改只要修改注释前对应的引脚即可。
&uart0 { status = "okay"; current-speed = <19200>; //修改波特率 pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; }; &pinctrl { uart0_default: uart0_default { group1 { psels = <NRF_PSEL(UART_TX, 0, 6)>; //定义tx引脚 }; group2 { psels = <NRF_PSEL(UART_RX, 0, 8)>; //定义rx引脚 bias-pull-up; }; }; uart0_sleep: uart0_sleep { group1 { psels = <NRF_PSEL(UART_TX, 0, 6)>, //定义tx引脚 <NRF_PSEL(UART_RX, 0, 8)>; //定义rx引脚 low-power-enable; }; }; };

浙公网安备 33010602011771号