4 系统软件设计
4.1 BLE蓝牙协议栈介绍
协议定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发;协议栈是协议的具体实现形式,通俗的理解为用代码实现的函数库,以便于开发人员调用。蓝牙4.0 BLE 协议栈就是将各个层定义的协议栈都集合在一起,以函数的形式实现,并提供一些应用层API,供用户调用。
值得注意的是,虽然协议是统一的,但是协议的具体实现形式是变化的,即不同的厂商提供的协议栈是有区别的。
蓝牙4.0 BLE协议栈具有很多版本,不同的厂商提供的蓝牙 4.0 BLE协议栈有一定的区别,本次的毕业设计选择的是TI公司推出的蓝牙4.0 BLE协议栈 BLE—CC254x—1.3.2.
TI公司推出的新一代蓝牙4.0 BLE协议栈由两个部分组成:主机和控制器。主机和控制器的分离要追溯到蓝牙BR/EDR设备时期,控制器和主机通常会分开实现。
协议栈的实现方式采用分层的思想,控制器部分包括:物理层、链路层、主机控制接口层;
主机部分包括:逻辑链路控制及自适应协议层、安全管理层、属性协议层、通用访问配置文件层、通用属性配置文件层,如图4-1所示:
17
图4-1 蓝牙4.0 BLE协议栈
蓝牙4.0 BLE协议栈采用分层思想将服务、接口和协议这三个概念明确地区分开来。这样各层之间具有很强的独立性,当协议的一部分发生变化时,只需对与此相关的分层进行修改即可,其他各层不需要改变。
物理层(Physical Layer)是1Mbps自适应跳频的GFSK射频,工作于免许可证的2.4Ghz ISM(工业、科学和医疗)频段。
链路层(Link Layer)用于控制设备的射频状态,设备将会处于五种状态之一:等待、广告、扫描、初始化、连接。广告设备不需要建立连接就可以发送数据;而扫描设备收听广播设备发出的数据;发起连接的设备通过发送连接请求来回应广播设备,如果广播设备接受连接请求,那么广播设备与发起连接的设备将会进入连接状态。
主机和控制器之间的标准的通信接口是在主机控制器接口层实现的。这一层可以是软件API或硬件接口,如UART、SPI、USB。
逻辑链路控制及自适应协议层(Logical Link Control and Adaptation Protocol)为上层提供数据封装服务,允许逻辑上的点对点数据通信。
安全管理层(Security Manager)定义了配对和密钥方式,并为协议栈其它层与另一个设备之间的安全连接和数据交换提供服务。
18
属性协议层(Atttibute protocol)允许设备向另一个设备展示一块特定的数据,称之为“属性”。在ATT环境中,展示“属性”的设备称为服务器,与之配对的设备称为客户端。链路层状态(主机和从机)与设备的ATT角色是相互独立的。
通用属性配置文件层(Generic Attribute profile)是在ATT 上面的一层结极,定义了使用ATT 的服务框架,GATT 规定了配置文件(鼎鼎有名的profile)的结极,在BLE 中,所有被profile 戒者服务用刡的数据块都称为“特性,characteristic”两个建立连接的设备之间的所有数据通信都是通过GATT 子程序处理,应用程序和profile 直接使用GATT 层。
TI公司免费的蓝牙4.0 BLE软件开发套件是完整地支持单模蓝牙4.0 BLE应用开发的平台,它基于CC2540/CC2541射频单片机,蓝牙4.0 BLE软件平台支持两种不同的应用开发配置。
4.2 操作系统抽象层OSAL
OSAL(操作系统抽象层)是类似于一个系统的抽象层,但它不是一个真正意义上的操作系统。
OSAL常用术语:
资源、共享资源、任务。在任务设计时,需要将问题尽可能地分为多个任务,每个任务独立完成某种功能,同时被赋予一定的优先级,拥有自己的CPU寄存器和堆栈空间。内核:使用内核可以大大简化应用系统的程序设计方法,借助内核提供的任务切换功能,可以将应用程序分为不同的任务来实现。
保护共享资源最常用的方法是: ? 关中断;
? 使用测试并置位指令; ? 禁止任务切换; ? 使用信号量。
其中,在蓝牙4.0 BLE协议栈内嵌操作系统中,经常使用的方法是关中断。在蓝牙4.0 BLE协议栈中,OSAL主要提供如下功能:
? 任务注册、初始化和启动; ? 任务间的同步、互斥; ? 中断处理; ? 存储器分配和管理; ? 提供定时器功能。
在新推出的蓝牙4.0 BLE协议栈中,其中有三个变量值得一提:
19
tasksCnt:该变量保存了任务的总个数。
该变量的声明为:uint8 taskCnt。其中uint8的定义为:typedef unsigned char uint8。 taskEvents:这是一个指针;
该变量的声明为:uint16 *taskEvents。其中uint16的定义为:typedef unsigned short uint16。
taskArr:这是一个数组;
该数组的声明为:pTaskEventHandlerFn taskArr[].这是一个函数指针,指向了对应的事件处理函数。
4.3 硬件抽象层 HAL
硬件抽象层(HAL)是提供硬件服务而又不涉及太多硬件细节的层,为应用提供访问GPIO、UART、ADC等硬件的接口。
硬件抽象层文件目录如图4-2所示:
图4-2 HAL文件目录
硬件抽象层文件目录包括HAL驱动和HAL相关文件的头文件,HAL文件存放在三个不同的目录之下,HAL Common文件夹包含协议栈、MAC和驱动中使用到相关配置文件。其中“hal_drivers.c”文件包含所有驱动初始化及相关事件处理机制。主要包括以下三个函数:
HAL_Init()它是osaltaskadd调用,以便在OSAL中注册HAL的驱动; HALdriverInit()它是main()函数调用来初始化硬件驱动。
HAL_processevent()这个函数用来处理OSAL中HAL相关的驱动事件,例如按键、LED、LCD、蜂鸣器、休眠定时等。
HAL Include文件夹包含HAL驱动及HAL相关文件的头文件,如图4-3所示:
20
图4-3 Include文件下头文件
HAL Target文件夹下的Drivers包含所有HAL驱动的“.c”文件。
4.4 配置文件层
蓝牙4.0 BLE协议栈的配置文件层包括GAP角色/安全配置文件、GATT配置文件两部分。
(1)通用访问配置文件(GAP):
BLE协议栈中的GAP层负责处理设备访问模式和程序,包括设备发现、建立连接、终止连接、初始化安全特色和设备配置。
GAP层总是作为下面四种角色之一: 广播者—不可连接的广告设备; 观测者—扫描广播,但不发起建立连接;
外部设备—可连接的广告设备,可以在单个链路层连接中作为从机;
集中器—扫描广告设备并发起连接,在单链路层或多链路层作为主机,目前,BLE协议栈支持一个集中器连接三个外设。
在典型的蓝牙低功耗系统中,外部设备广告特定的数据,来使集中器知道它是一个可以连接的设备。广告内容包括设备地址以及一些额外的数据,如设备名等。集中器收到广告数据后,向外部设备发送扫描请求,然后外部设备将特定的数据回应给集中器,称为扫描回应。集中器收到扫描回应后,便知道这是一个可以建立连接的外部设备,这
21