[FAQ(常见问题解答)] FAQ_ BlueNRG 系列 DTM 介绍

nmg   2019-12-13 17:37 楼主

本文作者:ST工程师Lucien KUANG

点击下载pdf文档查看:

FAQ_ BlueNRG 系列 DTM 介绍.pdf (1.82 MB)
(下载次数: 36, 2019-12-13 17:07 上传)

关键词:DTM , BlueNRG

 

 

问题:客户经常问我你们的DTM怎么使用?有哪些功能 

ST工程师解答: BlueNRG 的DTM 不仅仅是用来测试RF相关的一些参数,所有BLE相关的功能,在DTM上都可以实现。好多人做BLE模块喜欢使用写一个透传例子来弄,但这样实际很容易将实际应用程序和蓝牙模块捆绑,并不方便通用,合适的是应该直接使用官方的DTM固件,然后在应用程序端通过ACI指令进行初始化,创建服务,广播连接等。 

 

下面我基于ST官方提供的相关资料,介绍如何使用DTM. 请预先安装最新SDK(en.stsw-bluenrg1-dk)和GUI(en.STSW-BNRGUI)工具.下面我基于实现一个带RF测试相关功能和透传(作为网络协处理器)的例子,介绍DTM。 

 

 

 1.1 使用前准备 

a. 硬件准备(引脚配置的选用) 

 

如果你是进行一些手机兼容性测试,或者是使用GUI工具模拟一些BLE交互过程,建议直接使用官方的开发板,官方的常见开发板(STEVAL-IDBXXXVX)的是基于UART控制的。 

如果你是设计产品,可以选择使用SPI 模式或者UART模式。 

关于UART模式或者SPI模式引脚的配置可以参考官方的资料说明。资料索引参考如下: 

双击打开C:\Program Files (x86)\STMicroelectronics\BlueNRG-1_2 DK 3.1.0\Docs\index.html 

 STM32L - BlueNRG-1,2 Network coprocessor setup & framework (SPI mode) 

 STM32L - BlueNRG-1,2 Network coprocessor setup & framework (UART mode) 

 

b. 软件准备 

代码路径参考如下 

C:\Users\Lucien\ST\BlueNRG-1_2 DK 3.1.0 

image.png

Project Target: 

SPI:包含升级固件的基于SPI模式控制的DTM 工程 

SPI_NOUPDATER: 不包含升级固件的基于SPI模式控制的DTM工程 

UART:包含升级固件的基于UART模式控制的不带睡眠的DTM工程 

UART_SLEEP:包含升级固件基于UART模式控制带睡眠的DTM工程 

UART_NOUPDATER:不包含升级和睡眠的基于UART模式控制的DTM工程 

关于引脚的配置,这里我们可以看到代码hw_config.h中使用的默认配置如下 

image.png

我们可以看到SPI如果需要使用睡眠功能,则是5根线,其中SPI_IRQ_PIN可以用于当有数据时,处理器去读取BlueNRG-xxx芯片的数据。 

结合datasheet,需要注意的是,如果使用uart工程,使用带睡眠的需要使用4线带流控的UART,当然,这块上可以手动更改代码使用软件的方法,但必须要保证能够唤醒BlueNRG-xxx芯片。所以这里分别针对这两种模式选择了如下引脚,就是为了能否唤醒BlueNRG-xxx芯片: 

#define UART_CTS_PIN GPIO_Pin_13 

#define SPI_CS_PIN GPIO_Pin_11 

 

1.2 RF测试与应用软件开发 

编译上述工程的适配代码后,我们算是准备好了协处理器部分的代码,是时候准备处理器端了。 

