Ti CC2540蓝牙模块学习笔记整理
接触CC2540几天,终于有了初步的理解,现将笔记整理如下,只是皮毛,如有错误,还请指正,还有好多没闹明白的地方,以后应该还会继续向里面更新~
一、整体
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 );
Ti CC2540蓝牙模块学习笔记整理的更多相关文章
- NPM 学习笔记整理
NPM 学习笔记整理 阅读 550,2017年06月04日 发布,来源:blog.ihoey.com 什么是 NPM npm 之于 Node ,就像 pip 之于 Python , gem 之于 Ru ...
- python学习笔记整理——字典
python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...
- Deep Learning(深度学习)学习笔记整理系列之(五)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(八)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(七)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(六)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(四)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(三)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(二)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
随机推荐
- java架构师之路:推荐的15本书
作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...
- 使用Stanford Parser进行句法分析
一.句法分析 1.定义 句法分析判断输入的单词序列(一般为句子)的构成是否合乎给定的语法,并通过构造句法树来确定句子的结构以及各层次句法成分之间的关系,即确定一个句子中的哪些词构成一个短语,哪些词是动 ...
- Xamrin开发安卓笔记(二)
http://www.cnblogs.com/minCS/p/4112617.html Xamrin开发安卓笔记(二) 安装篇 Xamrin开发安卓笔记(一) 昨天调理一天AAPT.EXE 被推出 ...
- HDU - 2819 Swap (二分图匹配-匈牙利算法)
题意:一个N*N的01矩阵,行与行.列与列之间可以互换.要求变换出一个对角线元素全为1的矩阵,给出互换的行号或列号. 分析:首先一个矩阵若能构成对角线元素全为1,那么矩阵的秩为N,秩小于N的情况无解. ...
- Bootstrap总结二
参考我的博客:http://www.isedwardtang.com/2017/09/01/bootstrap-primer-2/
- DbEntry.Net(Lephone Framework) Access ORM:安装和简单使用
项目中用到Access数据库,之前用的普通Ado.Net 三层.遇到表字段叫多时,就比较费力.想要使用ORM,无奈EF不支持Access.虽然可以改写linq to sql为Linq to Acces ...
- MMU解读
转:https://blog.csdn.net/yueqian_scut/article/details/24816757 mmu页表也是放在内存中,mmu里有一个寄存器存放页表首地址,从而找到页表( ...
- 防止CSRF的攻击—Origin和Referer
防止CSRF的攻击—Origin和Referer 为了防止CSRF的攻击,我们建议修改浏览器在发送POST请求的时候加上一个Origin字段,这个Origin字段主要是用来标识出最初请求是从哪里发起的 ...
- 如何编写自己的虚拟DOM
要构建自己的虚拟DOM,需要知道两件事.你甚至不需要深入 React 的源代码或者深入任何其他虚拟DOM实现的源代码,因为它们是如此庞大和复杂--但实际上,虚拟DOM的主要部分只需不到50行代码. 有 ...
- 8月份的To-Do List
1.汲取归纳<Effective Objective-C 2.0 >的知识点 2.回顾网易云课堂翁恺老师的C语言相关课程, 为学习算法做好准备 3.读完Kelly McGonigal的&l ...