4009|5

7

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

从机广播使用Simple GATT Profile关闭广播后无法进入PM3 [复制链接]

如题,启动后广播30s然后关闭广播,只能进入PM2,电流还有150uA左右,请问还有什么事件没关闭吗?另外连接时功耗500uA左右,用官网的keyfobdemo连接时能做到10uA以下,源码如下:
  1. //从机初始化
  2. void SimpleBLEPeripheral_Init( uint8 task_id )
  3. {
  4.         simpleBLETaskId = task_id;
  5.        
  6.         // 设置GAP
  7.         VOID GAP_SetParamValue( TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL );

  8.         // 设置GAP外围设备
  9.         {
  10.                 uint8 initial_advertising_enable = TRUE;//开启广播

  11.                 uint16 gapRole_AdvertOffTime = 0;

  12.                 uint8 enable_update_request = DEFAULT_ENABLE_UPDATE_REQUEST;
  13.                 uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
  14.                 uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
  15.                 uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;
  16.                 uint16 desired_conn_timeout = DEFAULT_DESIRED_CONN_TIMEOUT;

  17.                 // Set the GAP Role Parameters
  18.                 GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );//广播开启
  19.                 GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );
  20. #if 0
  21.                 GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
  22. #else
  23.                 {      
  24.                         uint8 AttDeviceNameLen = osal_strlen((char*)simpleBle_GetAttDeviceName());
  25.                         uint8 pSscanRspDataLen = ( 11 + AttDeviceNameLen);
  26.                         uint8 *pSscanRspData = osal_mem_alloc(pSscanRspDataLen);
  27.                         if(pSscanRspData)
  28.                         {
  29.                                 uint8 index = 0;

  30.                                 pSscanRspData[0] = AttDeviceNameLen + 1;
  31.                                 pSscanRspData[1] = GAP_ADTYPE_LOCAL_NAME_COMPLETE;
  32.                                 osal_memcpy(&pSscanRspData[2], simpleBle_GetAttDeviceName(), AttDeviceNameLen);//设备名
  33.                                
  34.                                 index = 2 + AttDeviceNameLen;
  35.                                
  36.                                 pSscanRspData[index+0] = 0x05;
  37.                                 pSscanRspData[index+1] = GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE;
  38.                                 pSscanRspData[index+2] = LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL );   // 100ms
  39.                                 pSscanRspData[index+3] = HI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL );
  40.                                 pSscanRspData[index+4] = LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL );   // 1s
  41.                                 pSscanRspData[index+5] = HI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL );

  42.                                 // Tx power level
  43.                                 pSscanRspData[index+6] = 0x02;   // length of this data
  44.                                 pSscanRspData[index+7] = GAP_ADTYPE_POWER_LEVEL;
  45.                                 pSscanRspData[index+8] = 0;       // 0dBm   

  46.                                 GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, pSscanRspDataLen, pSscanRspData );

  47.                                 osal_mem_free(pSscanRspData);
  48.                         }
  49.                 }
  50. #endif
  51.                 GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
  52.                 GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request );
  53.                 GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );
  54.                 GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );
  55.                 GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );
  56.                 GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );
  57.         }

  58.         // Set the GAP Characteristics
  59.         GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, simpleBle_GetAttDeviceName() );//设备名称

  60.         {
  61.                 // 设置rssi 参数更新速率
  62.                 uint16 rssi_read_rate_1ms = 500; //一秒更新2次
  63.                 GAPRole_SetParameter(GAPROLE_RSSI_READ_RATE, sizeof( uint16 ), &rssi_read_rate_1ms);
  64.         }

  65.         // 广播时间段
  66.         {
  67.                 uint16 advInt = DEFAULT_ADVERTISING_INTERVAL;
  68.                 GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );
  69.                 GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );
  70.                 GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );
  71.                 GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );
  72.         }

  73.         //下面是与配对相关的设置  
  74.         {
  75.                 uint32 passkey = simpleBle_GetPassword();
  76.                 uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;//配对模式,置配成等待主机的配对请求
  77.                 uint8 mitm = TRUE;
  78.                 uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;  //显示密码, 以便主机输入配对的密码
  79.                 uint8 bonding = FALSE;//FALSE:每次连接都需要密码;TRUE:第一次连接需要密码
  80.                 GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey );
  81.                 GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode );
  82.                 GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm );
  83.                 GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap );
  84.                 GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );
  85.         }
  86.         //GATT总协定属性初始化
  87.         GGS_AddService( GATT_ALL_SERVICES );            // GAP
  88.         GATTServApp_AddService( GATT_ALL_SERVICES );    // GATT attributes
  89.         DevInfo_AddService();                           // Device Information Service
  90.         SimpleProfile_AddService( GATT_ALL_SERVICES );  // Simple GATT Profile

  91.         // 设置simpleprofile特征值
  92.         {
  93.                 uint8 charValue1 = 1;
  94.                 uint8 charValue2 = 2;
  95.                 uint8 charValue3 = 3;
  96.                 uint8 charValue4 = 4;
  97.                 uint8 charValue5[SIMPLEPROFILE_CHAR5_LEN] = { 1, 2, 3, 4, 5 };
  98.                 //    uint8 charValue6[SIMPLEPROFILE_CHAR6_LEN] = { 1, 2, 3, 4, 5 };
  99.                 //    uint8 charValue7[SIMPLEPROFILE_CHAR7_LEN] = { 1, 2, 3, 4, 5 };
  100.                 SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR1, sizeof ( uint8 ), &charValue1 );
  101.                 SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR2, sizeof ( uint8 ), &charValue2 );
  102.                 SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR3, sizeof ( uint8 ), &charValue3 );
  103.                 SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof ( uint8 ), &charValue4 );
  104.                 SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR5, SIMPLEPROFILE_CHAR5_LEN, charValue5 );
  105.                 //    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR6, SIMPLEPROFILE_CHAR6_LEN, charValue6 );
  106.                 //    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR7, SIMPLEPROFILE_CHAR7_LEN, charValue7 );
  107.         }
  108.        
  109.         // Register for all key events - This app will handle all key events
  110.         RegisterForKeys( simpleBLETaskId );
  111.        
  112.         // Register callback with SimpleGATTprofile
  113.         VOID SimpleProfile_RegisterAppCBs( &simpleBLEPeripheral_SimpleProfileCBs );//主机修改特征值,接收来自主机的信息

  114.         // 使时钟停止分裂
  115.         // 这减少了有功电流当无线电主动CC254x单片机
  116.         // 停止
  117.         // 需要关闭的CLK自动分频,在初始化中加入HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT )?  // 如果开启,会导致频率自动切换,DMA工作受到影响,小范围丢数。  
  118.         // 这里把他关闭, 如果想降低功耗, 这个应该要开启的, 这里矛盾了
  119.         HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT );
  120.         //HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT );
  121.        
  122.         // 信号发射强度
  123.         HCI_EXT_SetTxPowerCmd(sys_config.txPower);
  124.        
  125.         // Setup a delayed profile startup
  126.         osal_set_event( simpleBLETaskId, START_DEVICE_EVT );
  127. }

  128. //从机执行
  129. uint16 SimpleBLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
  130. {
  131.         VOID task_id; // OSAL required parameter that isn't used in this function

  132.         if ( events & SYS_EVENT_MSG )
  133.         {//按键及消息类
  134.                 uint8 *pMsg;
  135.                
  136.                 if ( (pMsg = osal_msg_receive( simpleBLETaskId )) != NULL )
  137.                 {
  138.                         simpleBLEPeripheral_ProcessOSALMsg( (osal_event_hdr_t *)pMsg );

  139.                         // Release the OSAL message
  140.                         VOID osal_msg_deallocate( pMsg );
  141.                 }
  142.                 return (events ^ SYS_EVENT_MSG);
  143.         }

  144.         if ( events & START_DEVICE_EVT )
  145.         {
  146.                 // 启动设备
  147.                 VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );

  148.                 // 开始设备连接
  149.                 VOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs );
  150.                
  151.                 // Set timer for first periodic event
  152.                 osal_start_timerEx( simpleBLETaskId, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
  153.                
  154.                 // 延时400ms后唤醒, 不然会继续睡眠,原因不明
  155.                 //osal_start_timerEx( simpleBLETaskId, SBP_WAKE_EVT, 500 );   
  156.                 return ( events ^ START_DEVICE_EVT );
  157.         }
  158.        
  159.         if ( events & SBP_WAKE_EVT )
  160.         {//500ms防睡眠
  161.                 osal_pwrmgr_device( PWRMGR_ALWAYS_ON);   //  不睡眠,功耗很高的        
  162.                 return ( events ^ SBP_WAKE_EVT );
  163.         }
  164.        
  165.         if ( events & SBP_DATA_EVT )
  166.         {//发送数据
  167.                 SimpleBLE_SendData();
  168.                 if(qq_total() > 0)
  169.                 {
  170.                         timerIsOn = TRUE;
  171.                         osal_start_timerEx( simpleBLETaskId, SBP_DATA_EVT, 8);
  172.                 }
  173.                 else
  174.                 {
  175.                         timerIsOn = FALSE;
  176.                 }
  177.                 return ( events ^ SBP_DATA_EVT );
  178.         }

  179.         if ( events & SBP_UART_EVT )
  180.         {//8ms定时器,发送数据
  181.                 if(FALSE == timerIsOn)
  182.                 {
  183.                         osal_start_timerEx( simpleBLETaskId, SBP_DATA_EVT, 8);
  184.                 }      
  185.                 return ( events ^ SBP_UART_EVT );
  186.         }
  187.        
  188.         if ( events & SBP_PERIODIC_EVT )
  189.         {//定时器轮询
  190.                 // Restart timer
  191.                 if ( SBP_PERIODIC_EVT_PERIOD)
  192.                 {//100ms
  193.                         //osal_start_timerEx( simpleBLETaskId, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
  194.                 }
  195.                 osal_stop_timerEx( simpleBLETaskId, SBP_PERIODIC_EVT);
  196.                 // Perform periodic application task
  197.                 SimpleBLE_TimerISR();
  198.                 return (events ^ SBP_PERIODIC_EVT);
  199.         }
  200.        
  201.         // Discard unknown events
  202.         return 0;
  203. }
