蓝牙40-BLE无线通信技术协议栈开发入门课件.ppt

上传人(卖家):晟晟文业 文档编号:5176495 上传时间:2023-02-16 格式:PPT 页数:138 大小:3.86MB
下载 相关 举报
蓝牙40-BLE无线通信技术协议栈开发入门课件.ppt_第1页
第1页 / 共138页
蓝牙40-BLE无线通信技术协议栈开发入门课件.ppt_第2页
第2页 / 共138页
蓝牙40-BLE无线通信技术协议栈开发入门课件.ppt_第3页
第3页 / 共138页
蓝牙40-BLE无线通信技术协议栈开发入门课件.ppt_第4页
第4页 / 共138页
蓝牙40-BLE无线通信技术协议栈开发入门课件.ppt_第5页
第5页 / 共138页
点击查看更多>>
资源描述

1、 认识蓝牙4.0 BLE协议栈 蓝牙4.0 BLE协议栈工作流程解析蓝牙4.0 协议栈串口通信功能的实现知识目标知识目标(1)掌握蓝牙4.0 BLE协议栈的工作原理和流程;(2)掌握蓝牙4.0 BLE协议栈的软件架构;(3)掌握蓝牙4.0 BLE协议栈串口通信机制。技能目标技能目标(1)掌握蓝牙4.0 BLE协议栈的安装、编译和下载;(2)掌握蓝牙4.0 BLE协议栈主机和从机工程的基本使用方法;(3)掌握蓝牙4.0 BLE协议栈应用层串口通信的设计实现方法。项目分析项目分析 本项目是学习蓝牙4.0 BLE无线数据通信技术的基础,将带领读者进入协议栈部分的学习。协议是一系列的通信标准,通信双方

2、需要共同按照这一标准进行正常的数据发送和接收。协议栈是协议的具体实现形式,虽然协议是统一的,但是协议的具体实现形式是有区别的,如在智能手机终端上广泛使用的Wi-Fi网络协议,则对于在安卓和iOS平台下的实现方法是不一样的。简单理解就是,协议栈是协议与用户之间的一个接口,开发人员通过使用协议栈来使用这个协议,进而实现无线数据的收发。在蓝牙4.0 BLE协议栈中已经实现了低功耗蓝牙(bluetooth low energy,BLE)协议,用户在进行应用程序开发时可以直接使用协议栈提供的API函数进行编程设计,在项目开发过程中完全不必关心BLE协议提供的具体细节,但需要理解其中的关键函数和协议栈的工

3、作流程,本项目也将通过任务进行重点解析。异步串行接口(UART,串口)可以反映程序运行过程中包括调试信息在内的各种信息。德州仪器(texas instruments,TI)的蓝牙4.0 BLE协议栈已经包含了对串口的支持,并增加了易用的外部API,即NPI,实现了串口的初始化,数据包的发送、接收,应用层向NPI模块注册回调函数等功能,本项目将带领读者一起实现协议栈串口的双工通信和调试信息的同步打印。图图4-1 4-1 蓝牙蓝牙4.0 BLE4.0 BLE模块与模块与PCPC的串口通信结构的串口通信结构任务一 蓝牙4.0 BLE协议栈的安装、编译和下载任务描述任务描述 本任务要求完成蓝牙4.0

4、BLE协议栈1.4.0的安装、编译和下载。知识链接知识链接 TI的蓝牙低功耗 BLE-Stack 1.4.0 软件堆栈是一款全功能的蓝牙 4.0 软件开发套件,适用于 TI 的 CC2540 和 CC2541 射频单片机芯片,并包含单模式蓝牙智能应用开发所需的所有软件。BLE-Stack 1.4.0 以免专利费形式向使用 TI 的 CC2540/41 蓝牙低耗能片上系统(SoC)产品系列的用户提供,读者可以访问 TI BLE Wiki 来获得更多的资源,如移植指南和示例应用等,网址为“http:/ 1.4.0 包括对象代码及最新的蓝牙低功耗协议堆栈,支持多个连接、示例项目和应用程序,这些应用程

