微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 请教CC2541 Keyfob做从机,给Usb dongle 发GATT_Notification数据,dongle接收到哪里了?

请教CC2541 Keyfob做从机,给Usb dongle 发GATT_Notification数据,dongle接收到哪里了?

时间:10-02 整理:3721RD 点击:

1.使用BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral 的demo

在SimpleBLEPeripheral_ProcessEvent 事件最后添加自己的发送数据事件定义为0x0004

  if( events & SBP_BURST_EVT)
  {
      if ( SBP_PERIODIC_EVT_PERIOD )
    {
      osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
    }
  
    sendData();
    sendData();
 
    return (events ^ SBP_BURST_EVT);
  }

发送数据测试函数:

static void sendData(void )
{
 
    static uint16 counter=0;
    uint8 burstData[20] = {0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,0,0};        
  
    attHandleValueNoti_t nData;
    nData.len = 20;
    nData.handle = 20;
 
    //skKeyPressed = *((uint8*)pValue);
    osal_memcpy( &nData.value, &burstData, 20 );

    // Send the Notification
    if (GATT_Notification( 0, &nData, FALSE )==SUCCESS)
    {
      counter++;
    }

   
    if(counter >1000)
    {
      osal_stop_timerEx(simpleBLEPeripheral_TaskID,SBP_BURST_EVT);
      counter = 0;
    }  

}

在学习GATT_Notification发数据。。请问下使用BTool怎么接收。

2.除了这种从机发数据给主机的方式,还有没有其他数据发送方式,有无demo可以看。

3.烧写自带编译好的CC2541_keyfob_SimpleBLEPeripheral.hex  亮灯都正常,但是自己编译的hex烧录进去灯就不亮。

你在做速度传输测试吧,从机notification发给usbdongle的包,会在BTOOL上打印的,你只要在usbdongle上运行主机程序,用BTool  scan设备,然后建立连接就可以了。上面 

 if ( SBP_PERIODIC_EVT_PERIOD )
    {
      osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
    }

你定时器启动事件可以放在成功连接后。这样主机和从机一链接就会不停发包,速度和ti给的差不多,5~6k的样子。

回复,使用您的方法,能够连续不停得发包到主,使用BTool也能看到。

但是我是想单独只发一次,而不是这种轮询执行.

想了个笨办法,使用全局变量去做。但是我感觉这种方法太笨,不智能。

或者我对架构还不熟悉。

我想连接成功后,只传一次。就像小米手环那种,一连接,自动更新数据(把信息传到手机或者自动更新版本)。只做一次。

有没有大概的个位置。。。虽然看了user guide,但是没有demo感觉还是理解不透彻。。。

--------------------------------------------

这是第一步,第二步,我是想学习event事件,建立自己能控制整个流程,这样能更好把握问题所在。最近要培训没时间看代码。。。

你把那三行定时器的删了就行了,就会只进一次

if ( events & SBP_PERIODIC_EVT )
  {
    // Restart timer
  //  if ( SBP_PERIODIC_EVT_PERIOD )//不停重启计时器
  //  {
      //osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
    //}


     sendData();
      // Perform periodic application task
    performPeriodicTask();

    return (events ^ SBP_PERIODIC_EVT);
  }

 

我把3个重启定时器删除后,连接成功后,就收不到senddata里面的数据了。。。

[24] : <Info> - 09:27:58.155
Device Connected
Handle = 0x0000
Addr Type = 0x00 (Public)
BDAddr = 84:DD:20:C5:52:69
------------------------------------------------------------------------------------------------------------------------
[25] : <Rx> - 09:27:58.110
-Type  : 0x04 (Event)
-EventCode : 0xFF (HCI_LE_ExtEvent)
-Data Length : 0x13 (19) bytes(s)
 Event  : 0x0605 (GAP_EstablishLink)
 Status  : 0x00 (Success)
 DevAddrType : 0x00 (Public)
 DevAddr  : 84:DD:20:C5:52:69
 ConnHandle : 0x0000 (0)
 ConnInterval : 0x0050 (80)
 ConnLatency : 0x0000 (0)
 ConnTimeout : 0x07D0 (2000)
 ClockAccuracy : 0x00 (0)
