【转】BLE_CC2540_初学者入门指导

原文网址:http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/61462.aspxphp

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

1、初识BLE缓存

经过这两天对《 CC2540 BLE Software Developer Guider V1.2.pdf 》的学习对 CC2540以及蓝牙4.0有了一个总体上的认识:
 
一、蓝牙4.0协议:BR/EDR(标准蓝牙)+ BLE     目前 CC2540硬件只支持BLE这种单模无线标准,不可以与4.0之前的版本通讯。
 
二、针对 CC2540  BLE-Stack 重点学习了该协议栈的结构,TI的蓝牙平台支持两种协议栈/应用配置:单一设备配置、网络处理器配置(application/profile在另外的处理器或者PC上的应用)。
 
三、重点学习了协议栈最顶层的两个通用profile:GAP(通用接入规范)、GATT(通用属性规范)。
 
四、GAP主要负责处理设备的接入方式以及接入的过程:设备发现、链路创建、链路终止、启动安全功能、设备配置(主要是链接参数的配置)。
 
五、GATT主要完成服务器和客户端之间通讯的相关子过程。
 
六、BLE支持40个通道的跳频机制,其中3个通道用于advertise,剩下的用于数据通讯;而BR的通道数在80,相比而言BLE的机制更加节电。二者的跳频偏移分别为2MHz、1MHz。
 
七、OS抽象层相关过程学习,如何配置一个新的任务、任务优先级、事件触发、消息传递等。
 
八、存在的问题:搞不清楚BLE协议内部的GAP、GATT profile与application profile的联系与区别,是否BLE可以在app上添加:A2DP(蓝牙立体声音讯传输协议)、HID(人机界面规范)等这些规范。
 
2、开始了解stack
 
进一步学习GAP,主要扮演四种角色:broadcaster(广播者)、obseerver(观察者)、peripheral(外围)、central(中央)。
 
一、 BLE-Stack中有每一种角色的Sample程序,且正对不一样的示例程序对应的lib也不相同,eg: CC2540_ble_single_chip_peri.lib 、 CC2540_ble_network_processor_all.lib 等。
 
二、对于应用程序的profile须要按照规范本身编写,目前ti提供几个医疗上使用的profile,对于文件传输、音频传输等profile,个人理解是BLE不适用于这些场合(参考wiki网上一些话题讨论、BLE_TechDay_2011.pdf、 BLE_ CC2540_DeepDive_Training_2011.pdf 来源于wiki网)。
 
 
我理解的classic就是传统的那种蓝牙应用,BLE的应用主要是用于第一幅图。BLE目前一个数据包支持的最大字节数为20Byte,基本上都是几个字节的应用,ti例程。
 
三、在wiki网上找到一个相关的例子:Serial App 经过串口实现两台PC之间的数据传输,打算从这个例子入手,在转向USB的,初步看了一下这个Serial App,在该页上可以下载一个HCI Tester的脚本测试工具,并非直接经过两个串口实现数据传输,须要上层的profile和HCI Command。
 
 
四、Btool工具经过链接usb dongle看了一下软件的选项,尝试链接两个usb dongle,在wiki上看到有人说可以创建链接,实测没法搜索到设备。
 
五、初步计划先移植keyfob的程序到dongle上,实现两个设备之间创建链接,keyfob经过一个按钮触发30s的dicoverable状态,这时候启动dongle进行scan等一系列操做。
 
 
3、摸着石头过河
 
一、移植KeyFob例程到USB dongle上面,修改按键等宏,删除了加速度、蜂鸣器程序,该Sample与HostTestApp之间能够创建连接并通讯,参考wiki地址以下:
 
 
存在的问题:
     1)KeyFob例程使用按键启动30秒的advertising,此后由Btool经过USB dongle向KeyFob(另一个dongle模拟的)发送请求连接的命令。按键使用轮询的方式可以正常进入相应事件,使用IO中断的方式没法进入,检查了不少遍未找到缘由所在。
 
     2)创建连接以前USB dongle须要Scan设备,这是在KeyFob发送advertising以后,会存在没法查找到设备,猜想是因为使用了轮询按键的方式致使的。
 
