微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > BLE_CC2540_初学者入门指导

BLE_CC2540_初学者入门指导

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

看了下问题,发现不太会回答了,很久没弄,全忘记了,只好贴出之前的一些东西,帮助初学者入下门吧:

一、初识BLE

通过这两天对《CC2540 BLE Software Developer Guider V1.2.pdf 》的学习对CC2540以及蓝牙4.0有了一个整体上的认识:

 

1、蓝牙4.0协议:BR/EDR(标准蓝牙)+ BLE     目前CC2540硬件只支持BLE这种单模无线标准,不能够与4.0以前的版本通信。

 

2、针对CC2540 BLE-Stack 重点学习了该协议栈的结构,TI的蓝牙平台支持两种协议栈/应用配置:单一设备配置、网络处理器配置(application/profile在另外的处理器或者PC上的应用)。

 

3、重点学习了协议栈最顶层的两个通用profile:GAP(通用接入规范)、GATT(通用属性规范)。

 

4、GAP主要负责处理设备的接入方式以及接入的过程:设备发现、链路建立、链路终止、启动安全功能、设备配置(主要是连接参数的配置)。

 

5、GATT主要完成服务器和客户端之间通信的相关子过程。

 

6、BLE支持40个通道的跳频机制,其中3个通道用于advertise,剩下的用于数据通信;而BR的通道数在80,相比而言BLE的机制更加节电。两者的跳频偏移分别为2MHz、1MHz。

 

7、OS抽象层相关过程学习,如何配置一个新的任务、任务优先级、事件触发、消息传递等。

 

8、存在的问题:搞不清楚BLE协议内部的GAP、GATT profile与application profile的联系与区别,是否BLE能够在app上添加:A2DP(蓝牙立体声音讯传输协议)、HID(人机界面规范)等这些规范。

二、开始了解stack


进一步学习GAP,主要扮演四种角色:broadcaster(广播者)、obseerver(观察者)、peripheral(外围)、central(中央)。

 

1、BLE-Stack中有每一种角色的Sample程序,且正对不同的示例程序对应的lib也不相同,eg:CC2540_ble_single_chip_peri.lib 、CC2540_ble_network_processor_all.lib 等。

 

2、对于应用程序的profile需要按照规范自己编写,目前ti提供几个医疗上使用的profile,对于文件传输、音频传输等profile,我的理解是BLE不适用于这些场合(参考wiki网上一些话题讨论、BLE_TechDay_2011.pdf、 BLE_CC2540_DeepDive_Training_2011.pdf 来源于wiki网)。

 

 

我理解的classic就是传统的那种蓝牙应用,BLE的应用主要是用于第一幅图。BLE目前一个数据包支持的最大字节数为20Byte,基本上都是几个字节的应用,ti例程。

 

3、在wiki网上找到一个相关的例子:Serial App 通过串口实现两台PC之间的数据传输,打算从这个例子入手,在转向USB的,初步看了一下这个Serial App,在该页上能够下载一个HCI Tester的脚本测试工具,并不是直接通过两个串口实现数据传输,需要上层的profile和HCI Command。

 

附上地址:http://processors.wiki.ti.com/index.php/LPRF_BLE_SerialApp

 

4、Btool工具通过连接usb dongle看了一下软件的选项,尝试连接两个usb dongle,在wiki上看到有人说能够建立连接,实测无法搜索到设备。

 

5、初步计划先移植keyfob的程序到dongle上,实现两个设备之间建立连接,keyfob通过一个按钮触发30s的dicoverable状态,这时候启动dongle进行scan等一系列操作。

三、摸着石头过河

1、移植KeyFob例程到USB dongle上面,修改按键等宏,删除了加速度、蜂鸣器程序,该Sample与HostTestApp之间可以建立链接并通信,参考wiki地址如下:

 

http://processors.wiki.ti.com/index.php/Category:KeyFobDemo

 

存在的问题:

     1)KeyFob例程使用按键启动30秒的advertising,此后由Btool通过USB dongle向KeyFob(另外一个dongle模拟的)发送请求链接的命令。按键使用轮询的方式能够正常进入相应事件,使用IO中断的方式无法进入,检查了很多遍未找到原因所在。

 

     2)建立链接之前USB dongle需要Scan设备,这是在KeyFob发送advertising之后,会存在无法查找到设备,猜测是由于使用了轮询按键的方式导致的。

 