5、序中涵盖了一组广泛的带有源代码的配置文件及 BTool(用于测试应用的 Windows PC 应用程序)。除了软件以外,此套件还包含文档,其中包括开发人员指南、示例应用指南和 API 指南等。(1)从官方网站“http:/ BLE协议栈。(2)双击“BLE-CC254x-1.4.0.exe”进行协议栈安装,整个安装过程比较简单,建议选择安装到默认的C盘根目录下,如图4-2所示。任务实施任务实施图图4-2 BLE-CC254x-1.4.04-2 BLE-CC254x-1.4.0版本的默认安装路径版本的默认安装路径图图4-3 BLE-CC254x-1.4.04-3 BLE-CC254x-1.4.0

6、协议栈的安装过程协议栈的安装过程 (3)TI蓝牙4.0 BLE协议栈中的相关文件及路径位置如图4-4所示。这里包含了TI提供的蓝牙4.0 BLE的相关实例和说明文档。图图4-4 TI4-4 TI蓝牙蓝牙4.0 BLE4.0 BLE协议栈中相关文件及路径位置协议栈中相关文件及路径位置 具体内容如下。Accessories目录:包含了一些工具和已经编译好的Hex文件,此文件夹中有BTool的安装包和USB-CDC的驱动等,如图4-5 所示。图图4-5 4-5 协议栈协议栈AccessoriesAccessories目录目录 Components目录:包含了hal驱动、osal源码、协议栈通用源码,

7、此文件夹是 osal 各层组件的具体实现,如图4-6所示。图图4-6 4-6 协议栈协议栈ComponentsComponents目录目录 Documents目录:协议栈帮助和说明文档,这是学习TI蓝牙4.0 BLE的最好资料,如图4-7所示。图图4-7 4-7 协议栈协议栈DocumentsDocuments目录目录 Projects目录:工程文件是一些TI的蓝牙4.0 BLE应用示例,如图4-8所示。图图4-8 TI4-8 TI蓝牙蓝牙4.0 BLE4.0 BLE协议栈工程示例协议栈工程示例任务二 蓝牙4.0 BLE协议栈的使用任务描述任务描述 在协议栈软件包工程目录中找到主机示例(Sim

8、pleBLECentral)和从机示例(SimpleBLEPeripheral),并以从机工程为例打开,结合协议栈的构成,查看文件布局。知识链接知识链接 TI的协议栈分为两部分,即控制器和主机,如图4-9所示。对于4.0版本以前的蓝牙,这两部分是分开的。所有配置文件和应用程序都建构在通用访问配置文件(GAP)或通用属性配置文件(GATT)上。本书中硬件平台使用的CC2540单片机可以单芯片实现BLE蓝牙协议栈结构图中的所有组件,包括应用程序。图图4-9 4-9 蓝牙蓝牙4.0 BLE4.0 BLE协议栈结构图协议栈结构图 协议栈各层的功能如下。(1)物理层(physical layer,PHY

9、)。PHY的传输速率为1 Mb/s,采用自适应跳频GFSK(高斯频移键控),运行在免证的2.4 GHz频段。(2)链路层(link layer,LL)。LL为射频(RF)控制器,控制设备处于等待(stand by)、广播(advertising)、扫描(scan)、初始化(initiating)和连接(connected)五种状态中的一种。五种状态切换描述为:未连接时,设备广播信息,另一个设备一直监听或按需扫描,两个设备连接初始化完成后,设备进行连接绑定。发起连接的设备为主设备,接受连接的设备为从设备,同一次连接中的主设备与从设备不能切换。(3)主机控制接口(host controller i

10、nterface,HCI)层。HCI层为接口层,向上为主机提供软件应用程序接口(API),对外为外部硬件控制接口,可以通过串口、SPI和USB来实现设备控制。(4)逻辑链路控制与适配协议(logical link control and adaption protocol,L2CAP)层。L2CAP层提供数据封装服务,允许逻辑上的点对点通信。(5)安全管理(security manager,SM)层。SM层提供配对和密匙分发,实现安全连接和数据交换。(6)属性协议(attribute protocol,ATT)层。ATT层负责数据检索,允许设备向另外一个设备展示一块特定的数据,称为属性。在AT

