CC2540蓝牙模块学习(1)

本篇随笔摘自于:http://www.cnblogs.com/yygsj/p/5135150.html#undefined

一、整体

1.TI的蓝牙平台支持2种协议栈/应用配置:单一设备配置、网络处理器配置

2.协议栈最顶层2个通用profile:

GAP 通用访问配置文件层 Generic Access Profile

GATT 通用属性配置文件层 Generic Attribute Profile

3. GAP:处理设备的接入方式及接入过程:①设备发现 ②链路建立 ③链路终止 ④启动安全功能 ⑤设备配置(主要是连接参数配置)

GATT:完成服务器与客户端之间通信的相关子过程

4.BLE支持40个信道的跳频机制,其中3个通道用于Advertise,剩下的用于数据通信

5.OS抽象层:疑问 如何配置一个新的任务,任务的优先级,事件触发机制,消息的传递

6.主要用于实现的是2个代码文件:

OSAL_SimpleBLEPeripheral.c 任务回调函数数据的定义 和 任务初始化函数定义 作为OSAL的外部全局变量

SimpleBLEPeripheral.c BLE应用程序的实现代码,该源文件调用一系列的BLE API函数,完成复杂的蓝牙协议

通过 const pTaskEventHandleFn tasksArr[] 数组来存储要调用的函数

simpleBLEPeripheral.h 一些常量的定义,和蓝牙应用程序任务初始化和任务回调函数声明。

7.LL层任务函数优先级 最高, 而应用程序函数的优先级最低

8.OSAL为每个任务分配了1个16位的Event,每一位代表一个事件,最高位代表SYS_EVENT_MSG,这个事件被OSAL系统保留

9.main()函数中最后进入的 void osal_run_system( void ),这个函数就是看相应任务有没有事件发生,有时间发生就跳转到相应的函数

10.任务间通信,一般通过 事件 和 消息 进行,每当任务间有消息传递,都会触发SYS_EVENT_MSG事件,并且每次处理完事件后,都要清空标志位。

osal_set_event() OSAL.h中 该函数会直接调度一个事件

osal_start_timerEx() OSAL_Timers.h中 需要掩饰触发的事件,调用这个函数

11.Heap Manager(堆栈管理),函数osal_mem_alloc,给函数分配需要的字节数,osal_mem_free()用来释放内存。

二、OSAL( 操作系统抽象层 Operate System Abstraction Layer )

1.OSAL中的消息:

发送消息前,用osal_msg_allocate()函数分配内存空间,填充数据,调用osal_msg_send()将消息发送到指定的函数中去。然后置位该函数的SYS_EVENT_MSG,然后接收端使用osal_mem_receive()将消息接收过来,接收完成后,使用osal_mem_deallocate()函数来回收当前消息所占用的内存。OSAL推荐在任务中使用独立的消息接收函数来处理消息,例如: simpleBLEPeripheral_ProcessOSALMsg()函数。

2.GAP (通用访问配置文件层 Generic Access Profile )

连接过程:①设备发现 ②链路建立 ③链路终止 ④启动安全功能 ⑤设备配置(主要是连接参数配置)

GAP层总是工作在以下角色中的1种:

Broadcaster 广播员,表明我在,但是你们只能看到我,不可以连接我

Observer 观察者,看看谁在,我只观察,不连接

Peripheral 外设,我存在,设想连我,我就连谁

Centeral 中心,看看谁在,工作在单层或多层的连接

3.连接过程: Peripheral向外广播->Centeral接收到向从机发送“Scan”命令->Peripheral以“ScanResp”命令回应->Centeral发送连接请求

4.Connect Interval 通信间隙 每个间隔1.25ms为基本单位,最小6单位7.5mS,最大3200单位4.0S。

5.Slave Latency 从机延时 表示Peripheral可以连续忽略的连接数,最大不能超过499个,最长不能超过32S。

6.Supervision Timeout 监管超时 2个成功连接事件之间的最大间隔。

7.Profile 一种规范 ; Service 一个服务 ; Characteristic 特征值 ; UUID 统一标识码(Service,Characteristic都需要),Centeral与Peripheral间的通信,均通过Characteristic实现

8.发送数据

主->从 Client调用GATT_WriteCharValue()函数发送;

从->主 Service调用GATT_Notification()函数实现。

9.接收数据

从<-主 从机接收后,会产生1个GATT_Profile_Callback调用;

三、BLE

四、低功耗部分

1.如何总是在PM1

osal_pwrmgr_device( PWRMGR_ALWAYS_ON );

2.如何进入PM2

osal_pwrmgr_device( PWRMGR_BATTERY );在空闲的时候就会进入到PM2模式

3.如何进入PM3

存在连接就断开连接,存在广播就停掉广播,并确认自己创建的所有定时任务都已关闭,则系统应该就会进入PM3模式,只能进行外部中断唤醒

4.CC2540低功耗中引脚的设置问题

不用的引脚应该与外部不连接,并将引脚配置为通用上拉输入状态(除了P1.0,P1.1),并且这些脚不应该与VDD,GND直接相连。

*关于P1.0,P1.1,“User Guide”给出的解释是"except P1.0 and P1.1, which do not have pullup/pulldown capability",字面意思是没有上下拉能力,可是我没理解,这个上下拉,是指什么。。。

五、常用的命令,功能,以及实现方法

1.切换电源模式

osal_pwrmgr_device( PWRMGR_ALWAYS_ON );