2、CC2540的接收发送缓存都为128Byte:

 

 

再去看了下之前wiki上看到的关于发送字节不超过20Byte的说法,是限制在10ms以内的。

 

3、Btool建立连接的状态:

 

[25]中表明GAP_EstablishLink Success,在Read/Write选项中通过操作关键字、描述符来实现通信中数据的交互,参考1中网址。

 

eg:通过USB dongle读取KeyFob电池的电量等,实际读取错误,无效的数据(我想是否需要购买一个keyFob加快开发)

 

 

4、想要实现两台PC之间的通信:

 

1)如果采用HostTestApp的方式,上位机需要与Btool类似,产生HCI Command读写数据也需要相关命令和操作序列。

 

2)采用单芯片方式(区别于网络处理器模式,HostTestApp模式),不直接和外界PC或者MCU交互。

 

最终如何选择,还需要花时间进一步学习BLE-stack。

四、站的高一点点


1、基本上搞清楚一个应用程序由哪些部分组成,需要做哪些初始化,App函数的位置,以及各种事件的响应方式。

 

2、关于CC2540 RF寄存器的问题:

 

1)User Guide上面未详细介绍寄存器的各个位,只有简单的寄存器说明,查阅E2E确定TI未开放,所以无法编写RF部分的驱动。

 

2)TI建议的方式:Note, that OSAL and HAL source is avail, a free sniffer is avail, and RF studio can access RF directly.

 

3)打开RF Studio CC2540界面,好好看看有哪些部分,对于测试等等有很大用处的。

 

原则上能够进行数据包的收发测试。

 

3、查阅相关TI Bluetooth的器件,简单对比如下:

 

五、开始搞起了

通过对TI_BLE_Vendor_Specific_HCI_Guide.pdf 和e2e上相关讨论的学习,总结如下;

 

1、可以通过HIC Command对CC2540进行相关操作,总体描述见下图。

 

 

2、关于CC2540 Production Test Mode参考网址:

 

http://processors.wiki.ti.com/index.php/PTM

 

3、创建CC2540测试工程文件,主要是删除协议部分的和某些无关的OSAL初始化程序。

 

uint16 UserApp_ProcessEvent( uint8 task_id, uint16 events )

{

    if ( events & USER_START_DEVICE_EVT )

    {

        HCI_EXT_SetTxPowerCmd (HCI_EXT_TX_POWER_4_DBM);

        HCI_EXT_ModemTestTxCmd (HCI_EXT_TX_MODULATED_CARRIER,37);

        

        //HCI_EXT_ModemHopTestTxCmd ();

        //HCI_EXT_ModemTestRxCmd (37) ;

        //HCI_EXT_EndModemTestCmd ();

        

        return ( events ^ USER_START_DEVICE_EVT );

    }

    return 0;

}

 

主要涉及的函数:

 

HCI_EXT_SetTxPowerCmd             设置发射功率

HCI_EXT_ModemTestTxCmd          开始连续的发送测试,需要指定信道和是否调制  

HCI_EXT_ModemHopTestTxCmd     开始连续的发送测试,发送37Byte 数据包(伪随机数),且信道从0-39递增

HCI_EXT_ModemTestRxCmd          开始接收测试,需要指定信道

HCI_EXT_EndModemTestCmd        停止Modem测试

六、简单分析


1、以Central、Peripheral之间通信为例,学习BLE-stack设备之间的数据通信:

 

1)Peripheral 通过GATT_Notification函数实现数据发送,这种情况下外围设备扮演Seriver(注1)。

