社区导航

 

搜索
查看: 837|回复: 0

[分享] CC2540 BLE PeripheralBroadcaster Example(蓝牙4.0从机和广播者多角色实例)

[复制链接]

3890

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-11-29 15:24 | 显示全部楼层 |阅读模式
本帖最后由 Jacktang 于 2017-11-29 15:28 编辑

实验环境:
蓝牙版本:TI CC2540
协议栈:1.2.1
参考手册:协议栈参考文档 TI_BLE_Software_Developer's_Guide.pdf
实验目的:实现CC240从机在连接以后,还可以继续以广播者的身份广播告知其他设备从机的存在。
                Peripheral device sending out advertisements while connected
所修改的工程:协议栈中SimpleBLEPeripheral文件夹下的SimpleBLEPeripheral.eww工程
实验现象:上电时,从机广播,然后连接从机后,按键HAL_KEY_SW_1,切换到广播者状态(连接中的广播状态),再次搜索还是可以搜索到该设备,但是不可以连接

预编译选项如下所示:
INT_HEAP_LEN=3072
HALNODEBUG
OSAL_CBTIMER_NUM_TASKS=1
HAL_AES_DMA=TRUE
HAL_DMA=TRUE
PLUS_BROADCASTER
HAL_LCD=TRUE
HAL_LED=TRUE
HAL_UART=TRUE
xPOWER_SAVING

需要强调的是,部分内容需要根据自己的平台做相应修改

一、广播的相关设置

首先不要忘记在预编译中加入PLUS_BROADCASTER;
在peripheralBroadcaster.c文件中查看void GAPRole_Init( uint8 task_id )这个函数中确保一下设置为:
gapRole_profileRole = (GAP_PROFILE_PERIPHERAL);

二、从机的相关设置

1、为了方便起见,首先设置从机的广播模式为一直广播,在simpleBLEPeripheral.c中
// Limited discoverable mode advertises for 30.72s, and then stops
// General discoverable mode advertises indefinitely
///受限广播 和  通用广播
///测试阶段修改为一直广播
#if defined ( CC2540_MINIDK )
#define DEFAULT_DISCOVERABLE_MODE             GAP_ADTYPE_FLAGS_LIMITED
#else
#define DEFAULT_DISCOVERABLE_MODE             GAP_ADTYPE_FLAGS_GENERAL
#endif  // defined ( CC2540_MINIDK )
根据自己的实际情况修改为一直广播就可以,我这里预编译里面没有定义CC2540_MINIDK


2、设置广播者切换在simpleBLEPeripheral.c中
找到函数static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )
可以按照下列给HAL_KEY_SW_1做修改:

[html] view plain copy
if ( keys & HAL_KEY_SW_1 )  
  {  
    ///SK_Keys |= SK_KEY_LEFT;  
    HalUARTWrite(0,"KEY1\n",5);  
    ///  
    osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_ADVDATA_EVT, 50 );   
  }  

需要注意的是SBP_ADVDATA_EVT事件要在simpleBLEPeripheral.h中定义:
[html] view plain copy
// Simple BLE Peripheral Task Events  
#define SBP_START_DEVICE_EVT                              0x0001  
#define SBP_PERIODIC_EVT                                  0x0002  
#define SBP_ADV_IN_CONNECTION_EVT                         0x0004   
///  
#define SBP_ADVDATA_EVT                                   0x0008  

然后在simpleBLEPeripheral.c中,找到函数:
uint16 SimpleBLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
在此函数中添加SBP_ADVDATA_EVT事件的执行代码:
[html] view plain copy
if ( events & SBP_ADVDATA_EVT )  
{  
   static uint8 advMfgDataValue = 1;  
   static uint8 advData[]= {0x03,0xFF,0x01};  
   uint8   connAdv = TRUE;  

   advMfgDataValue++;  

   advData[2] = advMfgDataValue;  

   //update adv data   
   GAPRole_SetParameter( GAPROLE_ADVERT_DATA,advData[0], advData );   

   // GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &connAdv );   

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

   return (events ^ SBP_ADVDATA_EVT);  
}   

编译时需要注意:要将peripheral.c和peripheral.h排除编译;并且将peripheralBroadcaster.c和peripheralBroadcaster.h加入编译。具体操作如下:
如下图所示的四个文件
360截图20171129153014774.jpg

右击文件,点击Options选项,如下图所示:
点击左上角的Exclude from build就表示排除编译了,否则就是加入编译
360截图20171129153020983.jpg


此帖出自RF/无线论坛


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-24 13:34 , Processed in 0.086645 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表