osal_pwrmgr_device( PWRMGR_BATTERY );

2.Peripheral怎么主动断开与Centeral的连接

bStatus_t GAPRole_TerminateConnection(); 在文件peripheralBroadcaster.c文件中

3.怎么设置Peripheral的广播的超时时间

首先保证是限制类型的广播 即DEVDISC_MODE_LIMIT(永久广播是 DEVDISC_MODE_GENERAL ),在 simpleBLEPeripheral.c文件 static uint8 advertData[]数组中设置。

当模式处于Limit模式时,广播超时的设置可通过设置宏 TGAP_LIM_ADV_TIME_OUT,不设置的话,默认超时时间是180S。

4.如何打开与关闭广播

uint8 initial_advertising_enable = TRUE/FALSE TRUE:打开广播 FALSE:关闭广播

GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof(uint8), &initial_advertising_enable );

分类: 蓝牙

时间: 2024-08-28 20:28:42

CC2540蓝牙模块学习(1)的相关文章

Ti CC2540蓝牙模块学习笔记整理

接触CC2540几天,终于有了初步的理解,现将笔记整理如下,只是皮毛,如有错误,还请指正,还有好多没闹明白的地方,以后应该还会继续向里面更新~ 一.整体 1.TI的蓝牙平台支持2种协议栈/应用配置:单一设备配置.网络处理器配置 2.协议栈最顶层2个通用profile: GAP 通用访问配置文件层 Generic Access Profile GATT 通用属性配置文件层 Generic Attribute Profile 3. GAP:处理设备的接入方式及接入过程:①设备发现 ②链路建立 ③链路

Edison 蓝牙模块 学习笔记

Edison 蓝牙模块 学习笔记 固定链接:https://www.zybuluo.com/SiberiaBear/note/212527 本笔记基于Intel Edison Bluetooth Guide官方手册完成,如有错误敬请指出. 由于个人能力有限,到最后几节内容一直拖着没有翻译,以后会补上,自己也是边学习边翻译的,还请见谅. Edison 蓝牙模块 学习笔记 基本介绍 Linux集成蓝牙 1 The bluetoothd daemon 2 Configuration 3 Applica

MSP430F149学习之路——蓝牙模块

注意蓝牙模块的接法! 1 #include <msp430x14x.h> 2 char data[100]; 3 int k=0; 4 void int_clk() 5 { 6 BCSCTL1 &= ~XT2OFF; 7 BCSCTL2 |= SELM_2 + SELS; 8 do 9 { 10 IFG1 &= ~OFIFG; 11 for(int i=0;i<100;i++) 12 _NOP(); 13 }while((IFG1 & OFIFG)!=0); 14

Android 蓝牙模块基础操作

之前没怎么接触过蓝牙模块,在学习的过程中借鉴了很多前辈的经验.本次主要包含以下功能: 1.检测是否存在蓝牙模块 2.蓝牙的开启与关闭 3.与本机已配对的蓝牙设备 4.本机蓝牙可见性设置 5.扫描周围蓝牙设备 关于蓝牙设备之间如何通讯下次再整理.下面开始介绍. 1.1.首先要在配置文件中加入操作蓝牙的权限 <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission and

【转】android蓝牙开发---与蓝牙模块进行通信--不错

原文网址:http://www.cnblogs.com/wenjiang/p/3200138.html 近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利,但因为蓝牙模块不在我这里,所以只能用手机测试.一开头就发现手机的蓝牙不能用,为了证明这点,我刷了四次不同不同系统的官方包,正式宣布手机的蓝牙报销了,于是和朋友换手机.在测试的过程中也是非常痛苦,放假了,同学都几乎回家了,剩下的同学中竟然80%都是用非android手机!我和我的小伙伴都吓呆了!!就算

Android FM模块学习之四源码解析(二)

上一章我们了解了FM主activity:FMRadio.java,若没查看的,请打开链接Android FM模块学习之四源码解析(一) 查看fmradio.java源码注释.接下来我们来看看FM重要的一个类:FMRadioService.java 由上一章我们已经知道,打开FM时,在OnStart函数中会bindToService来开启服务, public boolean bindToService(Context context, ServiceConnection callback) { L

Android蓝牙完全学习手册

1.前言 市面上关于Android的技术书籍很多,几乎每本书也都会涉及到蓝牙开发,但均是上层应用级别的,而且篇幅也普遍短小.对于手机行业的开发者,要进行蓝牙模块的维护,就必须从Android系统底层,至少框架层开始,了解蓝牙的结构和代码实现原理.这方面的文档.网上的各个论坛的相关资料却少之又少.分析原因,大概因为虽然蓝牙协议是完整的,但是并没有具体的实现.蓝牙芯片公司只负责提供最底层的API,与上层的适配和其他元件的兼容,需要各个厂家自己去实现,因此并未出现适用非常广泛的标准API供各个领域的公

Python 模块学习

模块学习: http://wsyht90.blog.51cto.com/9014030/1845737 1.getpass 2.os 3.sys 4.subprocess 5.hashlib 6.json 7.pickle 8.shutil 9.time 10.datetime 11.re 12.random 13.configparser 14.traceback 15.yaml 16.itertools 17.logging 18.urllib.urllib2 19.paramiko ###

python模块学习(2)——re模块

正则表达式并不是python的一部分,正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同:但不用担心,不被支持的语法通常是不常用的部分.如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了. 下图展示了使用正则表达式进行匹配的流程:  正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符