复制代码
此帖出自无线连接论坛

最新回复

我说的这些参数 随便什么profile都有的,这个属于基本的radio参数   详情 回复 发表于 2017-6-28 15:08
点赞 关注
 

回复
举报

2144

帖子

3

TA的资源

五彩晶圆(中级)

沙发
 
参数看下,你可以比较一下官方keyfobdemo 和你程序这部分的差别
主要是 连接间隔时间  广播间隔时间  等参数
时间久了 记不得了
无线的功耗主要在radio work time
连接时间这个参数会影响通讯速度,一般建议设置的大一些,功耗可以明显下降。
此帖出自无线连接论坛
个人签名电工
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
@lyzhangxiang 感觉没有对比性啊,官方用的是Proximity Reporter Profile,而我用的是Simple GATT Profile。而且我用我的初始化放到官方例程上功耗也是降不下来
此帖出自无线连接论坛

点评

我说的这些参数 随便什么profile都有的,这个属于基本的radio参数  详情 回复 发表于 2017-6-28 15:08
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

4
 
是不是开启了定时器没有关 只能PM2
此帖出自无线连接论坛
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

5
 
木然无意 发表于 2017-6-28 11:32
@lyzhangxiang 感觉没有对比性啊,官方用的是Proximity Reporter Profile,而我用的是Simple GATT Profile ...

我说的这些参数
随便什么profile都有的,这个属于基本的radio参数
此帖出自无线连接论坛
个人签名电工
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

6
 
问题解决了,参数设置都没有错,只不过不能把HAL_LED=TRUE定义为FALSE,不能关闭LED,不知道为什么
此帖出自无线连接论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表