11、T环境中,展示属性的设备称为服务器,与它配对的设备称为客户端。链路层的主机、从机与这里的服务器、客户端是两种概念,主设备既可以是服务器,也可以是客户端,从设备亦然。(7)通用属性配置文件(generic attribute profile,GATT)层。GATT层定义了使用 ATT 的服务框架和配置文件的结构。BLE 中所有的数据通信都需要经过 GATT层。GATT层提供的服务可以完成特征值的读取、写入和查询等操作。(8)通用访问配置文件(generic access profile,GAP)层。GAP是直接与应用程序或配置文件通信的接口,处理设备发现和连接相关服务,另外还处理安全特性的初始化

12、。GAP层通常运行于四种角色,即广播者(broadcaster)、观察者(observer)、从机(peripheral)和主机(central)中的一种。(1)在路径“C:Texas InstrumentsBLE-CC254x-1.4.0ProjectsbleSimpleBLECentralCC2540”目录中找到从机工程“SimpleBLECentral.eww”,如图4-10所示。打开主机工程打开主机工程1.任务实施任务实施图图4-10 SimpleBLECentral.eww4-10 SimpleBLECentral.eww工程文件路径工程文件路径 (2)使用IAR集成开发环境打开主机

13、工程,协议栈SimpleBLECentral的工程初始界面和文件布局如图4-11所示。图图4-11 SimpleBLECentral4-11 SimpleBLECentral工程初始界面和文件布局工程初始界面和文件布局打开从机工程打开从机工程2.(1)在路径“C:Texas InstrumentsBLE-CC254x-1.4.0ProjectsbleSimpleBLEPeripheralCC2540DB”目录中找到从机工程“SimpleBLEPeripheral.eww”,如图4-12所示。图图4-12 SimpleBLEPeripheral.eww4-12 SimpleBLEPeripher

14、al.eww工程文件路径工程文件路径 (2)使用IAR集成开发环境打开从机工程,协议栈SimpleBLEPeripheral工程的目录结构如图4-13所示。图图4-13 4-13 协议栈协议栈SimpleBLEPeripheralSimpleBLEPeripheral工工程的目录结构程的目录结构 (3)工程项目设置。查看从机工程项目配置,如图4-14所示,可以看到BLE协议栈本身已经经过相关配置,所以在程序编译前无须进行CC2540单片机裸机开发时的设置,只需使用TI默认的配置即可。(a a)(b b)(c c)(4)对从机SimpleBLEPeripheral协议栈工程直接编译,无任何错误和

15、警告,如图4-15 所示,保证了接下来的二次开发。图图4-15 4-15 编译结果无错误和警告编译结果无错误和警告 在TI 的蓝牙4.0 BLE 协议栈中,虽然主机的主体结构和从机的主体结构类似,但是从机与主机有着很大的区别,从机中包含了一个称为配置文件的相关程序代码,这个配置文件决定了从机的功能。例如,防丢器、血压仪、心率计等均是蓝牙组织规定的配置文件。小贴士 为了在开发时保留原版的协议栈代码,可以把BLE-CC254x-1.4.0协议栈目录复制到自己的项目开发目录下,直接在自己的项目开发目录下开发蓝牙BLE应用。任务一 蓝牙4.0 BLE协议栈启动测试任务描述任务描述 在蓝牙4.0 BLE

16、协议栈从机示例工程“osal_start_system()”函数中加入LED1灯闪烁程序,验证协议栈的启动流程。知识链接知识链接 蓝牙4.0 BLE协议栈作为帮助程序员方便开发BLE应用的一套系统,它采用轮转查询式操作系统,其核心思想是“轮转”和“查询”,包括两个主要流程,即系统初始化和执行OSAL操作系统,如图4-16所示。系统初始化完成后,就进入执行操作系统,并且在其中是一个死循环。执行操作系统中的主函数为轮询式操作系统的主体部分,也是需要重点开发、调用和掌握的部分。图图4-16 4-16 蓝牙蓝牙4.0 BLE4.0 BLE协议栈的主要流程协议栈的主要流程 BLE协议栈的主函数在APP层

17、目录的“SimpleBLEPeripheral_Main.c”文件中,如图4-17所示,这也是整个协议栈的入口点,即从该函数开始执行。从总体上来说,它一共做了两件工作:一件是系统初始化,即由启动代码来初始化硬件系统和软件架构所需要的各个模块;另一件是开始执行OSAL操作系统实体,OSAL操作系统实现了任务切换和消息机制,并且把协议栈的代码、硬件处理的代码和用户程序的代码等分别放到了 OSAL 层的不同任务处理函数中,各任务函数之间通过消息机制、同一个任务之间通过事件的方式来通信,同时安排好各任务中具体事件的执行时间。图图2-50 2-50 选择选择lnk51ew_cc2540F256.xcll

