cc2540一主多从

原创 2013年12月03日 17:32:48

个人调试笔记, 语言组织能力有限,敬请原谅。

主机为smartRF开发板,从机为两个cc2540设备,首先搜索设备,然后选择设备连接,一次选择一个进行连接,连接好了再同样操作连接下一个(能不能同时连接?)。连接好了之后给设备发命令,其实还是一个一个发数据的,还没找到同时发数据的方法。程序在SimpleBLECentral基础上改的。

主要修改的地方有:

回调函数中显示所有搜索到的从设备地址:

static void simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )
{
  switch ( pEvent->gap.opcode )
  {
    case GAP_DEVICE_INIT_DONE_EVENT:  //设备初始化
      {
        LCD_WRITE_STRING( "BLE Central", HAL_LCD_LINE_1 );
        LCD_WRITE_STRING( bdAddr2Str( pEvent->initDone.devAddr ),  HAL_LCD_LINE_2 );
        LCD_LINE_= 0x04;
        simpleBLEConnHandle_num = 0;
      }
      break;


    case GAP_DEVICE_INFO_EVENT:
      {
        // if filtering device discovery results based on service UUID
        if ( DEFAULT_DEV_DISC_BY_SVC_UUID == TRUE )
        {
          if ( simpleBLEFindSvcUuid( SIMPLEPROFILE_SERV_UUID,
                                     pEvent->deviceInfo.pEvtData,
                                     pEvent->deviceInfo.dataLen ) )
          {
            simpleBLEAddDeviceInfo( pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType );//向设备发现列表中添加一个设备
            LCD_WRITE_STRING( "AdvDevice_Addr:", HAL_LCD_LINE_3 );
            LCD_WRITE_STRING( bdAddr2Str( pEvent->deviceInfo.addr ),  LCD_LINE_);//显示所有广告设备地址
            LCD_LINE_++;//每增加一个设备屏幕换一行
          }

        }
      }
      break;

 case GAP_DEVICE_DISCOVERY_EVENT://设备发现完成
      {
        // discovery complete
        simpleBLEScanning = FALSE;
        // if not filtering device discovery results based on service UUID
        if ( DEFAULT_DEV_DISC_BY_SVC_UUID == FALSE )
        {
          // Copy results
          simpleBLEScanRes = pEvent->discCmpl.numDevs;
          osal_memcpy( simpleBLEDevList, pEvent->discCmpl.pDevList,
                       (sizeof( gapDevRec_t ) * pEvent->discCmpl.numDevs) );
        }
        
        LCD_WRITE_STRING_VALUE( "Devices Found", simpleBLEScanRes,
                                10, HAL_LCD_LINE_1 );
        if ( simpleBLEScanRes > 0 )
        {
          LCD_WRITE_STRING( "<- To Select", HAL_LCD_LINE_2 );
        }


        // initialize scan index to last device
        simpleBLEScanIdx = simpleBLEScanRes;


      }
      break;


    case GAP_LINK_ESTABLISHED_EVENT://设备连接
      {
        if ( pEvent->gap.hdr.status == SUCCESS )
        {          
          simpleBLEState = BLE_STATE_CONNECTED;
          simpleBLEConnHandle= pEvent->linkCmpl.connectionHandle;
          ConnHandle[simpleBLEConnHandle_num] =pEvent->linkCmpl.connectionHandle;//将handle存起来,供主机发送数据的时候使用
          simpleBLEConnHandle_num++;//每连接一个设备增加一次
          simpleBLEProcedureInProgress = TRUE;    



发起连接请求:

  if ( keys & HAL_KEY_CENTER )//建立连接
  {
    uint8 addrType;
    uint8 *peerAddr;
    
    // Connect or disconnect
   // if ( simpleBLEState == BLE_STATE_IDLE )//屏蔽状态判断,任何时候都可以建立连接
   // {
      // if there is a scan result
      if ( simpleBLEScanRes > 0 )
      {
        // connect to current device in scan result
        peerAddr = simpleBLEDevList[simpleBLEScanIdx].addr;
        addrType = simpleBLEDevList[simpleBLEScanIdx].addrType;
      
        simpleBLEState = BLE_STATE_CONNECTING;
        
        GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,
                                      DEFAULT_LINK_WHITE_LIST,
                                      addrType, peerAddr );//发起建立连接请求
  
        LCD_WRITE_STRING( "Connecting", HAL_LCD_LINE_1 );
        LCD_WRITE_STRING( bdAddr2Str( peerAddr ), HAL_LCD_LINE_2 ); 
      }



发送数据的时候调用函数(算不上实际意义上的同时控制):

        GATT_WriteCharValue( ConnHandle[0], &req, simpleBLETaskId );//发给设备1
        GATT_WriteCharValue( ConnHandle[1], &req, simpleBLETaskId ); //发给设备2

        ………………
      

CC2540 一主多从

转自:http://blog.csdn.net/aaronga/article/details/17098337 个人调试笔记, 语言组织能力有限,敬请原谅。 主机为smartRF...

BLE协议栈之Central事件慢慢谈

BLE协议栈Central 工程中与广播连接建立的事件         最近在改写BLE协议栈,需要实现实时发现周边从设备,并建立连接,获取RSSI的功能,没什么难度,但着实将各个事件好好看了一遍。曾...

TI 一主三从主机端分析【发现服务流程】

TI 一主三从主机端分析 工程目录如下: 向上按键处理: 其中simpleBLEScanning代表目前蓝牙有没有在扫描状态,置1代表处于扫描状态,如果目前不是扫描态则进入if分支开始扫描并且设置...

CC2540一主多从的限制条件

文档地址 http://www.ti.com/product/CC2540/technicaldocuments http://www.ti.com/lit/pdf/swru271 CC2540...

BLE开发(TI CC254x)之一主多从方案(蓝牙项目纪实)

近期一个BLE项目,整套方案做下来发现虽然需求特殊,但是根据这个项目可以衍生出BLE设备一主多从的一般性方法。 项目的需求基本如下: 1.实现基于CC2541芯片的蓝牙主机固件代码,要求主机1拖4从机...

cc2540 usbdongle 安装驱动失败的终极解决方法 【原创,多图】

Ghost winxp win7系统安装CC2540 CDC驱动程序  【重要提示】 由于很多朋友使用Ghost系统,导致安装cdc驱动时安装不成功,出现 “INF中的服务安装段落无效”、“wind...
  • mzy202
  • mzy202
  • 2014年05月18日 13:15
  • 15016

BlueTooth: CC2540 BLE PeripheralBroadcaster Example(蓝牙4.0从机和广播者多角色实例)

实验环境: 蓝牙版本:TI CC2540 协议栈:1.2.1 参考手册:协议栈参考文档 TI_BLE_Software_Developer's_Guide.pdf 实验目的:实...
  • cscsr
  • cscsr
  • 2015年09月10日 23:42
  • 657

iOs LightBlue与cc2540 BLE开发板之间的通信实验 [原创, 多图]

iOs LightBlue与cc2540 BLE开发板之间的通信实验 [原创多图] 下面我们来一次做 iPhone 和 PC 与开发板的通信实验。只有 iPhone4S(含)以后的设备才支持低功耗蓝牙...
  • mzy202
  • mzy202
  • 2014年04月13日 14:28
  • 27867

iOs LightBlue与cc2540 BLE开发板之间的通信实验 [原创, 多图]

iOs LightBlue与cc2540 BLE开发板之间的通信实验 [原创,多图]         下面我们来一次做 iPhone 和 PC 与开发板的通信实验。只有 iPhone4S(含)以后的...

[置顶] iOs LightBlue与cc2540 BLE开发板之间的通信实验 [原创, 多图]

iOs LightBlue与cc2540 BLE开发板之间的通信实验 [原创,多图]         下面我们来一次做 iPhone 和 PC 与开发板的通信实验。只有 iPhone4S(含)以后的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cc2540一主多从
举报原因:
原因补充:

(最多只允许输入30个字)