二、 CC2540的接收发送缓存都为128Byte:
 
 
再去看了下以前wiki上看到的关于发送字节不超过20Byte的说法,是限制在10ms之内的。
 
三、Btool创建链接的状态:
 
[25]中代表GAP_EstablishLink Success,在Read/Write选项中经过操做关键字、描述符来实现通讯中数据的交互,参考1中网址。
 
eg:经过USB dongle读取KeyFob电池的电量等,实际读取错误,无效的数据(我想是否须要购买一个keyFob加快开发)
 
 
四、想要实现两台PC之间的通讯:
 
1)若是采用HostTestApp的方式,上位机须要与Btool相似,产生HCI Command读写数据也须要相关命令和操做序列。
 
2)采用单芯片方式(区别于网络处理器模式,HostTestApp模式),不直接和外界PC或者MCU交互。
 
最终如何选择,还须要花时间进一步学习 BLE-stack
 
 
4、站的高一点点
 
一、基本上搞清楚一个应用程序由哪些部分组成,须要作哪些初始化,App函数的位置,以及各类事件的响应方式。
 
二、关于 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界面,好好看看有哪些部分,对于测试等等有很大用处的。
 
 
原则上可以进行数据包的收发测试。
 
三、查阅相关TI Bluetooth的器件,简单对好比下:
 
 
 
5、开始搞起了
 
经过对TI_BLE_Vendor_Specific_HCI_Guide.pdf 和e2e上相关讨论的学习,总结以下;
 
一、能够经过HIC Command对 CC2540进行相关操做,整体描述见下图。
 
 
二、关于 CC2540 Production Test Mode参考网址:
 
 
三、建立 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测试
 
 
6、简单分析
 
一、以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发送出去等等
         
  }
 
 
二、创建链接的某些细节函数还未搞清楚,发送数据所可以被用户看到的最底层函数如1中描述
 
 
三、进一步计划:
 
1)经过Central、Peripheral之间通讯为基本模板先实现设备之间创建链接,而后使用1中方式实现数据交换。
2)在1)的基础上加入串口通讯实现串口之间的通讯,并可以经过串口控制设备创建链接的过程等。
3)使用Dongle实现USB功能,主要是将HostTestApp中的CDC类USB程序提取出来,实现Dongle与PC间数据通讯,不涉及 BLE-stack协议栈相关只是一个USB程序。
4)因为CDC类的USB相对而言要简单一些,上位机编程可使用串口,在3)的基础上再去实现HID,具体关于这一部分USB驱动和上位机等尚未很清晰的思路。
 
四、须要作的事情:
 
1)使用购买的 CC2540验证连接创建数据交互的功能。
2)实现 CC2540的UART与PC通讯的功能。
3)使用Dongle实现CDC类USB与PC通讯的功能。
4)使用Dongle实现HID类USB与PC通讯的功能。
 
附件:
 
 
GATT_Notification、GATT_Indication函数的说明,不可以独立运行须要在创建链接的基础上。
 
 
7、换个硬件看看
 
一、使用购买的CC2540模块实验,修改了Debug接口,可以采用TI的CCDebug下载光盘自带的程序测试正常。
 
光盘例程使用 BLE-Stack 1.1修改,分别下载KebFob和HostAppTest。
 
二、下载BLE-Stack 1.21中例程KebFob和HostAppTest测试链接过程也正常。
 
图1:测试UUID读取关键字成功,KeyFob的电量(百分比) 
 
 
图2:测试Adv.Commands 读取RSSI值
 
 
三、使用BLE-Stack 1.1例程中的虚拟键盘,测试链接失败(光盘和协议栈原始例程都测试了),用HostAppTest测试搜索到的设备地址与待绑定的地址是匹配的。
 