18、nk51ew_cc2540F256.xcl文件文件 系统初始化系统初始化1.系统启动代码需要完成初始化硬件系统和软件架构所需要的各个模块,为协议栈操作系统的运行做好准备工作。协议栈初始化流程如图4-18 所示,主要为初始化系统时钟、初始化I/O口、初始化各个硬件模块和初始化非易失性(NV)存储、初始化操作系统等。图图4-18 4-18 协议栈初始化流程协议栈初始化流程 在这几个初始化函数中,操作系统的初始化“osal_init_system()”是一个比较重要的函数,因为它里面包含了操作系统的任务初始化函数“osalInitTasks();”。其相关代码如程序清单4.1 所示。程序清单4.1

19、/*函数名:osalInitTasks *功能描述:调用各层任务的初始化函数并注册 *参数:无 *返回:无 */void osalInitTasks(void)uint8 taskID=0;/*分配内存,返回指向缓冲区的指针*/tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16)*tasksCnt);osal_memset(tasksEvents,0,(sizeof(uint16)*tasksCnt);/*LL 任务*/LL_Init(taskID+);/*Hal 任务*/Hal_Init(taskID+);/*HCI 任务*/HCI_Init(

20、taskID+);#if defined(OSAL_CBTIMER_NUM_TASKS)/*回调定时器任务*/osal_CbTimerInit(taskID);taskID+=OSAL_CBTIMER_NUM_TASKS;#endif /*L2CAP 任务*/L2CAP_Init(taskID+);/*GAP 任务*/GAP_Init(taskID+);/*GATT 任务*/GATT_Init(taskID+);/*SM 任务*/SM_Init(taskID+);/*GAP角色配置*/GAPRole_Init(taskID+);/*蓝牙绑定管理初始化*/GAPBondMgr_Init(task

21、ID+);/*GATT层服务的初始化*/GATTServApp_Init(taskID+);/*应用层初始化*/SimpleBLEPeripheral_Init(taskID);函数对各层上的任务分配内存空间,并对 taskID 任务号进行初始化,每初始化一个,taskID加1。任务优先级由高向低依次排列,高优先级对应taskID的值反而小。最后是初始化SimpleBLEPeripheral任务,这是应用层程序任务,包括初始化函数和任务处理函数都需要用户根据具体要求编写。操作系统的执行操作系统的执行2.初始化代码为操作系统的执行做好准备工作后,就开始执行操作系统入口程序,并由此彻底将控制权移交

22、给操作系统。其实,操作系统实体函数只有一行代码,即 osal_start_system();/No Return from here 图图4-19 4-19 任务轮转查询式操作系统的工作流程任务轮转查询式操作系统的工作流程 “osal_start_system()”函数具体的实现代码如程序清单4.2所示,其实,这个函数是在一个无限的循环中,它是整个程序运行的灵魂。程序清单4.2 void osal_start_system(void)/*协议栈中默认没有定义ZBIT和UBIT两个宏,所以执行for语句无限循环*/#if!defined(ZBIT)&!defined(UBIT)for(;)/无限

23、循环#endif osal_run_system();继续进入运行操作系统函数“osal_run_system()”,具体实现代码和相关注释如程序清单4.3所示。它的实现方法就是不断地查看事件表,如果有事件发生就调用相应的事件处理函数。程序清单4.3 void osal_run_system(void)uint8 idx=0;/任务号初始值为0#ifndef HAL_BOARD_CC2538 osalTimeUpdate();#endif Hal_ProcessPoll();/*从优先级最高的LL层依次开始查询各层任务事件标志表中各任务的事件标志,如果有事件标志置位,则跳出循环,否则轮询完所有