2)Central 通过GATT_MSG_EVENT事件触发任读取 gattMsgEvent_t 结构体中的 msg对应的 Indication and Notification messages(参考程序中相关结构体)实现数据接收,这种情况下中央设备扮演Client(注2)。

 

 注1:

  static attHandleValueNoti_t *pReport= NULL;

 

  if ( GATT_Notification( 0, pRepor, FALSE )==SUCCESS)

  {

 

   //用户可在这里进行发送成功后的相关操作,pRepor为待发送的Notification

 

  }

 

  /**

   * Handle Value Notification format.

   */

  typedef struct

  {

    uint16 handle;                             //!< Handle of the attribute that has been changed (must be first field)

    uint8 len;                                   //!< Length of value

    uint8 value[ATT_MTU_SIZE-3];      //!< New value of the attribute

  } attHandleValueNoti_t;

 

  注2:

  if ( pMsg->method == ATT_HANDLE_VALUE_NOTI ||pMsg->method == ATT_HANDLE_VALUE_IND )

  {

    

     attHandleValueNoti_t noti;

    

     dataCount = dataCount+ 1;

      

     LCD_WRITE_STRING_VALUE( "Data Cnt: ", dataCount, 10, HAL_LCD_LINE_1 );

     

     noti.handle = pMsg->msg.handleValueNoti.handle;

 

     noti.len = pMsg->msg.handleValueNoti.len;

     

     osal_memcpy(&noti.value, &pMsg->msg.handleValueNoti.value,noti.len);

     

    //用户可在这里操作&noti,通过串口发送或者USB发送出去等等

         

  }

 

 

2、建立连接的某些细节函数还未搞清楚,发送数据所能够被用户看到的最底层函数如1中描述

 

 

3、进一步计划:

 

1)通过Central、Peripheral之间通信为基本模板先实现设备之间建立连接,然后使用1中方式实现数据交换。

2)在1)的基础上加入串口通信实现串口之间的通信,并能够通过串口控制设备建立连接的过程等。

3)使用Dongle实现USB功能,主要是将HostTestApp中的CDC类USB程序提取出来,实现Dongle与PC间数据通信,不涉及BLE-stack协议栈相关只是一个USB程序。

4)由于CDC类的USB相对而言要简单一些,上位机编程可以使用串口,在3)的基础上再去实现HID,具体关于这一部分USB驱动和上位机等还没有很清晰的思路。

 

4、需要做的事情:

 

1)使用购买的CC2540验证链接建立数据交互的功能。

2)实现CC2540的UART与PC通信的功能。

3)使用Dongle实现CDC类USB与PC通信的功能。

4)使用Dongle实现HID类USB与PC通信的功能。

 

附件:

 

GATT_Notification、GATT_Indication函数的说明,不能够独立运行需要在建立连接的基础上。

七、换个硬件看看

1、使用购买的CC2540模块实验,修改了Debug接口,能够采用TI的CCDebug下载光盘自带的程序测试正常。

 

光盘例程使用BLE-Stack 1.1修改,分别下载KebFob和HostAppTest。

 

2、下载BLE-Stack 1.21中例程KebFob和HostAppTest测试连接过程也正常。

 

图1:测试UUID读取关键字成功,KeyFob的电量(百分比) 

 

 

图2:测试Adv.Commands 读取RSSI值

 

 

3、使用BLE-Stack 1.1例程中的虚拟键盘,测试连接失败(光盘和协议栈原始例程都测试了),用HostAppTest测试搜索到的设备地址与待绑定的地址是匹配的。

 

待做的事情:

 

1)搞清楚3连接过程中出现的问题。

2)花时间去熟悉API函数以及相关的结构体。

八、开始做硬件了

1、参考《CC2540EM_discrete_schematic.pdf 》绘制CC2540无线模块原理图。

 

1)引出P0(8pin)、P1(8pin)、P2(3pin)、电源(2pin)、USB(2pin)、RESET(1pin)共计24pin。

2)不知引脚排列是否合理,目前的排列有利于模块布线。

 

见附件:CC2540_BLE_RF.pdf

 

2、参考《CC2540_MiniDK_SCHEMATIC.pdf 》和购买套件的底板原理图绘制CC2540底板原理图。

 

1)添加低功耗加速度传感器CMA3000(用于计步等,可缺省不焊接)。

2)添加CP2102用于USB转串口,通过UART打印字符便于调试等。

3)可选USB供电、CCdebug供电、CR2032纽扣电池供电。

4)设计中多处采用0R电阻,便于二次修改。

 

见附件:CC2540 Board.pdf

 

3、阅读BLE的宣传资料,觉得不适合在底板上添加传统的传感器,不知道是否需要添加传感器?

 

