1 套件清单
为了方便客户使用低功耗蓝牙模组,Lierda BT产品线特别推出低功耗蓝牙评估套件,该套件清单如表1所示。
表 1 套件清单 名称 | 数量(个) | 产品型号 | 资料链接 | 模组 | 1 | LSD4BT-E66ALSP001 | | 转接板 | 1 | LSD4BT-EVBTE66A01 | LSD4BT-EVBTE66A01【资料汇总】 | 底板 | 1 | LSD4BT-EVBTSTD001 | LSD4BT-EVBTSTD001【资料汇总】 | 跳线帽 | 20 | / | / |
1.1 模组
产品简介:该低功耗蓝牙模组是基于 SIG 发布的 BLE 标准设计的低功耗蓝牙透传模组。模组的控制方式灵活,不仅可以通过串口和功能性引脚进行控制,而且支持移动端远程控制。使用该模组,用户无需关注复杂的蓝牙协议,就可在短期内开发出标准的 BLE 产品。更多详细信息请参考LSD4BT-E66ALSP001【资料汇总】。
1.2 转接板
产品简介:用于连接模组和底板,并为模组提供烧写接口和外置天线焊接口; 连接方式:模组已焊接在转接板上,转接板需要正面朝上安插于底板上侧。
1.3 底板
产品功能:
- 提供转接板插座并引出模组的大部分引脚,可使用跳线帽将引出脚接高或接地;
- 提供 USB 转串口功能,支持 2 路串口(串口 0、串口 1);
- 支持多种供电方式:USB 供电、纽扣电池供电和 5 号干电池供电,可通过电源选择接口选择;
- 提供 4 个 LED 指示灯(LED1——黄,LED2——蓝, LED3——绿,LED4——电源指示灯(红))、2 个普通按键(K1、 K2)以及 1 个复位按键(K3);
- 提供电流测试接口:去除 R1,串联电流表在 P10 位置即可。
图 2 中处于同一侧的引出脚和转接板插座是对应的,且在同一水平线上的两个焊点之间是物理连接的,同时引出脚对应外围电路图如表 2 所示。无外围电路说明该引出脚仅使用排针引出,未连接任何外围设备。
表 2 引出脚与外围电路对应表
(4)Micro USB 转接线
如果用户选择USB供电方式或使用串口指令功能,则需要自备一根Micro USB 转接线,如图 3 所示。
2 评估示例
2.1 实验前准备
客户在进行应用程序开发之前,可先通过串口调试助手和Lierda提供的开发套件验证蓝牙模组的功能,以评估蓝牙模组的可用性。
串口调试助手可选用任意一款支持16进制发送和接收的串口调试工具。Lierda提供的开发套件需按照图 4 所示的方式连接,该套件使用Micro USB接口供电即可直接使用,使用过程中有以下几点需要注意。- 标注①处是转接板和底板的插口标准,要求转接板和底板最顶端的排针处于同一直线上;
- 标注②处是3个控制引脚接口,默认全接地;
- 标注③处是串口选择接口,默认选择串口0;
- 标注④处是电源选择接口,默认选择USB供电。
图 4 开发套件
2.2 简单例程
用户拿到E66开发套件时,所有跳线帽均需按照图 4 所示位置插好,此时通过Micro USB接口为套件供电,即可通过手机端APP扫描到模组的广播,如图 5 所示。
安卓手机APP推荐使用nRF Master Control Panel(BLE),苹果手机APP推荐使用LightBlue Explorer,以下示例均以安卓手机为准。
图 5 扫描结果
电脑端打开串口调试助手,默认波特率9600,Hex发送,Hex接收。发送产品信息查询指令,查询产品型号,查询结果图 6 如所示。
T:01 FC 18 01 00
R:04 FC 18 13 00 00 4C 53 44 34 42 54 2D 45 36 36 41 4C 53 50 30 30 31
| 图 6 查询产品型号
发送设备名称设置指令,设置结果如图 7 所示。此时手机端的扫面结果如图 8 所示。
T:01 FC 07 0E 4C 53 44 20 42 4C 45 20 44 45 56 49 43 45 //设备名称设置
R:04 FC 07 01 00
T:01 FC 08 00 //设备名称查询
R:04 FC 08 0F 00 4C 53 44 20 42 4C 45 20 44 45 56 49 43 45
|
2.3 修改广播数据
模组默认广播数据为0x020106030260FE,扫描响应数据为设备当前名称,如图 9 所示。
图 9 广播数据和扫描响应数据
发送广播数据设置指令,设置结果如图 10 所示。此时手机端的扫面结果如图 11 所示。
T:01 FC 0D 0A 00 08 FF 60 FE 11 22 33 44 55 //广播数据设置
R:04 FC 0D 01 00
T:01 FC 0E 00 //广播数据查询
R:04 FC 0E 0A 00 08 FF 60 FE 11 22 33 44 55
|
图 10 广播数据设置与查询
图 11 修改后的广播数据
2.4 发送透传数据
手机端点击CONNECT按钮连接上述设备,连接完成后如图 12 所示。
图 12 连接完成时手机端状态
然后打开Unknown Service服务,使能Notifications功能,准备接收模组发来的数据,如图 13 所示。
图 13 手机端使能Notifications功能
将模组的MODE_CTL引脚接高电平,切换到透传模式,此时可通过串口助手控制模组发送数据,如图 14 所示。
T:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
|
图 14 发送透传数据
此时手机端可以看到接收到的数据,如图 15 所示。
图 15 接收到透传数据
此时也可以通过手机端向模组发送数据,点击发送通道的发送按钮,如图 16 所示,输入要发送的数据,如图 17 所示,点击SEND按钮发送数据,此时,在串口助手接收区域可以看到手机端发来的数据,如图 18 所示。
图 16 数据发送通道的发送按钮
图 17 需要发送的数据
图 18 串口助手接收到的数据
3 应用示例
3.1 硬件准备
MCU和模组按照图 19 所示连接,如果模组由其他方式(USB、纽扣电池或5号干电池)供电,可不接VCC。如果需要指示功能,可选择性连接休眠指示引脚、串口数据指示引脚、连接状态指示引脚或数据拥塞指示引脚。
图 19 全功能电气连接(左)和最简功能电气连接(右)
最简功能设计原则:
- 如果用户不需要快速的数据传输, BUSY_IND 可不接;
- 如果用户不需要通过引脚获取蓝牙的连接状态, CONN_IND 可不接,如果用户不需要通过引脚关闭蓝牙的广播功能, BT_CTL 可直接接地,使模组保持广播状态,此时也可通过指令控制模组的蓝牙功能;
- 如果用户不需要通过引脚获取模组的功耗模式, PWR_IND 可不接,如果用户不关心模组的功耗, PWR_CTL 可直接接地,使模组保持唤醒状态,此时可通过指令控制模组的功耗模式(RX 唤醒模式);
- 如果用户的 MCU 不需要休眠或者在休眠状态下也能接收 UART 数据, DOUT_IND 可不接;
如果用户不需要通过引脚控制模组的指令/透传模式切换, MODE_CTL 可直接接地,使模组保持指令模式,此时可通过指令控制模组的指令/透传模式切换(RX唤醒模式)。
3.2 软件准备
应用示例由Lierda提供示例源码文件,用户只需要根据特定的嵌入式平台实现平台相关的驱动代码即可。源码文件如图 20 所示。
图 20 源码文件
3.2.1 Lsd_ble_uart_driver.x
串口驱动源文件/头文件,提供处理串口指令和控制/指示IO的驱动函数,一般情况下用户无需做任何修改,驱动函数调用方法详见Lsd_ble_uart_driver.h中对每个驱动函数的注释,驱动函数调用示例参考My_ble_interface.c中的多个初始化和应用示例。
其中Ble_RcvChar()是串口接收函数,用户应该在收到串口数据时调用该函数。
3.2.2 Lsd_ble_uart_impl.x
底层驱动源文件/头文件,用户需要根据平台和函数说明自主实现各函数。其中IO_SetHighLevel()函数的具体实现如示例 1 所示(STM32平台代码,仅供用户参考,用户需根据自己的平台修改),IO_SetLowLevel()和IO_GetCurrentLevel()接口的实现方式类似,要注意IO_XXX_CTL和XX_CTL_PIN类型宏的使用。
- void IO_SetHighLevel(unsigned char iosignal)
- {
- switch (iosignal)
- {
- case IO_PWR_CTL:
- {
- GPIO_SetBits(GPIOB, PWR_CTL_PIN);
- break;
- }
- case IO_BT_CTL:
- {
- GPIO_SetBits(GPIOB, BT_CTL_PIN);
- break;
- }
- case IO_MODE_CTL:
- {
- GPIO_SetBits(GPIOB, MODE_CTL_PIN);
- break;
- }
- case IO_RESET:
- {
- GPIO_SetBits(GPIOB, RESET_PIN);
- break;
- }
- default:
- {
- break;
- }
- }
- }
复制代码示例 1 IO_SetHighLevel()函数
3.2.3 My_ble_interface.x
应用示例用到的接口源文件/头文件,用户既可作为入门演示代码使用,也可作为实际项目开发过程中的参考代码使用。如果用户要实现示例代码的功能,在My_ble_interface.h中有以下几项需要用户处理:
- MAX_RCVTIME —— 串口接收超时时间,用户自定义
- AIM_BAUDRATE —— 用户选择的目标波特率,用户自定义
- Control Pin —— 用户使用平台的引脚号,用户自定义
- PIN_INIT宏定义接口,用户自主实现
- UART_INIT宏定义接口,用户自主实现
以下两个跟串口接收超时相关的函数需要在合适的地方调用:
- App_RunTimer(),建议放到定时器超时中断中,定时器超时时间会影响串口接收的超时时间,详细信息参考MAX_RCVTIME宏的注释。
- App_TimerTick(),建议放到主任务中,不断轮询检查串口接收超时的状态,如果超时,及时处理收到的数据,示例用法参考下文。
3.2.4 main.c
应用示例的一个具体实现,仅供用户参考,用户可将该文件移植到已有工程中。初始化时序参考main.c的实现即可,主循环中的应用示例代码可分别演示,应用示例分析参考下文。
- #include "My_ble_interface.h"
- #include "Lsd_ble_uart_driver.h"
- // 根据平台调整数组大小
- //#define BUF_SIZE 2000
- //unsigned char buf[BUF_SIZE];
- int main(void)
- {
- /*
- ...some other initialize codes
- */
- App_Start_Ble_Module(PWR_ON, BT_ON, MODE_CMD); //初始化I/O控制
- App_Init_Ble_Uart(); //初始化串口
- App_Init_Ble_Settings(); //修改默认参数
- Ble_setIoControl(IO_MODE_CTL, MODE_DATA); //切换到透传模式
- Ble_setIoControl(IO_PWR_CTL, PWR_OFF); //允许休眠节省功耗
- /*
- ...some other initialize codes
- */
- while (1)
- {
- App_TimerTick();
- App_EchoData();
- //App_SendMassData(buf, BUF_SIZE);
- //App_EchoWithCmd();
- /*
- ...some other tasks codes
- */
- }
- }
复制代码示例 2 main.c参考代码
3.3 应用示例分析
3.3.1 示例 3:透传模式数据回传
为了最大限度降低模组功耗,只有在模组收到数据时才会唤醒模组回传数据,回传结束即刻进入休眠模式。为了防止串口数据粘连,每两次串口发送之间间隔至少5毫秒。
示例 3 的现象:手机连接模组,发送数据给模组,手机端会收到模组原样返回的数据。
- void App_EchoData(void)
- {
- if (app_data_evt)
- {
- Ble_setIoControl(IO_PWR_CTL, PWR_ON); // 唤醒
- while (Ble_getRcvSize())
- {
- unsigned int len = Ble_ReadData(100, databuf);
- if (len > 0)
- {
- Ble_SendData(databuf, len);
- Lsd_delay_ms(5);
- }
- }
- Ble_setIoControl(IO_PWR_CTL, PWR_OFF); // 休眠
- app_data_evt = 0;
- }
- }
复制代码示例 3 App_EchoData()函数
3.3.2 示例 4:发送大量数据
大量数据发送需要使用数据拥塞指示引脚,当引脚指示拥塞时应暂停发送,等待发送完成,指示空闲时应继续发送不超过200字节的数据。为了防止串口数据粘连,每两次串口发送之间间隔至少5毫秒。
示例 4 的现象:手机连接模组,使能接收通道Notify功能,手机端会收到大量数据。
- void App_SendMassData(unsigned char *data, unsigned int size)
- {
- Ble_setIoControl(IO_PWR_CTL, PWR_ON); // 唤醒
- Ble_setIoControl(IO_MODE_CTL, MODE_DATA); // 切到透传
- unsigned int idx = 0;
- for (idx = 0; idx < size;)
- {
- while ((!Ble_getIoIndicate(IO_BUSY_IND))); // 拥塞时等待
- unsigned char pkt_size = ((size - idx) < 200) ? (size - idx) : 200;
- Ble_SendData(&data[idx], pkt_size);
- Lsd_delay_ms(5);
- idx += pkt_size;
- }
- Ble_setIoControl(IO_PWR_CTL, PWR_OFF); // 休眠
- }
复制代码示例 4 App_SendMassData()函数
3.3.3 示例 5:指令模式数据回传
指令模式数据回传和透传模式数据回传类似,为了最大限度降低模组功耗,只有在模组收到数据时才会唤醒模组回传数据,回传结束即刻进入休眠模式。为了防止串口数据粘连,每两次串口发送之间间隔至少5毫秒。
示例 5 的现象:手机连接模组,手机端使用远程数据发送指令发送数据给模组,手机端会依次返回指令响应帧和已发送的数据。
- void App_EchoWithCmd(void)
- {
- unsigned char status;
- Ble_setIoControl(IO_MODE_CTL, MODE_CMD); // 切到指令
- if (dataLen > 0)
- {
- Ble_setIoControl(IO_PWR_CTL, PWR_ON); // 唤醒
- App_BleCmdHandle(&status, (void *)0, (void *)0, 0, CMD_SEND_DATA, dataLen, databuf);
- Ble_setIoControl(IO_PWR_CTL, PWR_OFF); // 休眠
- dataLen = 0;
- }
- }
复制代码示例 5 App_EchoWithCmd()函数
4、资料列表
|