24、事件标志后再退出循环*/do if(tasksEventsidx)/最高优先级的任务被找到 break;while(+idxtasksCnt);/*若idxtasksCnt,则得到了待处理的具有最高优先级的任务的索引号 idx*/if(idx0;i-)for(j=587;j0;j-);osal_run_system();下载和调试程序下载和调试程序2.将蓝牙从机模块连接到CC DEBUGGER下载器,下载并调试。全速运行,观察LED1灯的状态有闪烁现象,说明嵌入的裸机程序被反复执行了。注意注意小贴士 在IAR集成开发环境中,若需要跳转到某个函数或变量的定义,则可以在此函数名中右击并选择Go T

25、o Definition选项,就可以调到相应的定义。任务二 蓝牙4.0 BLE协议栈按键点灯程序设计任务描述任务描述 本任务要求通过修改蓝牙4.0 BLE从机协议栈示例工程中HAL层的按键驱动,在APP应用层实现S1按键控制LED1亮灭的事件处理。知识链接知识链接 按键的驱动在TI蓝牙4.0 BLE协议栈中已经实现,但由于硬件平台的不同,因而用户需要做一些修改,使它适应自己的硬件开发平台。在协议栈“Hal_key.c”文件中,包含了OSAL 系统中主机和从机共用的按键驱动文件,主要是实现按键的初始化与中断服务函数,包括主机的五向摇杆按键驱动和普通S1按键驱动。由于从机协议栈APP层中不提供普通

26、S1按键选项,因而需要手动添加,S1按键的I/O定义如程序清单4.6 所示。程序清单 4.6#if defined(CC2540_MINIDK)/通过预编译宏选择平台,默认为TI MINIDK开发板 /*SW_1 is at P0.0*/#define HAL_KEY_SW_1_PORT P0#define HAL_KEY_SW_1_BITBV(0)#define HAL_KEY_SW_1_SELP0SEL#define HAL_KEY_SW_1_DIRP0DIR 蓝牙技术的发展历程蓝牙技术的发展历程2.蓝牙技术最早是由电信巨头爱立信公司于1994年创制的。1998年2月,爱立信、诺基亚、IB

27、M、东芝及Intel五家公司组成了蓝牙技术联盟(Bluetooth SIG,Bluetooth Special Group,蓝牙特别兴趣组),采用技术标准公开的策略来推广蓝牙技术,他们共同的目标是建立一个全球性的小范围无线通信网络,并于1998年5月联合提出了蓝牙技术,其宗旨是提供一种短距离、低成本的无线传输应用。这项技术迅速超越了受限严重的红外通信技术,在全球范围内掀起了一股蓝牙热潮。经过近几年的发展,人们对蓝牙技术已不再陌生,它已是目前数码产品中不可或缺的模块,蓝牙技术的出现让人们在连接各种设备(如耳机、音箱、智能电视和投影仪等)时不再被众多的数据线所束缚,如图1-3所示。S1按键在协议栈

28、中被称为KEY_SW_1,对照蓝牙模块硬件电路图,P0.0为CC2540 的 P0.0口接的S1按键,协议栈可以通过中断自动识别。但是,TI的协议栈是针对自家的CC2540_MINIDK开发板硬件平台的,若直接在预编译中添加CC2540_MINIDK,则会把CC2540_MINIDK平台其他程序也编译进去,可能会对工程有所影响,所以需要用户选择添加自己的硬件平台来增加简单的按键服务,用于处理用户定义的按键事件。若协议栈查询到S1按键状态发生改变,则执行应用层任务回调函数SimpleBLEPeripheral_ProcessEvent进行处理,主要是将按键事件、状态和按键值打包到信息中,通过os

29、al_msg_send(registeredKeysTaskID,(uint8*)msgPtr)函数发送到注册了按键服务的应用层去,按键服务的注册函数如程序清单4.7所示。程序清单4.7 uint8 RegisterForKeys(uint8 task_id)if(registeredKeysTaskID=NO_TASK_ID)/*通过调用这个函数,将自己的任务 ID赋值给全局变量 registeredKeysTaskID,就能成功注册按键服务*/registeredKeysTaskID=task_id;return(true);else return(false);最终用户按了哪个按键。如何