见附件:TI BLE @ CES.pdf 



九、闲置阶段,随便玩玩


1、原理图修改、检查:

1)添加PCB天线和外置天线。

2)添加OLED显示、电源指示灯、添加拨码开关。

 

2、OLED选择了一款内置升压电路的型号与之前的像素一致:

1)选取内置升压的OLED省去了升压电路的设计。

2)实际经过调研科选择TPS61040作为升压芯片,满足需求(考虑到电感、续流二极管等物料不好采购的问题)。

 

3、确定底板上物料在ERP中的型号,主要的器件目前都已经确定、包括接插件。

 

4、调试CC2540的UART,调试OK能够打印信息:

1)发现在Advertising过程中会出错(测试了多种发送情况,确认是Advertising时RF引起的)。

2)使用DMA、ISR都是同样的情况。

 




十、开始玩弄她吧


1、CC2540通信建立过程调试:

1)找到UART在advertising过程中发送数据乱码的问题,使能低功耗(PWRMGR_BATTERY)会伴随主时钟的切换,导致波特率不稳定照成的,关闭低功耗数据正常,有待进步一学习,暂时不做深入研究。

2)在调通串口的基础上实现基本的通信建立过程调试,主要是通过peripheral、central的例子,实现了PC通过串口向peripheral设备发送数据通过无线被central设备接收再通过串口传输至另一台PC。

 

Peripheral(Send):

01 82 fe 07 00 05 11 11 11 11 11

01 82 fe 07 00 05 22 22 22 22 22

 

Central(Receive):

04 FF 0D 1B 05 00 01 00 07 07 00 11 11 11 11 11 

04 FF 0D 1B 05 00 01 00 07 07 00 22 22 22 22 22 

 

以上参考:附件一、附件二。

 

2、Blood Pressure例程测试:

1)在新版本BLE-Stack1.21中未提供BP的Collector,只有一个BP Sensor,所以还需要花点时间建立Collector的工程。

2)在TI Wiki上找到了关于BLE-Stack1.1关于BP演示的说明,需要一个BleHealthDemo(C#开发)上位机的配合,Collector是工作在Network Process模式下。

 

测试效果参考:附件三。

 

3、开会提出的问题小结:

1)为什么要有Proflie?

A:Profile由蓝牙SIG发布,描述了不同设备使用蓝牙协议栈时的差异性和统一性。比如一个血压计,大家都按照这个BP Profile、BP Service来进行规范定义,那么一个BP收集器就能够收集不同厂家生产的BP Sensor测量的血压值等。如果没有Profile关有协议那么大家都只能闭门造车,我生产的手机带蓝牙功能,那么你使用的蓝牙耳机就必须是我生产的,因为那些数据格式、设备描述等只有我知道,所以才有音频Profile(A2DP)之后大家按照这个规范去严格定义自己的设备就可以了。

 

2)BT流行版本的Profile比较:

我所理解的在BT2.0、BT2.1、BT3.0这些版本能够使用传统Profile,而4.0之后会多出一部分GATT-Basic规范Profile。

 

这里我们需要理解的是:

BT2.0 = Core Version2.0 +EDR

BT2.1 = Core Version2.1 +EDR

BT3.0 = Core Version3.0 +HS

BT4.0 = Core Version4.0 +BLE = BR/EDR + BLE(这里和以往不同,V4.0有两个核心,CC2540只有BLE)

 

对于血压计:

 

V4.0 版本使用BP Profile(Blood Pressure Profile)+ BP Service

V4.0 之前版本使用HD Profile(Human Device Profile)

 

HD Profile(健康规范)包括 BP Profile(血压规范) + HT Profile(温度规范)+ ……

 

这些规范可以从官方网站查看:

https://www.bluetooth.org/Technical/Specifications/adopted.htm

 

以上参考:附件四、附件五。

 

3、附件:

 

附件一

 

附件二

 

附件三

 

附件四

 

附件五



十一、血压计分析



1、Blood Pressure示例程序占用资源(256K Flash + 8K RAM):

 

2、Blood Pressure Profile规定的数据格式:

 

 

3、Profile 定义了数据格式、过程、服务的UUID等:

 

 

以上这些会在协议属性表中体现,而这个属性表会通过相关API将他作为参数传给协议栈。

 

