配色: 字号:
项目五 蓝牙无线通信技术应用设计
2022-10-27 | 阅:  转:  |  分享 
  
项目五 蓝牙无线通信技术应用设计2019/12/24任务5.1 基于BLE协议栈的串口通信【任务描述】设计蓝牙模块与PC串口通信系统,要求蓝
牙模块上电时,向串口发送“Hello NEWLab!”,并在PC的串口调试软件上显示;另外,在串口调试软件上发送信息给蓝牙模块时,
蓝牙模块收到信息后,立刻原样返回串口接收到的数据给串口调试软件,并显示出来。【任务环境】硬件:NewLab平台1套、蓝牙模块1个、
PC机1台。软件:Windows 7/10, IAR 集成开发环境,协议栈BLE-CC254x-1.3.2,串口调试助手。【必备知
识点】蓝牙技术概念蓝牙协议栈安装与使用5.1.1蓝牙技术概念蓝牙无线技术是全球使用范围最广的短距离无线标准之一,蓝牙 4.0 版本
综合了传统蓝牙,高速蓝牙和低功耗蓝牙等三种蓝牙技术,它集成了蓝牙技术在无线连接上的固有优势,同时增加了高速蓝牙和低功耗蓝牙的特点。
低功耗蓝牙(Bluetooth Low Energy),简称BLE,是蓝牙 4.0 的核心规范。BLE协议栈是由蓝牙技术联盟在蓝牙
4.0 的基础上推出的低功耗蓝牙通信标准,双方需要共同按照这一标准进行正常的数据发射和接收。在BLE协议栈中包括一个小型操作系统
(抽象层OSAL),由其负责系统的调度。操作系统的大部分代码被封装在库代码中,用户查看不到的。对于用户来说,只能使用API来调用相
关库函数。BLE协议栈中定义了GAP(Generic Access Profile)和GATT(Generic Attribute
)两个基本配置文件,其中GAP层负责设备访问模式和进程,包括设备发现、建立连接、终止连接、初始化安全特性、设备配置等;GATT层用
于已连接的设备之间的数据通信。【任务实训步骤】第1步,搭建串口通信电路。将蓝牙模块中CC2541芯片的RX(P0.2)与JP705
的EP703相连,TX(P0.3)与JP704的EP704相连,并将蓝牙模块固定在NEWLab平台上。然后给CC2541上电(用导
线将nBT_PWR与地相连,即JP702第2插孔(从左到右算)与CN722相连)。第2步,打开SimpleBLEPeriphera
l工程。打开C:\Texas Instruments\……\ble\SimpleBLEPeripheral\CC2541DB目录下
的SimpleBLEPeripheral.eww工程,在Workspace栏内选择CC2541。第3步,串口初始化。打开工程中NP
I文件夹下的npi.c文件,串口初始化函数void NPI_InitTransport( npiCBack_t npiCBack
)对串口号、波特率、流控、校验位等进行配置。void NPI_InitTransport( npiCBack_t npiCBack
){ halUARTCfg_t uartConfig; uartConfig.configured = T
RUE; uartConfig.baudRate = NPI_UART_BR; uartConfig.
flowControl = NPI_UART_FC; uartConfig.flowControlThresh
old = NPI_UART_FC_THRESHOLD; uartConfig.rx.maxBufSize = N
PI_UART_RX_BUF_SIZE; uartConfig.tx.maxBufSize = NPI_UART_
TX_BUF_SIZE; uartConfig.idleTimeout = NPI_UART_IDLE_TIM
EOUT; uartConfig.intEnable = NPI_UART_INT_ENABLE; ua
rtConfig.callBackFunc = (halUARTCBack_t)npiCBack; (void)
HalUARTOpen( NPI_UART_PORT, &uartConfig ); return; }【任务实训步骤】第4
步,串口发送数据。打开simpleBLEPeripheral.c文件中的初始化函数void SimpleBLEPeripheral
_Init(uint8 task_id),在此函数中添加NPI_InitTransport(NULL),在后面再加上一条上电提示H
ello NEWLab!的语句,添加头文件语句: #include “npi.h”。连接下载器和串口线,下载程序,就可以看到串口调
试软件收到Hello NEWLab!的信息,如图所示,通过NPI_WriteTransport(uint8 ,uint16)函数
实现串口发送功能。【任务实训步骤】第5步,串口接收数据。在simpleBLEPeripheral.c文件声明串口回调函数stati
c void NpiSerialCallback(uint8 port,uint8 events),并在void SimpleBL
EPeripheral_Init(uint8 task_id)函数中传入串口回调函数,将NPI_InitTransport(NUL
L)修改为:NPI_InitTransport(NpiSerialCallback)。当串口特定的事件或条件发生时,操作系统就会使
用函数指针调用回调函数对事件进行处理。具体处理操作在回调函数中实现。static void NpiSerialCallback(u
int8 port,uint8 events){ (void)port; uint8 numBytes=0; uint8 bu
f[128]; if(events & HAL_UART_RX_TIMEOUT) //串口有数据 { numBytes=N
PI_RxBufLen(); //读出串口缓冲区有多少字节 if(numBytes) { NPI_ReadT
ransport(buf,numBytes); //从串口缓冲区读出numBytes字节数据 NPI_WriteT
ransport(buf,numBytes); //把串口接收到的数据再打印出来 } } }【任务实训步骤】第6步,
串口显示SimpleBLEPeripheral工程初始化信息。TI官方的例程是利用LCD来输出信息的,我们的设备没有LCD,但我们
可以利用UART来输出信息,具体步骤如下:1. 打开工程目录中HAL\Target\CC2540EB\Drivers\hal_lc
d.c文件,在HalLcdWriteString函数中添加以下代码:#ifdef LCD_TO_UART NPI_Write
Transport ( (uint8)str,osal_strlen(str)); //串口显示 NPI_WriteTra
nsport ("\n",1); //换行#endif2. 在预编译中添加LCD_TO_UART, HAL_LCD=TR
UE需要打开,并且在hal_lcd.c文件中添加#include “npi.h”,编译无误后,下载程序,模块上电后,打开串口调试助
手,可以看到图所示结果。【任务实训步骤】【技能拓展】本项目采用npi.c文件中现有的串口配置函数来实现串口收发功能,请大家在Sim
pleBLEPeripheral.c文件中自己编写串口配置函数,实现串口收发功能。任务5.2 基于BLE协议栈的无线点灯【任务描述
】使用BTool控制接口命令(BTool工具是PC端一个应用程序,可以作为BLE主机),使PC与蓝牙模块(从机)进行连接、数据传输
,从而通过BTool工具控制蓝牙模块上的LED灯亮和灭。【任务环境】硬件:NewLab平台1套、蓝牙模块1个、PC机1台。软件:W
indows 7/10, IAR 集成开发环境,协议栈BLE-CC254x-1.3.2,BTool工具。【必备知识点】1. 主机与
从机数据建立连接的流程;2. BLE应用数据传输过程分析。5.2.1 主、从机数据建立连接流程以TI提供的SimpleBLEPer
ipheral和SimpleBLECentral工程为例,从机与主机之间建立连接的流程如图5-6所示。图5-6 主从机之间建立连接
流程图5.2.2 BLE应用数据传输过程 主机与从机建立连接之后,会进行服务发现、特征发现、数据读写等数据传输,应用数据传输流程如
图所示。当主机需要读取从机中提供的应用数据时,首先主机进行GATT数据服务发现,给出想要发现的主服务UUID,只有主服务UUID匹
配,才能获得GATT数据服务。主机与从机数据传输过程: 首先从机发起搜索请求,搜索正在广播的节点设备,若GAP服务的UUID相匹配
,则主机与节点设备可以建立连接。 主机发起建立连接请求,节点设备响应后,主机与从机建立连接。 主机发起主服务UUID进行GATT服
务发现。 发现GATT服务后,主机发送要进行数据读写操作的特征值的UUID,获取特征值的句柄,即采用发送UUID方式获得句柄。 通
过句柄,对特征值进行读写操作。 Profile规范是一种标准通信协议,定义了设备如何实现一种连接或者应用。Profile规范
存在于从机中,蓝牙组织规定了一系列的标准Profile规范,例如 HID OVER GATT、防丢器、心率计等。同时,产品开发者也
可以根据需求自己新建Profile,即非标准的 Profile规范。1. GATT服务(GATT Server)BLE协议栈的GA
TT层是用于应用程序在两个连接设备之间的数据通信。当设备连接后,主机将作为GATT Client,是从GATT服务器读/写数据的设
备;从机将作为GATT Server,是包含客户端(主机)需要读/写数据的设备。在BLE从机中,每个Profile中会包含多个GA
TT Server,每个GATT Server代表从机的一种能力。而且每个GATT Server里又包括了多个特征值(Charac
teristic),每个具体的特征值,才是BLE通信的主体。例如:某电子产品当前的电量是70%,所以会通过电量的特征值存在从机的
profile 里,这样主机就可以通过这个特征值来读取当前电量。2. 特征值(Characteristic)BLE 主从机的通信均
是通过 Characteristic 来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。3. 统一识别码(UUI
D)GATT Service 和 Characteristic,都需要一个唯一的UUID来标识。GATT主服务的UUID为FFF0
,特征值1、特征值2、……的UUID依次为FFF1、FFF2、……。4. 句柄(handle)GATT 服务将整个服务加到属性表中
,并为每个属性分配唯一的句柄。在BLE协议栈中,数据发送包括主机向从机发送数据和从机向主机发送数据,即前者是 GATT的clien
t主动向service发送数据;后者是GATT的service主动向client发送数据,其实是从机通知主机来读数据。1. 主机向
从机发送数据在主从机已建立连接的状态下,主机通过特征值的句柄对特征值的写操作,思路如下:首先,主机对句柄、发送数据长度等变量进行填
充,再调用GATT_WriteCharValue 函数实现向从机发送数据。typedef struct{ uint16 hand
le; uint8 len; uint8 value[ATT_MTU_SIZE-3]; // ATT_M
TU_SIZE为23,规定长度长度为20 uint8 sig; uint8 cmd;
} attWriteReq_t;//
attWriteRe
q_t req; //定义结构体变量reqreq.handle = simpleBLECharH
dl; //填充句柄req.len = 1; //填充发送数据长度req.value[0] = simpleB
LECharVal; //填充发送数据req.sig = 0; //填充信号状态req.cmd = 0;
//填充命令标志status = GATT_WriteCharValue( simpleBLEConnHandle, &
req, simpleBLETaskId ); 2. 从机向主机发送数据首先主机应开启特征值的通知功能,从机再调用 GATT_
Notification 函数,或者修改带通知功能的特征值,通知主机来读数据,实现从机向主机发送数据,而不是像主机那样调用GATT
_WriteCharValue 函数实现数据传输。在 BLE 协议栈中,数据接收包括主机接收从机发来数据和从机接收主机发来的数据。
1. 主机接收从机发送数据在主从机已建立连接的状态,主机通过特征值的句柄对特征值的读操作,思路如下:首先,调用 GATT_Read
CharValue函数读取从机的数据。attReadReq_t req;req.handle = simpleBLECharHdl
; //填充句柄status = GATT_ReadCharValue( simpleBLEConnHandle, &req, s
impleBLETaskId );2. 从机接收主机发送数据当从机接收到主机发来的数据后,从机会产生一个 GATT Profile
Callback 回调,在simpleProfileChangeCB()回调函数中接收主机发送的数据。这个 callback 在
从机初始化时向Profile 注册。static simpleProfileCBs_t simpleBLEPeripheral_S
impleProfileCBs ={ simpleProfileChangeCB }; // Charactersitic
value change callback// Register callback with SimpleGATTprofile
注册特征值改变时的回调函数 VOID SimpleProfile_RegisterAppCBs( &simpleBLEPeri
pheral_SimpleProfileCBs ); //
static void sim
pleProfileChangeCB( uint8 paramID ){ uint8 newValue; switch( par
amID ) { case SIMPLEPROFILE_CHAR1: //特征值1编号 SimpleProfile_
GetParameter( SIMPLEPROFILE_CHAR1, &newValue );//获得特征值 ……【任务实训步骤】
如果没有USB Dongle板,可以采用一块蓝牙模块来代替,这里采用代替方式。1.向蓝牙模块中写入固件“HostTestRelea
se工程”,制作USB Dongle板。打开HostTestRelease.eww工程,路径为:…\Projects\ble\Ho
stTestApp\CC2541,在Workspace栏内选择“CC2541EM”。由于蓝牙模块的串口未采用流控功能,因此要禁止串
口流控,方法如下:(1)打开hal_uart.c文件,找到uint8 HalUARTOpen(uint8 port, halUAR
TCfg_t config)函数,可以看到if (port == HAL_UART_PORT_0) HalUARTOpenDM
A(config);代码,右击选择“go to definition of HalUARTOpenDMA(config)”。(2)
在static void HalUARTOpenDMA(halUARTCfg_t config)函数中增加关闭流控代码。2.编译
程序,下载到蓝牙模块中。3.打开 BTool(安装了BLE协议栈,就可以在【所有程序】->【Texas Instruments】中
找到该工具),可看到BTool启动界面,需要用户设置串口参数,点击【OK】连接BTool工具,连接界面如图所示。【任务实训步骤】第
二步,制作蓝牙从机。打开SimpleBLEPeripheral.eww工程,路径为:…\ble\SimpleBLEPeripher
al\CC2541DB,下载到另一个蓝牙模块之中。注意:参照任务5.1修改,实现蓝牙模块与PC的串口通信功能,以便从机的信息在串口
调试软件上显示。第三步,使用BTool工具。1.扫描节点设备首先使USB Dongle板(主机)和蓝牙模块(从机)复位,然后在BT
ool工具的设备控制界面区域内,选中“Discover/Connect”选项卡,再点击“Scan”按钮,对正在发送广播的节点设备进
行扫描。默认扫描10s,扫描完成后,会在右侧的窗口中显示扫描到的所有设备个数和设备地址,如图所示。若不想等10s,可以单击“Can
cel”停止扫描,则在右侧的窗口中显示当前已经扫描到的设备个数和设备地址。【任务实训步骤】2.连接参数设置在建立设备连接之前,设置
的参数包括:最小和最大的连接间隔、从机延时、管理超时。可以使用默认参数,也可以针对不同的应用来调整这些参数。设置好参数后,点击“S
et”按钮才能生效,注意参数修改必须在建立连接之前操作。3.建立连接在“Slave BDA”栏选择将与从机建立连接的节点设备地址,
然后单击“Establish” 按钮建立连接。此时节设备的信息会出现在窗口左侧,同时在从机的串口调试端显示“Connected”已
连接提示字符,如图所示。【任务实训步骤】4.对SimpleProfile 的特征值进行操作SimpleGATTProfile 中包
含5个特征值,每个特征值的属性都不相同,如表所示。第4步,修改从机程序,实现无线点灯。采用SimpleGATTProfile中的第
一个特征值CHAR1来作为LED 亮灭的标志。1.修改服务器(从机)程序。具体程序代码见本教材资源。2.编译程序,下载到蓝牙模块中
;并且主从机建立连接。首先要在预编译中设置“HAL_LED=TRUE”(默认设置为HAL_LED=FALSE),然后编译、下载程序
。3.控制LED1亮或灭。向CHAR1写入特征值。在“Characteristic Value Handle”栏内输入CHAR1的句柄0x0025;然后输入“1”或者“0”,再点击“Write”按钮,如图5.26。则在从机的串口调试端显示被写入的特征值,如图5.27。同时,当写入“1”时,LED1亮;当写入“0”时,LED1灭。【技能拓展】1.增加节点设备数量,USB Dongle板(主机)与多个节点设备建立连接,并通过BTool工具进行特征值读写。2.采用蓝牙模块作为主从机,通过主机的按键来控制从机上的LED1亮和灭。【知识点小结】低功耗蓝牙(Bluetooth Low Energy),简称BLE,是蓝牙 4.0 的核心规范。BLE 是由蓝牙技术联盟(Bluetooth SIG)设计的无线通讯技术,主要用于医疗,健身,安全和家庭娱乐行业。 与传统蓝牙相比,蓝牙低功耗旨在大幅降低功耗和成本,同时也能够达到相同的通讯效果。BLE协议栈包括一个小型操作系统(抽象层OSAL)——由其负责系统的调度。操作系统的大部分代码被封装在代码库中,对用户不可见。用户只能使用API来调用相关库函数。【拓展与思考】增加节点设备数量,USB Dongle板(主机)与多个节点设备建立连接,并通过BTool工具进行特征值读写。采用蓝牙模块作为主从机,通过主机的按键来控制从机上的LED1亮和灭。
献花(0)
+1
(本文系籽油荃面原创)