处理器端与协处理器交互使用的是ACI(Application Commands Interface) command. ACI指令不是HCI指令。HCI有部分指令直接直接映射到ACI中,但ACI指令的操作是基于host层的,HCI指令是基于Controller层的。如果做一些信令测试或者一些Linux系统想从HCI层直接控制BlueNRG-xxx芯片,也是可以的,同样使用上述工程,不同的是需要预定义全局宏LL_ONLY (Keil工程 option->C/C++-->Define).顺便提及一下,蓝牙标准HCI规范里面的支持三线uart(不带流控),五线uart(带流控),SD,USB等接口方式。而针对BlueNRG-xxx则默认采用三线uart,所以在ACI指令时,也延续了三线uart数据包的分格,即在数据包前面加多一个字节用于表明数据包的方向类型(下文分析数据时会再次提及)。 

image.png

RF测试

如果你要进行RF相关的测试,如果你方便引出串口线,你可以结合BluNRG_GUI工具来进行测试 

如果不方便引出串口线,需要在处理器处理器端(MCU 或者 PC 或者其他)写控制的相关代码。下面结合GUI 工具讲解使用三线串口如何写相关的控制指令(采用SPI指令类似,串口和spi通信方式的代码书写可以参考工程: BlueNRG-1_2 DK 3.1.0\Project\STM32L\BLE_ChatMasterSlave)。 

发射性能测试

为了比较更清楚了解测试交互了哪些指令(ACI commond),我们先用开发板和GUI工具结合模拟查看交互过程,如果只想通过串口测试目标板子的发射性能,可以无需细纠具体的指令,如果需要代码控制,则需要了解详细的指令。 

image.png

先说数据包格式结论: 数据包类型 + 命令或者事件 + 参数长度 + 参数 

比方说在固定的频道发送固定的序列: 

1. 在2402 信道上按照-2dBm的发送功率发送定频指令 

 