30、响应该按键,则在系统事件 SYS_EVENT_MSG 中通过simpleBLEPeripheral_ProcessOSALMsg函数来处理这个消息事件,函数相关代码如程序清单4.8 所示。程序清单4.8 static void simpleBLEPeripheral_ProcessOSALMsg(osal_event_hdr_t*pMsg)switch(pMsg-event)case KEY_CHANGE:/如果是按键事件 /从机按键处理函数,用户产生的按键都是在此处理 simpleBLEPeripheral_HandleKeys(keyChange_t*)pMsg)-state,(keyCh

31、ange_t*)pMsg)-keys);break;#endif/#if defined(CC2540_MINIDK)default:break;若收到从HAL层到OSAL操作系统的按键事件,则调用按键处理函数,函数相关代码如程序清单4.9所示。程序清单4.9 static void simpleBLEPeripheral_HandleKeys(uint8 shift,uint8 keys)uint8 SK_Keys=0;VOID shift;/Intentionally unreferenced parameter /*若SW_1键被按下*/if(keys&HAL_KEY_SW_1)SK_K

32、eys|=SK_KEY_LEFT;/*若SW_2键被按下*/if(keys&HAL_KEY_SW_2)SK_Keys|=SK_KEY_RIGHT;/*用于无线连接时广播状态的获取和切换*/#ifndef PLUS_BROADCASTER if(gapProfileState!=GAPROLE_CONNECTED)SK_Keys|=SK_KEY_LEFT;/*若SW_2键被按下*/if(keys&HAL_KEY_SW_2)SK_Keys|=SK_KEY_RIGHT;/*用于无线连接时广播状态的获取和切换*/#ifndef PLUS_BROADCASTER (1)在从机协议栈工程预编译环境中添加硬

33、件平台名称,本任务自定义为“WJX_BOARD”。任务实施任务实施 (2)添加平台驱动,在“hal_key.c”驱动文件中修改按键的配置。在“halHal_key.c”文件中可以查找到有13处为TI协议栈硬件平台CC2540_MINIDK,所以需要在这13处中添加用户自己的硬件平台,主要修改如下。若原有宏定义为#if defined(CC2540_MINIDK),则修改为#if defined(CC2540_MINIDK)|(WJX_BOARD)若原有宏定义为#if!defined(CC2540_MINIDK),则修改为#if!defined(CC2540_MINIDK)&!define(WJ

34、X_BOARD)(3)在应用层中注册按键事件。在应用层初始化函数SimpleBLEPeripheral_Init()中注册按键事件,其相关代码如程序清单4.10所示。程序清单4.10 void simpleBLEPeripheral_Init(uint8 task_id)simpleBLEPeripheral_TaskID=task_id;/*注册按键事件,否则底层驱动就不会发送按键事件,注册后所有的按键事件都将被处理*/RegisterForkeys(simpleBLEPeripheral_TaskID);(4)为应用层OSAL消息处理函数添加平台。在simpleBLEPeripheral_

35、ProcessOSALMsg消息处理函数中添加平台,如程序清单4.11所示。程序清单4.11 static void simpleBLEPeripheral_ProcessOSALMsg(osal_event_hdr_t*pMsg)switch(pMsg-event)#if defined(CC2540_MINIDK)|(WJX_BOARD)case KEY_CHANGE:simpleBLEPeripheral_HandleKeys(keyChange_t*)pMsg)-state,(keyChange_t*)pMsg)-keys);break;#endif/#if defined(CC254

36、0_MINIDK)在simpleBLEPeripheral_HandleKeys按键事件处理函数中添加平台并实现按键点灯,如程序清单4.12所示。程序清单4.12#if defined(CC2540_MINIDK)|(WJX_BOARD)static void simpleBLEPeripheral_HandleKeys(uint8 shift,uint8 keys)uint8 SK_Keys=0;VOID shift;/Intentionally unreferenced parameter if(keys&HAL_KEY_SW_1)/如果按下S1键,则灯的状态取反 HalLedSet(HA

37、L_LED_1),HAL_LED_MODE_TOGGLE);/LED1状态翻转 (5)下载和调试程序。将蓝牙从机模块连接CC DEBUGGER下载器,下载并调试。全速运行,观察S1按键按下后LED1小灯的亮灭变化,说明协议栈已经成功识别和检测到了自定义的“WJX_BOARD”硬件平台按键。练一练 根据本任务中按键S1控制LED1灯亮灭的实现方法,来实现从机协议栈工程使用按键S2控制LED2灯亮灭的功能。任务一 蓝牙4.0 BLE协议栈串口打印程序的设计任务描述任务描述 本任务具体要求的功能是在BLE从机模块通电后,通过协议栈自动向串口发送“Peripheral UART is ok”字符串,若