Dump(Rx):
04 FF 13 05 06 00 00 69 52 C5 20 DD 84 00 00 50
00 00 00 D0 07 00
------------------------------------------------------------------------------------------------------------------------
[26] : <Rx> - 09:28:04.792
-Type  : 0x04 (Event)
-EventCode : 0xFF (HCI_LE_ExtEvent)
-Data Length : 0x0B (11) bytes(s)
 Event  : 0x0607 (GAP_LinkParamUpdate)
 Status  : 0x00 (Success)
 ConnHandle : 0x0000 (0)
 ConnInterval : 0x0320 (800)
 ConnLatency : 0x0000 (0)
 ConnTimeout : 0x03E8 (1000)
Dump(Rx):
04 FF 0B 07 06 00 00 00 20 03 00 00 E8 03
------------------------------------------------------------------------------------------------------------------------

最后没有用开始自己模仿写的事件,而是在 events & SBP_START_DEVICE_EVT  之后的events & SBP_PERIODIC_EVT中添加。。

期待大牛再次指点。。。

 

我只是正好做过这块而已。

定时器只是在规定时间后产生一个事件,你在 SBP_PERIODIC_EVT这个周期事件中把定时器关了只是说这个事件只触发一次。如果你需要senddata()也只触发一次的话这样是可以的。关于SBP_PERIODIC_EVT这个事件的产生,因为内部处理的是发送,肯定不是放在SBP_START_DEVICE_EVT设备初始化之后执行,你把它放在两个设备成功建立连接或者绑定后,再让它发送就可以了。你的两个设备都没连接怎么发送。。。

[24] : <Info> - 09:27:58.155
Device Connected
Handle = 0x0000
Addr Type = 0x00 (Public)
BDAddr = 84:DD:20:C5:52:69

已经连接上了。。。

uint16 SimpleBLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
{

  VOID task_id; // OSAL required parameter that isn't used in this function

  if ( events & SYS_EVENT_MSG )
  {
    uint8 *pMsg;

    if ( (pMsg = osal_msg_receive( simpleBLEPeripheral_TaskID )) != NULL )
    {
      simpleBLEPeripheral_ProcessOSALMsg( (osal_event_hdr_t *)pMsg );

      // Release the OSAL message
      VOID osal_msg_deallocate( pMsg );
    }

    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }

  if ( events & SBP_START_DEVICE_EVT )
  {
    // Start the Device
    VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );

    // Start Bond Manager
    VOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs );

    // Set timer for first periodic event
    osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
    return ( events ^ SBP_START_DEVICE_EVT );
  }

  if ( events & SBP_PERIODIC_EVT )
  {
    // Restart timer
    if ( SBP_PERIODIC_EVT_PERIOD )//不停重启计时器
    {
      osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
    }
   
     sendData();//--------------》这个事我加的函数(纯粹调用了一下notification)
      // Perform periodic application task
    performPeriodicTask();

    return (events ^ SBP_PERIODIC_EVT);
  }
  // Discard unknown events
  return 0;
}

有这段是不停的发

    if ( SBP_PERIODIC_EVT_PERIOD )//不停重启计时器
    {
      osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
    }

没有这段,虽然是连接上了,但是没发的。。。

我想的是: if ( SBP_PERIODIC_EVT_PERIOD ) 一直为真,所以一直在重启定时器。

如果把这个去掉了,也是一直在重启定时器。

如果把这三行都去掉,因为没有获得此事件所以没有执行。。。

你理解错了,SBP_START_DEVICE_EVT里面你就把osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );这个事件产生了,这个时候肯定是没有来得及建立连接的,也就是说你的设备初始化后会直接去进行发送这个动作,后来才显示连接了。你的发送是在连接之前的。你可以把notifacation的返回值打印出来,SUCCESS才是成功提交到底层进行发送。其他5个返回值都是不对的,你打印出来一看就知道了。

另一种你在时间里面加个定时器让他成为周期的,那后来建立连接就发了啊,前面的是不发的。

你要把osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );第一次的产生放到真正建立连接后。

我试过,可行的,我的速度也是这么测的,没有问题。

对了,你把4次调用sendata();下面那行hci buffer初始化的去掉,要不然是错误的

是我对这个流程没弄明白

把senddata放到connected之后就好了。。。

多谢啦。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top