HCI_RESET: [0x01,0x03,0x0C,0x00

HCI_COMMAND_COMPLETE_EVENT: [0x04,0x0E,0x04,0x01,0x03,0x0C,0x00] 

ACI_BLUE_INITIALIZED_EVENT: [0x04,0xFF,0x03,0x01,0x00,0x01] 

 

ACI_HAL_SET_TX_POWER_LEVEL: [0x01,0x0F,0xFC,0x02,0x01,0x04] 

HCI_COMMAND_COMPLETE_EVENT: [0x04,0x0E,0x04,0x01,0x0F,0xFC,0x00] 

 

ACI_HAL_TONE_START: [0x01,0x15,0xFC,0x02,0x00,0x00] 

HCI_COMMAND_COMPLETE_EVENT: [0x04,0x0E,0x04,0x01,0x15,0xFC,0x00] 

结束指令: 

ACI_HAL_TONE_STOP: [0x01,0x16,0xFC,0x00] 

HCI_COMMAND_COMPLETE_EVENT: [0x04,0x0E,0x04,0x01,0x16,0xFC,0x00] 

上述指令中,橙色代表的是发送指令,每条发送指令完成后,会有回应这条事件接收完成的回复,一些耗时的指令,等到指令处理完后,会有相应的事件回复。 

紫色区域代表的是数据包的类型,如下图所示: 

image.png

此图选取与蓝牙协议规范5 ,page 2447. 

绿色区域代表的是命令或者事件 

命令和事件和它们的参数的详细文档可以参考文档: 

C:\Program Files (x86)\STMicroelectronics\BlueNRG GUI 3.1.0\Docs\index.html 

BlueNRG-1 BLE v1.x Stack APIs & events documentation 

事件只占一个字节: 

image.png 命令占两个字节,注意因为是大端数据格式,所以前后字节发送时要倒置: 

image.png

红色的是参数的长度 

黑色的是命令或者事件函数的参数,详细参看上述网页参考或者BlueNRG-xx SDK中bluenrg1_events.h和bluenrg1_api.h,函数名和命令或者事件一一对应,只有大小写的差别。 

总结数据包的格式为: 数据包类型 + 命令或者事件 + 参数长度 + 参数 

 

2. 其他RF测试指令可以按照相同方式模拟,如果要进行RF测试,想通过外部的其他MCU或者处理器发送指令控制可以参考上述描述。生成相关的指令,然后添加到代码中。 

 

3. 使用GUI工具参数数据,然后使用串口助手工具简单创建一个透传服务测试。 

这里涉及指令比较多,我就不一一详解了,我只把主要的步骤罗列一下: 

a. 初始化设备(这里只列出发送了的数据) 

HCI_RESET
[0x01,0x03,0x0C,0x00]
HCI_COMMAND_COMPLETE_EVENT
ACI_BLUE_INITIALIZED_EVENT
ACI_HAL_WRITE_CONFIG_DATA
[0x01,0x0C,0xFC,0x08,0x00,0x06,0xC4,0xB8,0x00,0xE1,0x80,0x02]
HCI_COMMAND_COMPLETE_EVENT
ACI_HAL_SET_TX_POWER_LEVEL
[0x01,0x0F,0xFC,0x02,0x01,0x04]
HCI_COMMAND_COMPLETE_EVENT
ACI_GATT_INIT
[0x01,0x01,0xFD,0x00]
HCI_COMMAND_COMPLETE_EVENT
ACI_GAP_INIT
[0x01,0x8A,0xFC,0x03,0x0F,0x00,0x07]
HCI_COMMAND_COMPLETE_EVENT
ACI_GATT_UPDATE_CHAR_VALUE
[0x01,0x06,0xFD,0x0D,0x05,0x00,0x06,0x00,0x00,0x07,0x42,0x6C,0x75,0x65,0x4E,0x52,0x47]
HCI_COMMAND_COMPLETE_EVENT

 

b. 创建透传服务database,即属性表中添加自定义的透传服务(这里同样只列了发送了的数据) 

image.png 属性表详解如下图: 

image.png

ACI_GATT_ADD_SERVICE
[0x01,0x02,0xFD,0x05,0x01,0xF0,0xFF,0x01,0x06]
HCI_COMMAND_COMPLETE_EVENT
ACI_GATT_ADD_CHAR
[0x01,0x04,0xFD,0x0C,0x0C,0x00,0x01,0xF1,0xFF,0x14,0x00,0x10,0x00,0x00,0x07,0x00]
HCI_COMMAND_COMPLETE_EVENT
ACI_GATT_READ_HANDLE_VALUE
[0x01,0x2A,0xFD,0x06,0x0E,0x00,0x00,0x00,0xF4,0x00]
HCI_COMMAND_COMPLETE_EVENT
ACI_GATT_ADD_CHAR
[0x01,0x04,0xFD,0x0C,0x0C,0x00,0x01,0xF2,0xFF,0x14,0x00,0x08,0x00,0x01,0x07,0x00]
HCI_COMMAND_COMPLETE_EVENT
ACI_GATT_READ_HANDLE_VALUE
[0x01,0x2A,0xFD,0x06,0x11,0x00,0x00,0x00,0xF4,0x00]
HCI_COMMAND_COMPLETE_EVENT

 

c. 广播(广播间隔改成200ms,其他默认GUI 参数) 

HCI_LE_SET_SCAN_RESPONSE_DATA
[0x01,0x09,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
HCI_COMMAND_COMPLETE_EVENT
ACI_GAP_SET_DISCOVERABLE
[0x01,0x83,0xFC,0x15,0x00,0xC8,0x00,0xC8,0x00,0x00,0x00,0x08,0x09,0x42,0x6C,0x75,0x65,0x4E,0x52,
0x47,0x00,0x00,0x00,0x00,0x00]
HCI_COMMAND_COMPLETE_EVENT

Screen Shot 2019-12-13 at 5.28.35 PM.png

d. 使用串口依次发送上述数据,然后使用BLE 工具扫描到广播,然后可以连接测试收发数据。 

4. 总结:上述演示了创建透传服务的简单流程,实际coding 时可以使用FIFO 增加程序的灵活性与健壮性,即把相关要发送的指令先发送到FIFO,等收到命令回复再发送下一条指令,如果不想自己抽象代码去写相关的函数,也可以直接移植相关工程,例如:BlueNRG-1_2 DK 3.1.0\Project\STM32L\BLE_ChatMasterSlave。 

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复