待作的事情:
 
1)搞清楚3链接过程当中出现的问题。
2)花时间去熟悉API函数以及相关的结构体。
 
8、开始作硬件了
 
一、参考《CC2540EM_discrete_schematic.pdf 》绘制CC2540无线模块原理图。
 
1)引出P0(8pin)、P1(8pin)、P2(3pin)、电源(2pin)、USB(2pin)、RESET(1pin)共计24pin。
2)不知引脚排列是否合理,目前的排列有利于模块布线。
 
见附件: CC2540_BLE_RF.pdf
 
二、参考《CC2540_MiniDK_SCHEMATIC.pdf 》和购买套件的底板原理图绘制CC2540底板原理图。
 
1)添加低功耗加速度传感器CMA3000(用于计步等,可缺省不焊接)。
2)添加CP2102用于USB转串口,经过UART打印字符便于调试等。
3)可选USB供电、CCdebug供电、CR2032纽扣电池供电。
4)设计中多处采用0R电阻,便于二次修改。
 
见附件: CC2540 Board.pdf
 
三、阅读BLE的宣传资料,以为不适合在底板上添加传统的传感器,不知道是否须要添加传感器?
 
见附件:TI BLE @ CES.pdf 
 
 
9、闲置阶段,随便玩玩
 
一、原理图修改、检查:
1)添加PCB天线和外置天线。
2)添加OLED显示、电源指示灯、添加拨码开关。
 
二、OLED选择了一款内置升压电路的型号与以前的像素一致:
1)选取内置升压的OLED省去了升压电路的设计。
2)实际通过调研科选择 TPS61040做为升压芯片,知足需求(考虑到电感、续流二极管等物料很差采购的问题)。
 
三、肯定底板上物料在ERP中的型号,主要的器件目前都已经肯定、包括接插件。
 
四、调试CC2540的UART,调试OK可以打印信息:
1)发如今Advertising过程当中会出错(测试了多种发送状况,确认是Advertising时RF引发的)。
2)使用DMA、ISR都是一样的状况。
 
 
 
 
10、开始玩弄她吧
 
一、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 
 
以上参考:附件1、附件二。
 
二、Blood Pressure例程测试:
1)在新版本BLE-Stack1.21中未提供BP的Collector,只有一个BP Sensor,因此还须要花点时间创建Collector的工程。
2)在TI Wiki上找到了关于BLE-Stack1.1关于BP演示的说明,须要一个BleHealthDemo(C#开发)上位机的配合,Collector是工做在Network Process模式下。
 
测试效果参考:附件三。
 
三、开会提出的问题小结:
1)为何要有Proflie?
A:Profile由蓝牙SIG发布,描述了不一样设备使用蓝牙协议栈时的差别性和统一性。好比一个血压计,你们都按照这个BP Profile、BP Service来进行规范定义,那么一个BP收集器就可以收集不一样厂家生产的BP Sensor测量的血压值等。若是没有Profile关有协议那么你们都只能闭门造车,我生产的手机带蓝牙功能,那么你使用的蓝牙耳机就必须是我生产的,由于那些数据格式、设备描述等只有我知道,因此才有音频Profile(A2DP)以后你们按照这个规范去严格定义本身的设备就能够了。
 
2)BT流行版本的Profile比较:
我所理解的在BT2.0、BT2.一、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(温度规范)+ ……
 
这些规范能够从官方网站查看:
 
以上参考:附件4、附件五。
 
三、附件:
 
附件一
 
附件二
 
附件三
 
附件四
 
附件五
 
 
11、血压计分析
 
 
一、Blood Pressure示例程序占用资源(256K Flash + 8K RAM):
 
二、Blood Pressure Profile规定的数据格式:
 
 
三、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能给个包包硬盘啥的,鼓励一下。
相关文章
相关标签/搜索