cc2541的simpleBLEperipheral
如题的工程,有几个小白问题想问一下:(CC2541通过串口与430单片机连接)
1,如何获取CC2541的状态?比如:广播状态,已连接,未连接。是通过读取gapProfileState来判断的么?
2,CC2541的广播是不是会一直等到连接上才不广播了,还是有什么其他的机制?
3,当CC2541与主机连上后(比如:手机),没有数据传输,或者数据传输完毕,是怎么进入休眠状态的?进入休眠状态后,是处于已连接还是断开连接?
4,关于Connection Interval,Slave Latency,Supervision Timeout,能解释一下具体含义么?他们如何修改?
5,利用串口如何能够休眠唤醒?
yiguang,
1.可以参考 gaprole_States_t 这个枚举的定义和用法,比如在peripheral.c里面, gapRole_state这个变量的变化。
2.必须有其他机制,不然功耗会很高,比如可以设置广播时间,按键停止广播等等,可以参考一下Keyfob工程。
3.这个是由OSAL系统自动控制。休眠模式有两种,PM2和PM3. 连接和断开的情况下都可以进入低功耗模式,在建立连接的情况下,进入的休眠模式是PM2,断开连接,并且没有软件timer的情况下,就会进入PM3模式,这个模式的功耗最低。
4. 这个是由蓝牙协议栈定义的, 说来相当话长。 简单说,connection interval 就是两个connection event之间的时间间隔,connection event 是BLE数据通信激活时候的状态(这个具体你得去看蓝牙spec了)。slave latency是从设备在没有数据要求主动发送的时候,允许的跳过的connection event的个数,从而达到更低的功耗。supervision timeout就是超过多长时间主设备或者从设备没有回应对方的poll请求,就认为连接丢失的时间长。如何修改,得根据具体的实际应用。但这些值都有一个范围,connection interval 7.5ms 到 4s, slave latency 0 到 499, supervision timeout 100ms 到 32s。
5. 应该可以。
Yan,
你好,Connection Interval,Slave Latency,Supervision Timeout这三个参数的修改采用的哪个函数呢?
yiguang,
不好意思回得晚了,这个函数: L2CAP_ConnParamUpdateReq()
谢谢你了,我还有一个问题,当CC2541数据传输完毕或者没有数据传输的时候,它是怎样进入休眠模式的,看你上面的回复说是自动进入的。我想知道有没有哪个函数用于检测CC2541是否在传输数据或者传输完毕,当没有数据传输的时候,是否可以强制系统进入休眠模式?
1. 可以通过它来判断 ,
2. 可以设置为受限的广播 这样就不会是一直在广播状态了。
3. 是属于间歇的 ,唤醒不用你里 ,TI 的底层已经做好了 。
4. 文件的宏定义里面有 你搜一下 就有
5 你如果一直开着串口的话 ,好像串口起作用的时候 是不能进入低功耗的。
Yan:
你好!
在TI提供的例程中,我看到初始化过程都是使用GAPRole_SetParameter()函数来设定Connection Interval,Slave Latency,Supervision Timeout等参数。
这里使用L2CAP_ConnParamUpdateReq()来设定参数,请问使用这两个函数来设定参数效果有什么不同吗?
看协议栈的框架图,GAP跟GATT是协议栈的最顶层,最接近应用层。而L2CAP层则处于更下层,通过GAP层的接口函数来设定参数应该还是调用L2CAP层的接口函数来实现的吧?
shaokai,
如果你往下看GAPRole_SetParameter() 这些函数的话,最终也是调用L2CP层的API 来实现一些功能。
Hi Yan,
我看到extern hciStatus_t HCI_LE_ConnUpdateCmd( uint16 connHandle,
uint16 connIntervalMin,
uint16 connIntervalMax,
uint16 connLatency,
uint16 connTimeout,
uint16 minLen,
uint16 maxLen );
那么最终协议栈上面的那些个设置这些参数(比如GAP_UpdateLinkParamReq(),GAPCentralRole_UpdateLink())是不是最终通过这个函数来实现?
admsadm,
是的,没错!
最终都是到HCI 命令!
Connection Interval,Slave Latency,Supervision Timeout
請問這三個值根據實際運用設置,還是不了解要怎麼量測去進行設置?總不會是從7.5ms,7.6ms,7.7ms一直設定上去吧?另外,是master跟slave都要設定一樣的嗎?謝謝。
对于master和slave来说,是需要协调使用的连接参数的。slave发送一个param update请求,如果主机允许的话,双方就会以该参数建立连接。如果不允许,就不能用该参数进行连接。原则上,肯定是连接间隔越小越容易更新失败的。在central例程里有个GAP_LINK_PARAM_UPDATE_EVENT事件,你应该可以通过返回的status看看是否更新成功。
/** * GAP_LINK_PARAM_UPDATE_EVENT message format. This message is sent to the app * when the connection parameters update request is complete. */ typedef struct { osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status uint8 opcode; //!< GAP_LINK_PARAM_UPDATE_EVENT uint8 status; //!< bStatus_t uint16 connectionHandle; //!< Connection handle of the update uint16 connInterval; //!< Requested connection interval uint16 connLatency; //!< Requested connection latency uint16 connTimeout; //!< Requested connection timeout } gapLinkUpdateEvent_t;
simpleBLEperipheral 相关文章:
- 蓝牙从机事件处理函数 SimpleBLEPeripheral_ProcessEvent的疑问
- 我的cc2540 用simpleBLEperipheral 刷完之后怎么只有 generic access service 这一个,没有其它的服务呢?
- SimpleBLEPeripheral中的Characteristic 1 2 3 4 5的模式都是定死的吗?
- SimpleBLEPeripheral_bond实验例程
- 关于从机SimpleBLEPeripheral例程中的SBP_PERIODIC_EVT
- 关于蓝牙协议栈1.3.2中SimpleBLECentral和SimpleBLEPeripheral函数的详解