chxaitz 发表于 2014-5-16 16:09:10

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 );

mikewang011 发表于 2014-5-16 16:52:56

本帖最后由 mikewang011 于 2014-5-16 16:54 编辑

最近也在搞。。顶起来、、没有上下拉就是悬空状态 就跟 普通51 P0口类似。顺便请教楼主问题 128位 uuid 跟 16位uuid 应用场合或者说区别有哪些呢。。还请指教一二{:lol:}

lyzhangxiang 发表于 2014-5-16 17:00:18

本帖最后由 lyzhangxiang 于 2014-5-16 17:01 编辑



http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/p/61462/136790.aspx#136790

wind2100 发表于 2014-6-3 09:55:15

我找了半天 也没理解 没看到有关于蓝牙协义的例程
找到CC2541的例子 全是ADC I2C IO 定时器的例子
模块与模块之间 怎么通讯 建立连接 没明白

shin555 发表于 2014-6-11 23:54:24

CC2540,MARK                              

ksh84222 发表于 2014-6-12 00:03:06

学习了,谢谢

qqfirer 发表于 2014-7-17 18:22:13

最近老板让弄这个,头大

苔痕 发表于 2014-7-20 21:19:05

请教下,cc2540有关断功能吗,我的意思就是可以通过外部按键输入一个电平然后让芯片休眠进入一种更低功耗的模式,相当于是关闭系统,然后需要的时候又能够通过io唤醒

liuquan3000 发表于 2014-10-17 13:57:12

学习了,谢谢~

faduo2012 发表于 2014-10-17 14:12:59


学习了,谢谢

littlebadbay 发表于 2014-10-18 11:01:04

写的很好,谢谢分享

snfjhudng 发表于 2014-10-18 11:34:17

学习了,谢谢

cclgxuanshao 发表于 2014-11-16 21:13:22

lyzhangxiang 发表于 2014-5-16 17:00
http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/p/61462/136790.as ...

谢谢分享

329701341 发表于 2014-11-23 21:24:03

lyzhangxiang 发表于 2014-5-16 17:00
http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/p/61462/136790.as ...

谢谢分享

liangying 发表于 2014-12-27 13:51:00

开始CC2540的学习

晚枫 发表于 2015-1-19 15:54:10

顶起,一起学习。

wsh 发表于 2015-6-10 14:30:07

顶一下。。。。。

Eppo 发表于 2015-6-12 15:18:54

初始化一个管脚为外部中断输入并检测其状态怎么弄,初次接触51及BLE,各位大神帮帮忙

tomy 发表于 2015-7-28 11:44:36

请问下楼主:
SimpleBLEPeripheral 这个工程,要怎么进入PM3模式?

还有就是唤醒后,程序从哪里开里执行?(有看到说PM3是从哪里进入,唤醒后继续从那里执行。但是我找不到从哪里进入PM3的)

希望楼主有空指导下!谢谢楼主。

linbinquan 发表于 2015-9-30 16:20:17

楼主总结的不错,鼓掌

whm_WUHAN 发表于 2015-10-12 14:05:06

学习学习现在先看看

elementls 发表于 2015-11-21 15:26:34

你好,我的2540烧写官方的Peripheral,手机用lightblue可以搜到,但是无法连接!请问怎么解决?

梧桐叶落 发表于 2015-12-10 14:08:36

容我先收藏.....

qqq_147258 发表于 2016-4-9 11:50:09

你好,您还在做开发吗?cc2540的ADC基准电压可以做输出吗?

chxaitz 发表于 2016-4-9 21:47:16

qqq_147258 发表于 2016-4-9 11:50
你好,您还在做开发吗?cc2540的ADC基准电压可以做输出吗?

您好,如果我没理解错你的意思的话。
CC2540的内部参考电压不能输出,只能作为内部ADC的参考电压使用。

qqq_147258 发表于 2016-4-11 11:54:39

chxaitz 发表于 2016-4-9 21:47
您好,如果我没理解错你的意思的话。
CC2540的内部参考电压不能输出,只能作为内部ADC的参考电压使用。 ...

原来如此,以前用过2系列,看来还是有差别。

jack5281206 发表于 2016-5-28 15:47:16

學習了,謝謝~~

QianSong 发表于 2018-7-27 19:13:39

学习了,谢谢
页: [1]
查看完整版本: CC2540学习笔记整理