本文作者:ST工程师Lucien KUANG
点击下载pdf文档查看:
关键词: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
Project Target:
SPI:包含升级固件的基于SPI模式控制的DTM 工程
SPI_NOUPDATER: 不包含升级固件的基于SPI模式控制的DTM工程
UART:包含升级固件的基于UART模式控制的不带睡眠的DTM工程
UART_SLEEP:包含升级固件基于UART模式控制带睡眠的DTM工程
UART_NOUPDATER:不包含升级和睡眠的基于UART模式控制的DTM工程
关于引脚的配置,这里我们可以看到代码hw_config.h中使用的默认配置如下
我们可以看到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数据包的分格,即在数据包前面加多一个字节用于表明数据包的方向类型(下文分析数据时会再次提及)。
RF测试:
如果你要进行RF相关的测试,如果你方便引出串口线,你可以结合BluNRG_GUI工具来进行测试
如果不方便引出串口线,需要在处理器处理器端(MCU 或者 PC 或者其他)写控制的相关代码。下面结合GUI 工具讲解使用三线串口如何写相关的控制指令(采用SPI指令类似,串口和spi通信方式的代码书写可以参考工程: BlueNRG-1_2 DK 3.1.0\Project\STM32L\BLE_ChatMasterSlave)。
发射性能测试:
为了比较更清楚了解测试交互了哪些指令(ACI commond),我们先用开发板和GUI工具结合模拟查看交互过程,如果只想通过串口测试目标板子的发射性能,可以无需细纠具体的指令,如果需要代码控制,则需要了解详细的指令。
先说数据包格式结论: 数据包类型 + 命令或者事件 + 参数长度 + 参数
比方说在固定的频道发送固定的序列:
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]
上述指令中,橙色代表的是发送指令,每条发送指令完成后,会有回应这条事件接收完成的回复,一些耗时的指令,等到指令处理完后,会有相应的事件回复。
紫色区域代表的是数据包的类型,如下图所示:
此图选取与蓝牙协议规范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
事件只占一个字节:
命令占两个字节,注意因为是大端数据格式,所以前后字节发送时要倒置:
红色的是参数的长度
黑色的是命令或者事件函数的参数,详细参看上述网页参考或者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,即属性表中添加自定义的透传服务(这里同样只列了发送了的数据)
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
d. 使用串口依次发送上述数据,然后使用BLE 工具扫描到广播,然后可以连接测试收发数据。
4. 总结:上述演示了创建透传服务的简单流程,实际coding 时可以使用FIFO 增加程序的灵活性与健壮性,即把相关要发送的指令先发送到FIFO,等收到命令回复再发送下一条指令,如果不想自己抽象代码去写相关的函数,也可以直接移植相关工程,例如:BlueNRG-1_2 DK 3.1.0\Project\STM32L\BLE_ChatMasterSlave。