打开主菜单

谷雨文档中心 β

更改

NRF52832DK协议栈实验

添加78字节2019年8月19日 (一) 14:54
无编辑摘要
= '''= 蓝牙协议简介''' ==
=== 简介 ===
我们的蓝牙协议实验部分,将会给大家带来最直观的蓝牙协议部分的学习,我们通过拆分的方式,带领大家深入了解蓝牙协议的主要功能部分。
|}
=== 扫描参数① ===
==== 主机扫描核心参数 ====
主机扫描核心参数主要是4个,也就是说这4个参数是不可获取的,必须要配置的。分别是扫描间隔interval、扫描窗口window、扫描持续时长duration、扫描模式active。
2、active配置0,被动扫描模式,只可以获取从设备的广播数据
[[文件:BLE技术 扫描窗口和扫描间隔.jpg|居中|无框|520x520像素]]
==== 主机扫描特殊应用参数 ====
extended:这个是用于BLE5.0协议中新增的大广播包数据,定义为1,才可以获取到外部大广播包
channel_mask:扫描的信道(暂时不清楚此参数如何使用)
=== 广播数据② ===
==== BLE4.x广播数据 ====
BLE4.x的蓝牙广播数据包,最大是31byte,遵循的方式如下,首先是数据的长度、紧接着是数据类型,最后才是数据内容。
|}
==== BLE5.x新增大广播包数据 ====
=== 连接参数③ ===
参数如下:
'''Supervision Time-out监控超时''',是两次成功连接事件之间的最长时间。如果在此时间内没有成功的连接事件,设备将终止连接并返回到未连接状态。该参数值以10 ms为单位,监控超时值可以从最小值10(100 ms)到3200(32.0 s)。超时必须大于有效的连接间隔。
==== Effective Connection Interval有效连接间隔 ====
有效连接间隔等于两个连接事件之间的时间跨度,假设从机跳过最大数量的连接事件,且允许从机延迟(如果从机延迟设置为0,则有效连接间隔等于实际连接间隔,)。
当没有数据从从机发送到主机时,从机每500ms一个连接事件交互一次。
==== 连接参数的注意事项 ====
在许多应用中,从机跳过最大连接事件数。选择正确的连接参数组在低功耗蓝牙设备的功率优化中起重要作用。以下列表给出了连接参数设置中权衡的总体概述。
l  增加外设设备接收从主机设备发送的数据的时间
=== 连接句柄④ ===
设备的连接句柄范围是从0x0000-0xFFFD,当然我们实际使用,也连接不了这么多的设备。
0xFFFF:断开的句柄。当设备与之断开连接之后,句柄就会返回为0xFFFF。
=== MTU大小⑤ ===
MTU的大小,在BLE4.0的是时候,最大是只有27byte,当更新到BLE4.1向后,我们支持的MTU最大是251字节。
注意: 使用LE数据长度分机功能时,LE包的长度最多可达251字节。
=== 服务⑥ ===
=== 服务句柄⑦ ===
=== 使能通知⑧ ===
=== 属性⑨ ===
== 蓝牙协议实验 ==
蓝牙协议实验部分,我们借由串口透传实验,一步一步拆分,给大家介绍蓝牙的协议方面。
|}
=== 低功耗实验 ===
==== 实验简介 ====
低功耗实验1.0_ble_central_pm与2.0_ble_peripheral_pm,这两个实验给大家带来的是最精简的主机以及从机例程,精简到什么程度呢,只保留了协议栈初始化以及电源管理部分。利用此实验,大家可以测试一下我们的BLE工程进入低功耗模式下的功耗情况。
==== 实验现象 ====
我们将万用表串联到电路中,并且打到电流档,此时我们可以看到功耗如下。
==== 工程及源码讲解 ====
===== 主机部分 =====
====== main()函数 ======
首先我们查看一下main.c文件,在此文件的mian()函数中,我们首先初始化了电源管理模块,然后初始化了BLE栈堆,最后在while大循环中我们调用空闲状态处理的函数。
</syntaxhighlight>
====== ble_stack_init()函数及ble_evt_handler()回调函数 ======
我们查看一下BLE协议栈初始化,这个部分是一个格式化的东西。
</syntaxhighlight>
====== power_management_init()及idle_state_handle()函数 ======
power_management_init()函数调用底层的nrf_pwr_mgmt_init()函数去初始化电源管理的部分。
</syntaxhighlight>
===== 从机部分 =====
====== ble_stack_init()函数 ======
从机部分大体上是和主机一样的,在nordic的协议栈例程中,(如果大家对BLE协议有一定的了解或者使用过其他厂家的BLE芯片)我们可以发现,nordic为了简化BLE的开发难度,可谓是不择手段,他减掉了很多的ble协议相关的内容(这里的减掉指的是放到底层处理,不需要开发者去配置),这其中就包含了GAP Role,也就是蓝牙的角色。
NRF_SDH_BLE_PERIPHERAL_LINK_COUNT与NRF_SDH_BLE_CENTRAL_LINK_COUNT,在定义最大连接设备数量的同时,也决定了它本身的角色属性。
===== BLE中我们称Central中心设备为主机(发起连接的设备)、Peripheral外部设备为从机(广播等待被连接的设备)。 =====<syntaxhighlight lang="c" line="1" start="103">
ret_code_t nrf_sdh_ble_default_cfg_set(uint8_t conn_cfg_tag, uint32_t * p_ram_start)
{
2.了解如何进行低功耗处理(main()函数中while循环的idle_state_handle空闲任务处理函数)。
=== LOG打印实验 ===
==== 实验简介 ====
LOG打印实验1.1_ble_central_log与2.1_ble_peripheral_log,LOG打印实验是在低功耗实验的基础上,新增了LOG打印部分。
{{Note|text=注意:我们的LOG工程,仅针对RTT部分,没有介绍UART,UART的使用大家可以查看基础实验部分|type=warning}}
==== 实验现象 ====
我们打开J-Link RTT Viewer,选择我们的Jlink仿真器,可以看到log打印如下。
[[文件:Nrf rtt 11.png|边框|居中|无框|656x656像素]]
==== 工程及源码讲解 ====
===== 主机部分 =====
====== 工程说明 ======
我们在工程中,新增加了nRF_Log与nRF_Segger_RTT分组,这两个分组中分别包含了log打印的相关函数,以及RTT的相关函数。
{{Note|text=使用RTT,可以从目标微控制器输出信息,并以非常高的速度向应用程序发送输入,而不会影响目标的实时行为。
默认实现每个方向使用一个通道,用于可打印的终端输入和输出。使用J-Link RTT Viewer,该通道可用于多个“虚拟”终端,允许使用一个目标缓冲区打印到多个窗口(例如一个用于标准输出,一个用于错误输出,一个用于调试输出)。例如,可以使用附加的up(到主机)通道来发送分析或事件跟踪数据。|type=info}}
====== main()函数 ======
log打印实验相对于前一章节的低功耗实验,新增的功能并不多,我们仅仅添加了LOG的RTT打印功能,这边我们首先还是看下mian函数。
</syntaxhighlight>
====== log_init()函数以及底层调用 ======
我们查看到log_init()函数,先调用NRF_LOG_INIT()函数初始化LOG,然后我们调用NRF_LOG_DEFAULT_BACKENDS_INIT()函数来决定LOG的底层调用。<syntaxhighlight lang="c" line="1" start="140">
//******************************************************************
</syntaxhighlight>
====== NRF_LOG_XX()函数说明 ======
上面说明了如何去初始化LOG向RTT打印的功能,下面我们将给大家介绍一下LOG打印的函数,毕竟这个才是我们真正要用到的部分。
</syntaxhighlight>
===== 从机部分 =====
从机部分与主机部分新增log功能相同,这边不再赘述。
==== 实验总结 ====
LOG打印实验,大家需要掌握的三个要点如下:
3.要善于使用log功能,这样有利于我们程序的流程开发及异常问题的查找和处理。
=== 通用扫描实验 ===
==== 实验简介 ====
通用扫描实验1.2_ble_central_scan_all与2.2_ble_peripheral_adv_all,给大家带来的是主机的扫描功能展示,以及从机的广播功能展示。
大家都清楚,低功耗蓝牙主从机间交互数据的方式一般来说是有两种,一种是连接之后通信(这个是蓝牙的主要功能),另一种就是本实验带来的主机扫描获取从机的广播数据。而上述的两种方式,不管是哪一种,都是需要扫描功能的,毕竟连接通信之前,我们的主机也是需要扫描到从机设备才可以发起连接。
==== 实验现象 ====
主机log打印如下,先打印当前例程的名称'''1.2_ble_central_scan_all''',然后将会打印扫描到的从机设备的信息,格式如下:<syntaxhighlight lang="c">
Device MAC: 0x010203040506 // 从机设备MAC地址
[[文件:Nrf rtt 22.png|边框|居中|无框|656x656像素]]
==== 工程及源码讲解 ====
===== 工程说明 =====
相对于LOG打印的工程,我们新增了nRF_BLE分组,这个分组下包含的就是BLE协议相关的文件,我们在本实验中只使用了nrf_ble_scan.c下的扫描功能函数。
[[文件:Nrf group nrf ble.png|边框|居中|无框|296x296像素]]
===== 主机部分 =====
====== main()函数 ======在mian函数中,我们新增了扫描功能的scan_init()初始化函数,并且在初始化所有功能之后,我们调用发起扫描的函数scan_start初始化函数,并且在初始化所有功能之后,我们调用了发起扫描的函数scan_start()。<syntaxhighlight lang="c" line="1" start="296">
//******************************************************************
// fn : main
</syntaxhighlight>
====== scan_init()函数及scan_evt_handler()回调函数 ======
首先我们看一下我们的扫描功能的初始化函数,可以看到我们最终调用的是库函数中的nrf_ble_scan_init()去初始化我们扫描,在这个函数中,有两个参数需要我们关注,一个是init_scan(这个参数携带的我们对于扫描的设置),另一个是scan_evt_handler(当我们扫描到设备之后,将会由这个回调函数返回事件信息给我们)。<syntaxhighlight lang="c" line="1" start="155">
//******************************************************************
510
个编辑