static gattAttribute_t bloodPressureAttrTbl[] = 

{

    // BloodPressure Service

    { 

        { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */

        GATT_PERMIT_READ,                                 /* permissions */

        0,                                                          /* handle */

        (uint8 *)&bloodPressureService                   /* pValue */

    },

    

    // 1. Characteristic Declaration

    { 

        { ATT_BT_UUID_SIZE, characterUUID },

        GATT_PERMIT_READ,

        0,

        &bloodPressureTempProps 

    },

    

    // 2. Characteristic Value

    { 

        { ATT_BT_UUID_SIZE, bloodPressureTempUUID },

        0, //return READ_NOT_PERMITTED

        0, 

        &bloodPressureTemp 

    },

    

    // 3.Characteristic Configuration

    { 

        { ATT_BT_UUID_SIZE, clientCharCfgUUID },

        GATT_PERMIT_READ | GATT_PERMIT_WRITE, 

        0, 

        (uint8 *)&bloodPressureMeasConfig

    },

    // 4.Presentation Format

    { 

        { ATT_BT_UUID_SIZE, charFormatUUID },

        GATT_PERMIT_READ, 

        0, 

        (uint8 *)&bloodPressureTempFormat

    },

    

    

    //////////////////////////////////////////////

    // IMMEDIATE MEASUREMENT

    //////////////////////////////////////////////

    

    // 5.Characteristic Declaration

    { 

        { ATT_BT_UUID_SIZE, characterUUID },

        GATT_PERMIT_READ, 

        0,

        &bloodPressureImeasProps 

    },

    

    // 6.Characteristic Value

    { 

        { ATT_BT_UUID_SIZE, bloodPressureImeasUUID },

        0, //return READ_NOT_PERMITTED

        0, 

        &bloodPressureImeas 

    },

    

    // 7.Characteristic Configuration

    { 

        { ATT_BT_UUID_SIZE, clientCharCfgUUID },

        GATT_PERMIT_READ | GATT_PERMIT_WRITE, 

        0, 

        (uint8 *)&bloodPressureIMeasConfig

    },

    

    

    //////////////////////////////////////////////

    // FEATURE

    //////////////////////////////////////////////

    

    // 8.Characteristic Declaration

    { 

        { ATT_BT_UUID_SIZE, characterUUID },

        GATT_PERMIT_READ, 

        0,

        &bpFeatureProps 

    },

    

    // 9.Characteristic Value

    { 

        { ATT_BT_UUID_SIZE, bpFeatureUUID },

        GATT_PERMIT_READ,

        0, 

        (uint8 *)&bpFeature 

    },

      

};



好吧,第一章分享到这里结束了,只是简简单单的帮助初学者入门,权当玩玩,专业开发者请忽略。不排除自己理解和排版造成的问题,请自行判断,谢谢。


后续会上传代码和相关文档,并继续开贴说第二章



哈,希望ti能给个包包硬盘啥的,鼓励一下。

xiang,

很好,继续努力,如果内容继续好的话,我帮你置顶:)

yan,

谢谢,我会继续的,我是12年玩了会,现在stack应该有更新了吧

可以把主从机的 代码 整理出来吗?参考一下

大神  期待继续更新啊。

多谢楼主分享哈

虽然没有完全看懂,但还是很有收获,非常感谢楼主的分享!

楼主很厉害,mark,希望用到BLE这块的时候,可以认真读下你的文章。

多谢多谢!学习啦

感谢楼主的分享,菜鸟还是学到不少,祝工作顺利!

@ xiang zhang4 

可以留个联系方式么?有问题需要请教

我在主机中想要往char6中写数据需要那些设计呢,

最好是有例程,着急谢谢 

请问CC2540_BLE_RF.pdf和CC2540 Board.pdf这两个附件在哪里呢?谢谢分享

大神啊,我现在需要把CC2540采集到的数据通过蓝牙发送到主机,请问可以实现吗。

好帖子

您好,我最近也在学习CC2540的BLE通信,有些问题想不明白,想向您请教一下。方便留一下您的联系方式吗?我的QQ:965167561,谢谢!

很棒的帖子,为楼主顶一个

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

网站地图

Top