38、在上位机串口调试助手上能收到这些字符,说明下位机与上位机之间的串口通信成功。协议栈串行通信简介协议栈串行通信简介1.串行通信在每个时间单位仅传送一位(bit)信息。串口按位(bit)发送和接收字节。尽管其比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单,并且能够实现远距离通信,如图4-21所示。知识链接知识链接图图4-21 4-21 串行数据传输串行数据传输 (1)单工。单工是指数据传输仅能沿一个方向,不能实现反向传输,如图4-22所示。图图4-22 4-22 单工通信单工通信 (2)半双工。半双工是指数据传输可以沿两个方向,但需要分时进行,

39、如图4-23所示。图图4-23 4-23 半双工通信半双工通信 (3)全双工。全双工是指数据可以同时进行双向传输,如图4-24所示。图图4-24 4-24 全双工通信全双工通信协议栈串行数据传输协议栈串行数据传输2.串行数据传输以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位可以固定的时间传送,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍。串行数据传输的数据格式如图4-25所示。图图4-25 4-25 串行数据传输的数据格式串行数据传输的数据格式 典型的串口用于ASCII码字符的传输,通信使用三根线

40、完成,即地线、发送线和接收线。由于单片机串口通信通常是异步的,因而端口能够在一根线上发送数据,同时在另一根线上接收数据。其他线用于握手,但不是必需的。异步串口通信中最重要的参数是波特率、起始位、数据位、奇偶校验位和停止位。(1)波特率。波特率(Baud rate),即调制速率,是一个衡量通信速度的参数,表示每秒钟传送的bit个数。波特率是每秒钟传输二进制代码的位数,单位为位秒(b/s)。例如,每秒钟传送11 520个字符,而每个字符格式包含10 bit(1个起始位、1个停止位和8个数据位),这时的波特率为 10 bit11 520个/s=115 200 bps 在串口异步传输中,通信双方需要确

41、定数据的传输速率。(2)起始位。在没有数据传送时,通信线上处于逻辑1状态。当发送端要发送一个字符数据时,首先发送一个逻辑0信号,这个低电平便是帧格式的起始位。其作用是向接收端表示发送端开始的一帧数据。接收端检测到这个低电平后,就准备接收数据信号。(3)数据位。在起始位后,发送端发出(接收端接收)的是数据位,数据的位数没有严格的限制,58位均可,且由低位到高位逐位传送。(4)奇偶校验位。奇偶校验位是串口通信中的一种简单的检错方式,常用的检错方式有偶校验和奇校验。当然,没有校验位也可以。对于偶校验和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个位或奇个位。例如,如

42、果数据是011,那么对于偶校验,校验位为0;如果是奇校验,校验位为1。本任务不设置奇偶校验位。(5)停止位。停止位用于表示单个包的最后一位,典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每个设备有其自己的时钟,因而很可能在通信中的两台设备间出现了小小的不同步。因此,停止位不仅表示传输的结束,而且提供计算机校正时钟同步的机会。协议栈串口应用开发相关函数介绍协议栈串口应用开发相关函数介绍3.串口是蓝牙4.0 BLE开发板和用户计算机交互的一种工具,主机将从机传感器节点采集的数据通过串口发送给上位机或主机接收上位机通过串口发送过来的命令。正确的使用串口对学习蓝牙4.0 BLE协议栈有极

43、大的促进作用。协议栈串口开发的基本步骤如下。(1)初始化串口,包括波特率、串口号和流控等。(2)向缓冲区发送数据或从接收缓冲区读取数据。由于BLE协议栈的存在,使得串口的使用更加简单和方便。因为TI在蓝牙4.0 BLE 1.4.0 协议栈中已经对串口初始化所需要的函数进行了实现,并增加了NPI,所以,用户只需要传递几个参数就可以使用串口。从机协议栈示例工程SimpleBLEPeripheral中NPI的初始化函数如程序清单4.13所示。程序清单4.13 void NPI_InitTransport(npiCBack_t npiCBack)halUARTCfg_t uartConfig;/*配置

44、串口*/uartConfig.configured=TRUE;uartConfig.baudRate=NPI_UART_BR;/波特率 uartConfig.flowControl=NPI_UART_FC;/流控制 /*流控制阈值,当开启流控时,该设置有效*/uartConfig.flowControlThreshold=NPI_UART_FC_THRESHOLD;/*串口接收缓冲区大小*/uartConfig.rx.maxBufSize=NPI_UART_RX_BUF_SIZE;/*串口发送缓冲区大小*/uartConfig.tx.maxBufSize=NPI_UART_TX_BUF_SIZ

