微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 蓝牙Bluetooth 技术集锦

蓝牙Bluetooth 技术集锦

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

  • 对照相关文档:

    CC2541 SensorTag Quick Start Guide

    CC2541 SensorTag Reference Design 1.4(Rev. B)

    总结一下:

    SensorTag基于 CC2541 与 TI 的 TPS62730(降压转换器)配合工作。它包含 TI 的 TMP006 IR MEMS 温度传感器、湿度传感器、压力传感器、加速计、回转仪和磁力计。想来除了可用来体验低功耗蓝牙BLE性能,还有这么多传感器,如果时间充裕,对于学习来说一定很能富有乐趣。实际上TI官网也介绍说:SensorTag的多功能性意味着无限的应用可能性,其中包括健康与健身、医疗、教育工具、玩具、远程控制、移动电话附件、邻近和室内定位等领域的应用。

    四.使用BLE Device Monitor初试蓝牙连接

    为了使买的SensorTag能够充分体验价值,穷人我一冲动可是花了血本呀!

    在淘宝买了一套工具,没法呀,TI官网的太贵。

    没有iXX什么的,我就用平常的电脑,使用BLE Device Monitor软件!

    BLE Device Monitor软件下载:downloaded here

    使用BLE Device Monitor软件需要硬件CC2540 USB dongle

    先看指导手册:

    BLE DeviceMonitor User Guide - Texas Instruments Wiki


    特别需要注意的是需要按照手册中的要求重新烧写CC2540 USB dongle的固件。然后插上CC2540 USB dongle,在电脑的设备管理器中查找记下对应的COM端口号。

    打开BLE Device Monitor软件,设置选择相应的端口号,在左下框里会出现蓝牙host,如图:


      


    在软件出现SCAN…提示框的时候(Autoscan默认是打开的)按一下下SensorTag的侧键使之进入广播状态,软件则会扫描到SensorTag并如下图显示在左下框网络列表里。如果错过了软件自动扫描时间,可以手动点击Scan按钮进行扫描。这时还没有连接,点击Connect按钮进行连接,连接如果成功在Status列显示Connected。





    右侧大框底部的Autodiscover默认是打开的,如果连接成功会列出发现的服务属性列表,如下图,也可以手动点击Discover按钮。


      



    在属性列表中按级别显示服务,特性和属性,暂不详述。


    作为第一次使用,当然是急着看看传感器啦,右侧框顶部切换到SensorTag标签,显示如下图:






    在“Test”模式,点击“Start”可以进行检测SensorTag功能是否正常,按照提示操作即可,不详述。

    在“Monitoring”模式,确定上方的传感器都选中,点击“Start”,就可以看到不断刷新的传感器数据啦。

    感觉还是比较准的,例如三个传感器片内温度,相差不大,气压和气象站网站的也差不多。

    这里提一下红外测温,初步测试,感觉好像弄不准,相差很大。

    可是看这个官方这个视频拍的真够煽情,测咖啡的温度,多酷呀:TI蓝牙低能耗SensorTag:开启无限应用可能




    顺手贴一下关于红外测温的介绍:


      依据测温原理的不同,红外测温仪的设计有三种方法,通过测量辐射物体的全波长的热辐射来确定物体的辐射温度的称为全辐射测温法;通过测量物体在一定波长下的单色辐射亮度来确定它的亮度温度的称为亮度测温法;如果是通过被测物体在两个波长下的单色辐射亮度之比随温度变化来定温的称为比色测温法。


    亮度测温法无需环境温度补偿,发射率误差较小,测温精度高,但工作于短波区,只适于高温测量。比色测温法的光学系统可局部遮挡,受烟雾灰尘影响小,测温误差小,但必须选择适当波段,使波段的发射率相差不大。本文选用全辐射测温法来计算被测量物体的温度,全辐射测温法是根据所有波长范围内的总辐射而定温,得到的是物体的辐射温度。选用这种方法是因为中低温物体的波长较大,辐射信号很弱,而且结构简单,成本较低,但它的测温精度稍差,受物体辐射率影响大。


    固定的予置为0.95的发射率。该发射率值是对于多数有机材料、油漆或氧化表面的表面温度,就要用一种胶带或平光黑漆涂于被测表面加以补偿。使胶带或漆达到与基底材料相同温度时,测量胶带或漆表面的温度,即为其真实温度。

    这里闲扯到校准的问题,有关详细请参看官网关于TMP006的文档:TMP006 User Guide,编号: sbou107


    但是SensorTag源代码中好像传输的不是计算过后的温度值,而是热电堆的电压或者芯片内置温度传感器的芯片温度,这样的话,需要在Central设备方计算?

    在源文件hal_irtemp.c中:

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    /**************************************************************************************************

    * @fn          HalIRTempRead

    *

    * @brief       Read the sensor voltage and sensor temperature registers

    *

    * @param       Voltage and temperature in raw format (2 + 2 bytes)

    *

    * @return      TRUE if valid data

    **************************************************************************************************/

    bool HalIRTempRead(uint8 *pBuf)

    {

      uint16 v;

      uint16 t;

      bool success;

      if (irtSensorState != TMP006_DATA_READY)

      {

        return FALSE;

      }

      HalIRTempSelect();

      // Read the sensor registers

      success = HalSensorReadReg(TMP006_REG_ADDR_VOLTAGE, (uint8 *)&v,IRTEMP_REG_LEN );

      if (success)

      {

        success = HalSensorReadReg(TMP006_REG_ADDR_TEMPERATURE, (uint8 *)&t,IRTEMP_REG_LEN );

      }

      if (success)

      {

        // Store values

        pBuf[0] = HI_UINT16( v );

        pBuf[1] = LO_UINT16( v );

        pBuf[2] = HI_UINT16( t );

        pBuf[3] = LO_UINT16( t );

      }

      // Turn off sensor

      if (HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff, IRTEMP_REG_LEN))

      {

        irtSensorState = TMP006_OFF;

      }

      HalDcDcControl(ST_IRTEMP,false);

      return success;

    }

    <span>上面代码中在SensorTag.c中直接调用了:</span>

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    static void readIrTempData( void )

    {

      uint8 tData[IRTEMPERATURE_DATA_LEN];

      if (HalIRTempRead(tData))

      {

        IRTemp_SetParameter( IRTEMPERATURE_DATA, IRTEMPERATURE_DATA_LEN, tData);

      }

    }

    而在在源文件hal_irtemp.c中有这样一段代码是注释掉的没有使用:

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    /*  Conversion algorithm for die temperature

     *  ================================================

     *

    double calcTmpLocal(uint16 rawT)

    {

        //-- calculate die temperature [癈] --

        m_tmpAmb = (double)((qint16)rawT)/128.0;

        return m_tmpAmb;

    }

    *

    * Conversion algorithm for target temperature

    *

    double calcTmpTarget(uint16 rawT)

    {

        //-- calculate target temperature [癈] -

        double Vobj2 = (double)(qint16)rawT;

        Vobj2 *= 0.00000015625;

        double Tdie2 = m_tmpAmb + 273.15;

        const double S0 = 6.4E-14;            // Calibration factor

        const double a1 = 1.75E-3;

        const double a2 = -1.678E-5;

        const double b0 = -2.94E-5;

        const double b1 = -5.7E-7;

        const double b2 = 4.63E-9;

        const double c2 = 13.4;

        const double Tref = 298.15;

        double S = S0*(1+a1*(Tdie2 - Tref)+a2*pow((Tdie2 - Tref),2));

        double Vos = b0 + b1*(Tdie2 - Tref) + b2*pow((Tdie2 - Tref),2);

        double fObj = (Vobj2 - Vos) + c2*pow((Vobj2 - Vos),2);

        double tObj = pow(pow(Tdie2,4) + (fObj/S),.25);

        tObj = (tObj - 273.15);

        return tObj;

    }

    */

    这块的代码还没怎么看,不知道是不是这样。以后再学习钻研。


    而BLE Device Monitor软件好像没有源代码,不知道怎么处理的。各位使用iPAD什么的,里面有关于校准的选项么?

    三.上电

    按照手册装上包装盒里的CR2032纽扣电池,按下侧键,一个LED长时间闪烁后自动停止;分别按下顶部的两个按键,都是另外一颗LED闪烁一两秒钟。装上外壳,感觉一直受操作按键很方便,中指正好可以操作侧键,大拇指可以操作顶部的两个按键。顶部的两个按键尤其很有触摸感很容易不用看找到位置,据论坛中的一个帖子网友说顶部两个按键的外壳部位的几个凸点还是盲文,虽然一般人用不着盲文,但是感觉也有利于正常人操作。完整装上外壳后LED灯显得有点暗,但是还是能看到闪烁的。

    看来可以初步判断收到的SensorTag应该是能够工作没有损坏的,但是穷人我没有什么ipad什么iphone之类的,还需要想法试试蓝牙连接呀!

    五.低功耗的初步感觉

    匆匆看了一下传感器,体验了一下直接的功能,接下来要关心的才是最重要的吆,低功耗!到底怎样?看看资料,也要体验验证一下吆

    在上面第4节使用BLE Device Monitor软件过程中,我就实现按照如下图的接法接入了万用表测电流。

    这是没有连接或者断开连接一段时间后电流显示值,8.4uA


                                  

    连接状态,但是没有选择任何传感器,电流1.08mA,注意,是毫安不是微安

    选中监视所有传感器,电流跳动值在8mA~10mA。如果电池电压不够,容易到一定电压就掉线。

    陀螺仪传感器电流比较大,其它加在一起电流值在3mA左右以下。

    仅仅连接状态就达1mA,那么例如报道的防丢器可以几个月不换电池,是怎么实现的呢?不要着急,自己还不懂BLE就学嘛,先了解一下。

    大概看了一些资料朦朦胧胧了解了一下,再看一下官方的视频:BLE课程(三):蓝牙低功耗技术的链接参数设置

    原理时间关系就不细述了,还是睡觉舒服。

    官方有片关于功耗测试方法的应用笔记文档,现在官网搜索打不开,没法找到链接贴出来,反正文档编号名称是:AN092 -- Measuring Bluetooth Low Energy Power Consumption_swra347a,大家感兴趣的以后自己搜索下载。

    那么就自己简陋的方法先看看吧,还是如第4节中的硬件接法,还是使用BLE Device Monitor软件。

    打开BLE Device Monitor软件菜单Options—GAP settings,出现设定界面,例如改成如下图设置:


    那么在仅仅连接的情况下电流多大呢?由于是使用的万用表,没法避免抖动,只能大概体验一下,用20mA档,显示0.01mA,抖动到0.1mA(忘记了,好像我间隔设置的可能四1S),总之反正不是原来那么大啦。提高频率,万用表可能不抖,更利于较精确比较,时间关系就不再做了,感兴趣的自己可以试验一下,例如原来间隔20mS,改成40mS,这样对比就很直观了。当然用示波器之类的更好吧。

    因此,像防丢器那样不可思议的能够至少使用几个月不是吹嘘的。

    作者:wangfuchong

    作品名称:SensorTag学习开发随笔1_1 --BLE概念

    我也是初接触,也只是自己的猜测,说出来大家共同学习。错误之处请不吝指出。

    我好像曾使用BLE4.0这样的称呼,主要为了方便随口这样叫。也许可能这样的称呼并不严格规范。

    肯定,看到BLE,首先想到的应该是BLE是什么的缩写?

    BLE,“Bluetooth LowEnergy”的缩写,汉译好像叫做“低功耗蓝牙”。

    那么低功耗蓝牙(BLE)和一般的统称“蓝牙”是个什么关系具有什么特点呢?

    蓝牙(Bluetooth),是一种无线个人局域网(Wireless PAN),最初由爱立信创制,后来由蓝牙技术联盟订定技术标准。来自古老北欧国王Harald Blåtand,借国王的姓“Blåtand”当名称,直接翻译成中文为“蓝牙”(Blå=蓝、Tand=牙)。

    蓝牙(Bluetooth)一词是古北欧语Blåtand/Blåtann的一个英语化变体,蓝牙的标志是 ? (Hagall,Runic letter)和 ?(Bjarkan,Runicletter)的组合。

    蓝牙的标志: 

    在2006年,蓝牙技术联盟组织(www.bluetooth.org)已将全球中文译名统一改采直译为“蓝牙”。

    为什么当初起蓝牙这个名称呢?

    网传据说因为这个第十世纪的丹麦国王喜欢吃蓝莓,牙龈每天都是蓝色的,所以叫蓝牙。

    在行业协会筹备阶段,需要一个极具有表现力的名字来命名这项高新技术。行业组织人员,在经过一夜关于欧洲历史和未来无线技术发展的讨论后,有些人认为用 Blatand 国王的名字命名再合适不过了。Blatand 国王将现在的挪威,瑞典和丹麦统一起来;他的口齿伶俐,善于交际,就如同这项即将面世的技术,技术将被定义为允许不同工业领域之间的协调工作,保持着各个系统领域之间的良好交流,例如计算,手机和汽车行业之间的工作。名字于是就这么定下来了。

    作为一种技术标准规范,由于不断的发展,产生了版本衍进。

    蓝牙最早由爱立信公司(唉,我的第一个手机就是爱立信的,经典呀)于1994年始创。东芝、爱立信、IBM、Intel和诺基亚于1998年共同创立了蓝牙技术联盟(Bluetooth SIG)。

    目前,蓝牙已累计颁布了6个版本:V1.1/1.2/2.0/2.1/3.0/4.0,其标准规格不断得到更新和加强。

    版本区别:

    蓝牙1.1 为最早期版本,传输率约在748~810kb/S,因是早期设计,容易受到同频率之产品所干扰下影响通讯质量。

    蓝牙1.2  同样是只有 748~810kb/S 的传输率,但在加上了抗干扰跳频功能。版本Class A 是用在大功率/远距离的蓝牙产品上,但因成本高和耗电量大,不适合作个人通讯产品之用(手机/蓝牙耳机/蓝牙 Dongle 等等),故多用在部分商业特殊用途上. 版本Class B是最流行的制式,多用于手机内/蓝牙耳机/蓝牙 Dongle 的个人通讯产品上,耗电量和体积较细,方便携带。无论 1.1/1.2 版本的蓝牙产品,本身基本是可以支持 Stereo音效的传输要求,但只能够作(单工)方式工作,加上音带频率响应不太足够,并未算是最好之 Stereo 传输工具。

    蓝牙2.0 版本  蓝牙2.0 是 1.2 的改良提升版,其意义主要体现在用于 EDR(增强数据速率)扩展这个方面。(通常写成 BT2.0 +EDR)。如果使用 EDR,则可以增加带宽(比 BT 1.2 约高 3 倍)。传输率约在 1.8M/S~2.1M/S,可以有(双工)的工作方式。即一面作语音通讯,同时亦可以传输档案/高质素图片,2.0 版本当然也支持 Stereo 运作。虽然Bluetooth 2.0+EDR标准在技术上作了大量的改进,但从1.X标准延续下来的配置流程复杂和设备功耗较大的问题依然存在。

    蓝牙2.1   应用最为广泛的是Bluetooth2.0+EDR标准,虽然Bluetooth 2.0+EDR标准在技术上作了大量的改进,但从1.X标准延续下来的配置流程复杂和设备功耗较大的问题依然存在。为了改善蓝牙技术存在的问题,蓝牙SIG组织(Special Interest Group)推出了Bluetooth 2.1+EDR版本的蓝牙技术,对配对流程进行了简化,同时加入了减速呼吸(sniff subrating)模式,大幅度降低了蓝牙芯片的工作负载,增强了节能效果。

    蓝牙3.0 "(蓝牙核心规范3.0版 高速),蓝牙3.0的核心是"GenericAlternate MAC/PHY"(AMP),这是一种全新的交替射频技术,允许蓝牙协议栈针对任一任务动态地选择正确射频。蓝牙3.0的传输速度更高,而秘密就在IEEE 802.11无线协议上,是蓝牙2.0的八倍,可以轻松用于录像机至高清电视、PC至PMP、UMPC至打印机之间的资料传输。功耗方面,通过蓝牙3.0高速传送大量数据自然会消耗更多能量,但由于引入了增强电源控制(EPC)机制,再辅以802.11,实际空闲功耗会明显降低,蓝牙设备的待机耗电问题有望得到初步解决,高速蓝牙兼容传统蓝牙,程序可以在之间切换。

    蓝牙4.0是传统蓝牙、高速蓝牙技术和低功耗蓝牙三种规格合而为一,分别,这三个规格可以组合或者单独使用。蓝牙4.0的改进之处主要体现在三个方面,电池续航时间、节能和设备种类上。拥有低成本,跨厂商互操作性,3毫秒低延迟、超长连接距离、AES-128加密等诸多特色此外,蓝牙4.0的有效传输距离也有所提升。

    按照通信距离所有蓝牙可以分为两类:

      a)Class A 是用在大功率/远距离的蓝牙产品上,但因成本高和耗电量大,不适合作个人通讯产品之用(手机/蓝牙耳机 /蓝牙 Dongle 等等),故多用在部分商业特殊用途上,通讯距离大约在 80~100M 距离之间。

      b)Class B 是目前最流行的制式,通讯距离大约在 8~30M 之间,视产品的设计而定,多用于手机内/蓝牙耳机/蓝牙 Dongle 的个人通讯产品上,耗电量和体积较小,方便携带。

    根据蓝牙技术联盟组织(www.bluetooth.org)的声明,目前好像V1.1/1.2已经为作废标准,v2.0 +EDR正在作废处理中。

    蓝牙4.0以前的版本,都有在便携设备上因过于耗电而无法长时间使用的弊病。

    蓝牙低功耗技术是蓝牙 v4.0核心规范的组成部分,是其标志性组成功能。拥有以下特征:

    超低的峰值、平均值和待机能耗;

    使用标准纽扣电池足以运行数年;

    低成本;

    不同制造商的设备也能实现相互操作;

    射程有所加强。

    蓝牙低功耗使得蓝牙无线连接成为低成本、低容量电池即可操作需要数月甚至数年电池寿命的设备。蓝牙低功耗因而可使大量新的扩展应用能够从蓝牙无线技术中获益,包括手表、防盗钥匙扣、运动和健身传感器、医疗保健传感器和遥控器。根据蓝牙 SIG 指导原则,蓝牙低功耗技术可归为蓝牙智能标记类别。

    如前所述,蓝牙4.0实际上是三种规格的整合,也即传统蓝牙和低功耗蓝牙的结合,并且可以组合或单独使用。核心体系结构如下图所示:

    详细就不在本文中叙述了。

    因为可以组合或者单独使用,所以蓝牙4.0规范定义了两类设备:双模(dual mode)设备能够支持低功耗蓝牙以及蓝牙BR/EAR(传统蓝牙技术),而单模(simple mode)设备仅支持低功耗蓝牙。

    相应的芯片供应商如TI、CSR、Broadcom等相应的蓝牙4.0硬件芯片也分为两类。就TI来说,像CC2540/CC2541就是单模芯片,CC2560/2564就是双模芯片。SensorTag中使用的就是CC2541。

    为了能够使用户快速识别蓝牙设备是否支持蓝牙4.0版本,蓝牙技术联盟组织(www.bluetooth.org)有增加了两个新的标志,所以蓝牙标志又多了两兄弟:

    根据蓝牙技术联盟(SIG)的报告中指出,凡是只要贴上Bluetooth Smart Ready标志的手机、平板计算机、笔记本电脑,甚至是电视机…等等,都是使用蓝牙4.0版本的「双模」无线标准。而另一个标志Bluetooth Smart则是用在低功耗的蓝牙4.0版本「单模」无线标准上,适用于使用钮扣式电池的装置,像是心跳监测器、器步器和收集特定信息的传感器电子设备。

    那么兼容关系是怎样的呢?

    如图:

    假如你的装置贴有表格左侧标志,那么它就能够与贴有右边标志的产品相链接。举例来说,现有装置上如果贴的是Bluetooth标志,就只能与贴有Bluetooth及Bluetooth SmartReady标志的装置做链接,无法与Bluetooth Smart装置链接哦!

    如果用蓝牙通讯协议的方式表示就是:

    现在回过头来看本人篇首提的那个链接的问题:http://bbs.eeworld.com.cn/thread-420509-1-1.html

    BLE,也许应该就是指蓝牙4.0中的单模模式,BLE4.0的提法似乎应该是不规范的说法,大家只要知道指什么就可以了,BLE应该只是指蓝牙4.0规范中的一部分而不能代替全指蓝牙4.0。

    至于帖子中涉及到的另外一个连接识别问题应该在深入的部分讨论,本文仅介绍BLE是什么。

    德州仪器(TI)公司推出的低功耗蓝牙开发套件SensorTag基于TI的低功耗蓝牙单模芯片CC2541,上面集成了6个常用传感器,包括压力传感器、湿度传感器、温度传感器、罗盘、加速计以及陀螺仪,可支持健康与保健、教育工具、玩具遥控以及手机附件等多种应用,是熟悉学习蓝牙4.0 BLE的有力工具。TI为套件开发了专门的App应用(支持iOS和Android系统),这样设计人员不需要专门的嵌入式软件知识,通过智能手机或者平板电脑就可对所有传感器进行单独控制;应用的源代码可从TI的网站上下载,同时TI还提供免专利费的BLE-Stack软件与SensorTag配套使用;而在参考软件部分,无论是和传感器的连接还是蓝牙协议栈都已在CC2541上做好,用户不需要花太多时间在CC2541的软件设计。这样用户可以根据实际应用场合的需要,对传感器功能进行组合,开发出各种不同的应用场景。SensorTag还包含了很多低功耗蓝牙无线设计,很多客户对无线设计特别是天线设计没有太多经验,SensorTag可以提供一个很好的参考。TI通过了FCC、IC、ETSI认证,用户未来要想通过这些认证可以直接复制TI的设计,不需要花很多时间设计天线,这样认证时就可以节省很多时间。

    欲进一步了解确切的概念定义规范,可参看官方的规范文档,蓝牙4.0的详细官方英文规范直接下载(目前地址):

    https://www.bluetooth.org/DocMan/handlers/DownloadDoc.ashx?doc_id=229737

    附录:https://www.bluetooth.org/DocMan/handlers/DownloadDoc.ashx?doc_id=269452

    作者:蓝雨夜

    作品名称:【SensorTag】BTool工具的使用

    BTool工具需要硬件支持

    方案1:CC2540 USB dongle

    方案2:SmartRF05EB 和 CC2541EM 评估板。

    方案3:USB转TTL232=》SensorTag 方案    http://bbs.eeworld.com.cn/thread-427983-1-1.html



    一、运行BTool工具

    根据自己的通讯端口选择相应的COM口,其他参数可以默认

    二、初始状态
    1、Derices Found:0  没有一个设备,并且Link Control 链路控制部分 Slave BDA:None  没有从机地址
    2、开启Sensor Tag侧边按钮,然后 点击扫描 Scan

    三、扫描完成
    1、Derices Found:1 一个从机,同时Slave BDA获取了从机地址 BC:6A:29:AC:14:BA
    左边 显示了所有通讯数据报文

    四、连接设置
    1、所有参数都按默认值
    2、连接建立  Establish
    3、断开连接 Terminate

    五、读写测试
    1、参考BLE_SensorTag_GATT_Server.pdf文件,见附件,了解配置表内容
    2、读“红外温度值” 对应的handle 0x0025,返回4个字节
    Sub-Procedure 选择 Read Characteristic Value / Descriptor
    Characteristic Value Handle 输入0x0025  点击Read ,返回 00 00 00 00

    2425.BLE_SensorTag_GATT_Server.pdf

    六、读红外温度配置值
    对应的handle 0x0029,返回1个字节
    Sub-Procedure 选择 Read Characteristic Value / Descriptor
    Characteristic Value Handle 输入0x0029  点击Read ,返回 00 原来当前红外温度是关闭睡眠状态

    七、写红外温度传感器配置值
    Characteristic Value Handle 输入0x0029  
    Value 输入1
    点击Write  返回状态Success

    八、回读红外温度传感器配置值Characteristic Value Handle 输入0x0029 
    Value 显示 1  点击Read 返回状态Success

    九、再读红外温度值读“红外温度值” 对应的handle 0x0025,返回4个字节
    Sub-Procedure 选择 Read Characteristic Value / Descriptor
    Characteristic Value Handle 输入0x0025  点击Read ,返回 55 12 34 AA  

    晕,谁呀,刚接触时不成熟的老帖子也拿来发,虽然作为不作为权威的参考介绍也许还可以看看。再说,其他人这样类似的帖子也多了去了。

    竟然称我为资深达人,叫我哪儿找条缝钻进去呀。

    能不能删掉此帖呀,起码修改一下标题呀

    作者:蓝雨夜

    作品名称:让SensorTag变身成开发工具! 

    在学习BLE少不了BLEDevice Monitor这个工具,可需要硬件工具配合才可以使用。

    方案1:CC2540 USB dongle

    方案2:SmartRF05EB 和 CC2541EM 评估板。

    现在我们自己通过改装SensorTag 实现方案2的功能!

    一、硬件连接说明

      

    上图是SmartRF05EB 评估板上的RS232转换成TLL232通过P5,P6连接下图CC2541EM 评估板的P1,P2

      

    这里可以搞明白了硬件连接了

    BLE Device Monitor 与CC2541的连接

    RXD<->TXD(P0.3),

    TXD<->RXD(P0.2),

    RTS<->CTS(P0.4),

    CTS<->RTS(P0.5)

    我的硬件连接是PL-2303 连接CC2541

    这里需要把P0.2,P0.3,P0.4的硬件连接断开,然后连接到PL2303上。

      

    二、CC2541用cc debug烧入专用hex

    BLE Device Monitor的安装目录下的firmware文件夹下的CC2541_SmartRF_HostTestRelease_All.hex

    C:\Program Files\Texas Instruments\BLEDevice Monitor\firmware

      

    作者:southwolf1813

    作品名称:通过BLE Device Monitor连接SensorTag

    第一篇教程给大家介绍了手机App升级SensorTag OAD升级功能。现在来给大家讲一讲如何用USB Dongle来通过电脑连接SensorTag。
    今天需要用到的东西有: CC Debugger, USB Dongle,以及我们的SensorTag

      


    需要用到的软件包括 Flash Programmer, BLE Device Monitor 和 SensorTag 固件包。

    首先 安装Flash Programmer 和 BLE Device Monitor,连接CC Debugger和USB Dongle(线做得丑,求别黑…)。按几下CC Debugger上的reset,指示灯绿了证明USB Dongle已经识别。打开Flash Programmer应该也能看到

      

      

    然后找到 BLE Device Monitor的固件(C:\Program Files (x86)\Texas Instruments\BLE Device Monitor\firmware\CC2540_USBdongle_HostTestRelease_All.hex) 下载之。

    下载完成之后 直接把USB Dongle插上,打开BLE Device Monitor。扫描的过程中,按下SensorTag的侧键,就可以搜索到了。在左下方窗格里 点击找到的设备。
    点击Connect,再次按侧键,就可以连接到SensorTag进行调试了!

      

  • 作品名称: 通过手机App给SensorTag OAD升级固件

    今天来说一下SensorTag的OAD(Over the Air Download) 无线下载升级固件功能

    大家都知道 单片机开发测试一般需要用JTAG下载器烧写固件,但如果是开发产品都会面临一个比较头疼的问题,如果产品已经投放市场,又需要增加新的功能,或者修改Bug,总不能把所有的产品全部召回,
    一个一个用JTAG重新烧吧? 所以,让用户能直接更新固件就非常重要了。

    实现固件更新的基本原理就是单片机内置一个Bootloader,可以提供Flash等内部存储的更新和引导,这样就可以通过外部接口(USB、蓝牙、web界面等)加载新固件。

    SensorTag的“芯”是TI CC2541,我们可以把它理解为一个带有蓝牙协议栈的51单片机。TI在SenorTag上实现的OAD功能,就是通过一个51的bootloader来控制固件的更新和加载。我们来看一下OAD升级固件的过程

    首先,从App Store或者Google Play下载 TI SensorTag app, 扫描并连接SensorTag——如果扫描不到,证明SensorTag没有开广播,需要按一下侧面的按钮即可。

    连接上SensorTag之后 APP会提示"检测到旧版固件,请使用OAD profile 更新":



    这时候我们需要点击进入Profile菜单,进行固件更新

    选择OAD,此时会提示其他profile都会停
    选择新的固件。固件A其实是SensorTag自带的固件 所以选择A会提示错误——版本号相同。选择B才是更新的固件
    然后固件就开始上传了。大概需要3分钟——蓝牙4.0BLE为了降低功耗,把数据传速度也拉低了……
     
    OK 固件更新完毕!


  • 大家都知道安卓系统是基于linux的,完全可以拿来做一台小电脑来用,甚至可以装个开发编译环境,但是安卓对 BLE 的支持实在是不理想,而iOS虽然对BLE支持很好,但是没有苹果电脑就没法开发程序,怎么办呢?

    前不久我找到了一款软件 techBASIC (收费的→_→),可以直接在iPad上开发一些简单的程序,包括BLE程序。对于像我这样有时候不方便开电脑的简直是神器啊…立马咬咬牙狠狠心掏出98大元买了一发。软件长得像这样:


      


    虽然是古董级别的BASIC语言,虽然软件还是很简陋,不过至少满足了我的需求:不开电脑,开发 SensorTag 应用。

    语法也比较简单,比如最简单的例子,扫描蓝牙设备并列出名称和RSSI信号强度

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    DIM tag AS BLEPeripheral

    discoveredPeripheral = 0

    BLE.startBLE

    DIM uuid(0) AS STRING

    BLE.startScan(uuid)

    // 回调函数,发现 BLE 从设备时需要进行的操作

    SUB BLEDiscoveredPeripheral(time AS DOUBLE, peripheral AS BLEPeripheral,

    services() AS STRING, advertisements(,) AS STRING, rssi AS SINGLE)

    IF NOT discoveredPeripheral THEN

    discoveredPeripheral = 1

    somePeripheral = peripheral

    PRINT "Device: "; peripheral.bleName

    看过techBASIC的手册之后,发现这个软件还是能够实现一些基本的BLE应用,比如扫描、连接、查看Service,测量信号强度,控制BLE设备等。

    我们来看一个操作 SensorTag LED的程序, 只用了100行左右的代码,实现了一个完整的BLE扫描、连接、Service/Characteristic操作和简单GUI界面,是不是方便多了!

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    101

    102

    103

    104

    105

    106

    107

    108

    109

    110

    // 指定 Test Service 的 UUID

    DIM sensorTag AS BLEPeripheral

    DIM servicesHeader AS STRING, testService AS STRING

    servicesHeader = "-0451-4000-B000-000000000000"

    testService = "F000AA60" & servicesHeader

    // 扫描 BLE 外设

    BLE.startBLE

    DIM uuid(0) AS STRING

    BLE.startScan(uuid)

    DIM testChar AS BLECharacteristic

    DIM LED1 AS Button, LED2 AS Button, quit AS Button

    // 显示界面

    setUpGUI

    // 发现外设的回调函数

    SUB BLEDiscoveredPeripheral (time AS DOUBLE, peripheral AS BLEPeripheral, services() AS STRING, advertisements(,) AS STRING, rssi)

    IF peripheral.bleName = "TI BLE Sensor Tag" THEN

      sensorTag = peripheral

      BLE.connect(sensorTag)

      BLE.stopScan

      PRINT "Discovered SensorTag."

    END IF

    END SUB

    // 查找服务

    SUB BLEPeripheralInfo (time AS DOUBLE, peripheral AS BLEPeripheral, kind AS INTEGER, message AS STRING, err AS LONG)

    IF kind = 1 THEN

      peripheral.discoverServices(uuid)

    ELSE IF kind = 2 OR kind = 3 THEN

      BLE.connect(sensorTag)

    ELSE IF kind = 4 THEN

      DIM availableServices(1) AS BLEService

      availableServices = peripheral.services

      FOR a = 1 TO UBOUND(availableServices, 1)

        IF testService = availableServices(a).uuid THEN

          PRINT "Test Service Found"

          peripheral.discoverCharacteristics(uuid, availableServices(a))

        END IF

      NEXT

    END IF

    END SUB

    // 查找特征值

    SUB BLEServiceInfo (time AS DOUBLE, peripheral AS BLEPeripheral, service AS BLEService, kind AS INTEGER, message AS STRING, err AS LONG)

    IF kind = 1 THEN

      DIM characteristics(1) AS BLECharacteristic

      characteristics = service.characteristics

      FOR i = 1 TO UBOUND(characteristics, 1)

        IF characteristics(i).uuid = ("F000AA62" & servicesHeader) THEN

          PRINT "Test Char Found"

          testChar = characteristics(i)

          DIM value(1) as INTEGER

          value = [$80]

          peripheral.writeCharacteristic(testChar, value, 0)

        END IF

      NEXT

    END IF

    END SUB

    // 设置界面

    SUB setUpGUI

    Graphics.setPixelGraphics(0)

    DIM title AS Label

    title = Graphics.newLabel(20, 20, Graphics.width - 40, 50)

    title.setText("TI Sensor Tag")

    title.setAlignment(2)

    title.setFont("Arial", 36, 1)

    LED1 = Graphics.newButton(Graphics.width / 2 - 200, Graphics.height / 2 - 40)

    LED1.setTitle("LED1")

    LED1.setBackgroundColor(1, 1, 1)

    LED1.setGradientColor(0.6, 0.6, 0.6)

    LED2 = Graphics.newButton(Graphics.width / 2 + 100, Graphics.height / 2 - 40)

    LED2.setTitle("LED2")

    LED2.setBackgroundColor(1, 1, 1)

    LED2.setGradientColor(0.6, 0.6, 0.6)

    quit = Graphics.newButton(Graphics.width - 92, Graphics.height - 57)

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

    网站地图

    Top