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通过串口控制,做环回测试。

 

电脑上位机控制BLE DTM测试示意图

 

综测仪控制BLE DTM做环回测试示意图
注:因为BLE协议不支持信令测试,所以综测仪和BLE设备的测试使用了伪信令的方法,即环回测试,综测仪使用USB口发送标准BLE的HCI指令给BLE设备的串口,BLE设备进入相应的模式和信道,综测仪的RF Input口接BLE的RF输出,根据综测仪发送的HCI指令来判断BLE设备是否符合相应的规范,此方法在BQB认证和BLE接收测试中较为常用。
 
一、使用电脑上位机控制DTM
1、软件安装

DTM控制需要使用nRF Connect for Desktop中的Direct Test Mode插件。

注意:老的nRFgo Studio已经停止更新,DTM控制,程序下载等功能已经全部迁移到nRF Connect for Desktop中,因此建议使用nRF Connect for Desktop。

下载地址:https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-desktop/Download?lang=en#infotabs

下载安装完成后,打开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;
        };
    };
};

 

posted @ 2023-07-19 16:53  HannibalWang  阅读(7867)  评论(0)    收藏  举报