45、E;uartConfig.idleTimeout=NPI_UART_IDLE_TIMEOUT;/*是否开启中断*/uartConfig.intEnable=NPI_UART_INT_ENABLE;/*串口接收回调函数,在该函数中读取可用串口数据*/uartConfig.callBackFunc=(halUARTCBack_t)npiCBack;/打开串口 (void)HalUARTOpen(NPI_UART_PORT,&uartConfig);return;在该函数中对串口打开前进行了一些初始化的配置,如uartConfig.baudRate对应的是串口的波特率,进入NPI_UART_BR的定

46、义,其相关代码为#define NPI_UART_BR HAL_UART_BR_115200 即默认的波特率为115 200 b/s,本书将统一使用该波特率进行程序的调试,用户可以根据具体使用要求进行修改。此外,协议栈NPI层“NPI.c”文件还提供了以下几个与串口操作相关的函数。uint16 NPI_ReadTransport(uint8*buf,uint16 len)/读取缓冲区数据 uint16 NPI_WriteTransport(uint8*buf,uint16 len)/串口打印 uint16 NPI_RxBufLen(void);/读取接收缓冲区数据长度 uint16 NPI_G

47、etMaxRxBufSize(void);/获取接收缓冲区大小 uint16 NPI_GetMaxTxBufSize(void);/获取发送缓冲区大小 对于这几个函数,TI并未全部开放,用户只需提供相关的入口参数,并直接调用后获取相关的返回值即可。协议栈串口通信的初始化流程协议栈串口通信的初始化流程4.由于需要实现通电后的串口信息显示,因而需在应用层的初始化中实现,其流程如图4-26 所示。图图4-26 4-26 串口通信初始化流程串口通信初始化流程在协议栈应用层中添加串口函数在协议栈应用层中添加串口函数1.为了实现通电后向串口调试助手输出“Peripheral UART is ok”字符串,

48、在应用层“simpleBLEPeripheral.c”文件中做以下修改。(1)添加NPI层函数头文件定义,如程序清单4.14 所示。任务实施任务实施程序清单 4.14 /*INCLUDES*/#include gapgattserver.h#include gattservapp.h#include devinfoservice.h#include simpleGATTprofile.h#include npi.h 添加“npi.h”后,就可以直接使用与串口相关的函数进行串口的初始化和读/写等操作,这简化了应用层对串口的操作流程。(2)将串口函数嵌入应用层初始化函数中。在应用层初始化函数Sim

49、pleBLEPeripheral_Init()中添加串口初始化NPI_InitTransport()函数,同时调用串口写数据函数NPI_WriteTransport()向串口输出“Peripheral UART is ok”字符。其相关代码如程序清单4.15所示。程序清单 4.15 void SimpleBLEPeripheral_Init(uint8 task_id)simpleBLEPeripheral_TaskID=task_id;NPI_InitTransport(0);/串口初始化,0表示参数为空 /*向串口打印信息,22为字符长度*/NPI_WriteTransport(Perip

50、heral UART is okn,22);修改串口初始化配置修改串口初始化配置2.默认的NPI是支持流控的,而对于只连接了RXD和TXD两根线的UART串口调试环境则需要关闭流控。进入NPI_InitTransport()函数中,“uartConfig.flowControl=NPI_UART_FC;”语句是配置流控的,继续进入NPI_UART_FC的定义可以看到#define NPI_UART_FC TRUE 默认是打开流控的,这里需要关闭,修改为#define NPI_UART_FC FALSE修改预编译选项修改预编译选项3.由于蓝牙4.0 BLE协议栈使用了条件编译,在main函数中进

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(蓝牙40-BLE无线通信技术协议栈开发入门课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|