Blue Star

Blue Star

星期日, 04 10月 2015 15:26

如何使用 CC2540 制作一个 iBeacon

准备工作

  1. 一台 PC
  2. IAR Embedded Workbench 集成开发环境,可以用30天试用版本。
  3. 支持 蓝牙 4.0 的智能手机一部,并安装下列应用之一
  4. CC2540 开发板
  5. CCDebugger 下载器

创建 iBeacon 工程文档

  • 安装 TI 官方的 CC254x 开发环境
  • 复制 C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\SimpleBLEBroadcaster 文件夹
  • 粘贴到:C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\iBeacon
  • 运行 IAR Embedded Workbench,点击 File > Open > Workspace

修改源代码

simpleBLEBroadcaster.c

// GAP - Advertisement data (max size = 31 bytes, though this is
// best kept short to conserve power while advertisting)
static uint8 advertData[] =
{
  // Flags; this sets the device to use limited discoverable
  // mode (advertises for 30 seconds at a time) instead of general
  // discoverable mode (advertises indefinitely)
  0x02,   // length of this data
  GAP_ADTYPE_FLAGS,
  GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,

  // three-byte broadcast of the data "1 2 3"
  0x04,   // length of this data including the data type byte
  GAP_ADTYPE_MANUFACTURER_SPECIFIC,      // manufacturer specific advertisement data type
  1,
  2,
  3
};

修改下面关键字

  • UID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
  • Major: 1 (0x0001)
  • Minor: 1 (0x0001)
  • Measured Power: -59 (0xc5)
// GAP - Advertisement data (max size = 31 bytes, though this is
// best kept short to conserve power while advertisting)
static uint8 advertData[] =
{
  // 25 byte ibeacon advertising data
  // Preamble: 0x4c000215
  // UUID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
  // Major: 1 (0x0001)
  // Minor: 1 (0x0001)
  // Measured Power: -59 (0xc5)
  0x1A, // length of this data including the data type byte
  GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type
  0x4c,
  0x00,
  0x02,
  0x15,
  0xe2,
  0xc5,
  0x6d,
  0xb5,
  0xdf,
  0xfb,
  0x48,
  0xd2,
  0xb0,
  0x60,
  0xd0,
  0xf5,
  0xa7,
  0x10,
  0x96,
  0xe0,
  0x00,
  0x01,
  0x00,
  0x01,
  0xc5
};

接下来修改广播类型,将下面代码

//uint8 advType = GAP_ADTYPE_ADV_NONCONN_IND;// use non-connectable advertisements
uint8 advType = GAP_ADTYPE_ADV_DISCOVER_IND; // use scannable unidirected advertisements

修改为

uint8 advType = GAP_ADTYPE_ADV_NONCONN_IND;   // use non-connectable advertisements
//uint8 advType = GAP_ADTYPE_ADV_DISCOVER_IND; // use scannable unidirected advertisements

接下来修改 GAP

// Set the GAP Role Parameters
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );

GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );

因为 iBeacon 必须不间断广播,并且不响应任何数据请求,所以我们要修改 GAPROLE_ADVERT_OFF_TIME 和 GAPROLE_SCAN_RSP_DATA。

// Set the GAP Role Parameters
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
//GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );

//GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );

保存工程后,进行编译,并通过 CCDebugger 下载程序到开发板中。

  1. Select Project > Clean to clean the project.
  2. Select Project > Make to make the project.
  3. Select Project > Download and Debug to send the code to the CC2540 Key Fob
  4. Select Debug > Go to Run the code on the CC2540 Key Fob

 1.iBeacon的前世今生

image001

苹果公司,其产品的开发对外历来都是神秘的,正当三星和诺基亚大力推进NFC应用的时候,苹果却没有跟进,这是为何?在WWDC2013上,苹果发布了全新颠覆性的iOS系统:iOS 7。除了全新的扁平化外观UI设计之外,苹果还发布了许多iOS7的新特性。作为iOS7中最重要的新特性之一,iBeacon引起了各大科技巨头的注意。

美国老牌商场梅西百货(Macy)已经开始在纽约和旧金山的门店中部署iBeacon传感器,在同应用程序 Shopkick配合使用后,顾客将会在进店的同时感受到新技术所带来的便捷,因为他们可以在不同楼层的不同商铺即时获取到不同的优惠信息。此外,苹果上周也宣布在全美254家苹果零售店中部署iBeacon技术。

在国内, 各种 iBeacon应用正如雨后春笋一样冒出来,相信,这一次,我们电子工程师大有作为。

1.1    iBeacon的技术原理 

通过使用低功耗蓝牙技术(BluetoothLowEnergy,也就是通常所说的Bluetooth4.0或者Bluetooth Smart),iBeacon基站可以创建一个信号区域,当设备进入该区域时,相应的应用程序便会提示用户是否需要接入这个信号网络。通过能够放置在任何物体中的小型无线传感器和低功耗蓝牙技术,用户便能使用iPhone来传输数据。

2.iBeacon的应用方向 

综合了一下,iBeacon的应用目前主要有如下:

【1】, 零售业, 当客户进入 iBeacon信号区域是推送相关信息

【2】, 球馆和演唱会馆等,指引客户找到座位和出入口洗手间等

【3】, 车库汽车定位,当你走进车库, iBeacon会指引你找到你的爱车再也不用到处找了。

【4】, 学生上课点名,别笑哦,一款名为BeHere的基于iBeacon 的应用 已经在AppStore 免费上架,iPad、iPhone和 iPod touch 都可以下载使用,该应用还具有“求助”功能,要是我当年上学的时候学校用这个来点名那我当年要睡少很多懒觉哦。

【5】,苹果将用iBeacon实现短距离支付,替换NFC,只是不知鹿死谁手短期肩部了分晓哦。

【6】,............

3.需要的开发环境

 3.1硬件环境 

【1】SmartRF开发板一套

【2】cc debugger 或smartRF04eb仿真器

【3】 cc2540 usb dongle 协议分析仪或 用 cc debugger 或 smartRF04eb 仿真器加

SmartRF开发板 实现的分析仪。(可选,但非常必要选)

3.2软件环境 

【1】SmartRF FlashProgrammer   下载工具软件(可选)

【2】IAR8.10.3

【3】Texas Instruments PacketSniffer BLE协议分析仪

 

4.实战实践 

iBeacon 基站的实现, 实际上除了硬件以外,在软件上仅表现为周期性地发送特定的数据包, 而这个数据包的格式,可以通过网络抓包破解分析出来。

对于一个UUID是E2C56DB5-DFFB-48D2-B060-D0F5A71096E0,major是0,minjor是0

的iBeacon,此时的Tx的信号是-59RSSI,他的BLE的广播包如下:

d6 be 89 8e 40 24 05 a2 17 6e 3d 71 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0

f5 a7 10 96 e0 00 00 00 00 c5 52 ab 8d 38a5 

以上协议包拆解内容如下:

d6 be 89 8e # Access address for advertising data (this is always the same fixedvalue)

40 # Advertising Channel PDU Header byte0.   Contains: (type = 0), (tx add = 1), (rx add =0)

24 # Advertising Channel PDU Header byte   1.    Contains:       (length = total bytes of   the advertising payload + 6 bytes for the BLE macaddress.)

05 a2 17 6e 3d 71 # Bluetooth Mac address (note this is a spoofedaddress)

02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5#Bluetoothadvertisement

52 ab 8d 38 a5 #checksum

协议包中的关键部分就是蓝牙的广播部分,这些被分解为如下:

02 01 1a 1a ff 4c 00 0215  # Apple's fixed iBeacon advertisingprefix

e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon profileuuid

00 00 #major

00 00 #minor

c5 # The 2's complement of the calibrated TxPower

通过BLE设备发送这样的数据包,iOS收到后,即可实现iBeacon了。

4.1源码修改 

好通过前面的协议分析,我们来修改一下源码,我们在《1.BLE入门与提高教程.pdf》的第 4 章 BLE 协议栈入门 里边已经验证过 SimpleBLEPeripheral作为从机时的功能,现在我们直接在这个TI官方的例程上修改来实现我们的iBeacon基站。

【1】修改广播数据:

image002

4.2 用 iOS测试 

笔者手机上装了很多Appstore上的蓝牙4.0BLE的软件,其中AirLocate是苹果公司推出iBeacon 的测试软件, Locate iBeacons 是一款第三方的软件, 能实现iBeacon的距离定位和校准, 下面我们来看看 Locate iBeacons 实现的距离显示和室内定位。

【1】, 手机上安装Locate iBeacons, 你的 iphone至少是4s 或以上, 系统必须是ios7.0

以上, iphone4s ios7.0 以后的系统才支持蓝牙4.0BLE。

 image004

 

【2】, 点击Locate iB 进去后如下图,

image005

【3】, 点击 Locate iBeacons 进入如下界面,如果你的基站已经打开,即可看到如图所示的设备, 下图中 就直接显示了你的手机与 iBeacon 基站间的距离,这个距离可能随着不同的硬件设备而有所差异, 所以需要校准, 请看下一步如何校准。这里为什么一打开这个软件就实现了距离显示了呢,主要是该软件内默认添加了苹果公司发布的UUID,我们亦可以修改基站的uuid,然后在该软件中添加该uuid,同样也能实现该功能的,这个做起来就要深入开发了。

 image006

 

【4】,校准,     点击第一行 ,进入下一步。

image007

【5】,校准提示,把你的iphone放到距离iBeacon基站约1米处,按下Calibrate   ,并且保持30秒到1分钟,过程如下面图。

 image008

image009

【6】, 校准完毕, 下面图显示聚焦校准完毕了, 你可以随意拿你的 iphone到处走,神奇的iBeacon就告诉你你所处的距离,如果有3个以上的iBeacon基站信号能够被收到,那么就可以实现比较真正的室内定位了。

 image010

【7】,显示距离如下。

distance

4.3数据分析 

好吧, 上述的iBeacon功能基本完成了,那么, 到底SmartRF开发板与iOS的数据交互如何的呢,这个时候就需要网络协议分析仪来抓包并分析数据了。

星期日, 04 10月 2015 11:24

如何使用 CC2540 制作一个 iBeacon

准备工作

  1. 一台 PC
  2. IAR Embedded Workbench 集成开发环境,可以用30天试用版本。
  3. 支持 蓝牙 4.0 的智能手机一部,并安装下列应用之一
  4. CC2540 开发板
  5. CCDebugger 下载器

创建 iBeacon 工程文档

  • 安装 TI 官方的 CC254x 开发环境
  • 复制 C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\SimpleBLEBroadcaster 文件夹
  • 粘贴到:C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\iBeacon
  • 运行 IAR Embedded Workbench,点击 File > Open > Workspace

修改源代码

simpleBLEBroadcaster.c

// GAP - Advertisement data (max size = 31 bytes, though this is
// best kept short to conserve power while advertisting)
static uint8 advertData[] =
{
  // Flags; this sets the device to use limited discoverable
  // mode (advertises for 30 seconds at a time) instead of general
  // discoverable mode (advertises indefinitely)
  0x02,   // length of this data
  GAP_ADTYPE_FLAGS,
  GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,

  // three-byte broadcast of the data "1 2 3"
  0x04,   // length of this data including the data type byte
  GAP_ADTYPE_MANUFACTURER_SPECIFIC,      // manufacturer specific advertisement data type
  1,
  2,
  3
};

修改下面关键字

  • UID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
  • Major: 1 (0x0001)
  • Minor: 1 (0x0001)
  • Measured Power: -59 (0xc5)
// GAP - Advertisement data (max size = 31 bytes, though this is
// best kept short to conserve power while advertisting)
static uint8 advertData[] =
{
  // 25 byte ibeacon advertising data
  // Preamble: 0x4c000215
  // UUID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
  // Major: 1 (0x0001)
  // Minor: 1 (0x0001)
  // Measured Power: -59 (0xc5)
  0x1A, // length of this data including the data type byte
  GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type
  0x4c,
  0x00,
  0x02,
  0x15,
  0xe2,
  0xc5,
  0x6d,
  0xb5,
  0xdf,
  0xfb,
  0x48,
  0xd2,
  0xb0,
  0x60,
  0xd0,
  0xf5,
  0xa7,
  0x10,
  0x96,
  0xe0,
  0x00,
  0x01,
  0x00,
  0x01,
  0xc5
};

接下来修改广播类型,将下面代码

//uint8 advType = GAP_ADTYPE_ADV_NONCONN_IND;// use non-connectable advertisements
uint8 advType = GAP_ADTYPE_ADV_DISCOVER_IND; // use scannable unidirected advertisements

修改为

uint8 advType = GAP_ADTYPE_ADV_NONCONN_IND;   // use non-connectable advertisements
//uint8 advType = GAP_ADTYPE_ADV_DISCOVER_IND; // use scannable unidirected advertisements

接下来修改 GAP

// Set the GAP Role Parameters
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );

GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );

因为 iBeacon 必须不间断广播,并且不响应任何数据请求,所以我们要修改 GAPROLE_ADVERT_OFF_TIME 和 GAPROLE_SCAN_RSP_DATA。

// Set the GAP Role Parameters
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
//GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );

//GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );

保存工程后,进行编译,并通过 CCDebugger 下载程序到开发板中。

  1. Select Project > Clean to clean the project.
  2. Select Project > Make to make the project.
  3. Select Project > Download and Debug to send the code to the CC2540 Key Fob
  4. Select Debug > Go to Run the code on the CC2540 Key Fob.

Self-portrait,anti-lost,anti-theft,voice recording device:

Product

Itag is a kind of bluetooth 4.0 low energy products which works through a Itracing App.Itag can chain user's easy-lost & valuable belongs together and works with smart phone to prevent lost.

Itag is also a remote control of your smart phone camera for self-portrait.

Itag can also provide a last seen pin-drop on map to help you recover your items and search your cars in parking site.

Specification:

Bluetooth version:Bluetooth 4.0 low energy consumption

Compatible device:iphone 4S/5/5S/5C/6/6Plus/6C, Ipad Mini, Itouch5,Ipad 3/4 adn android system,Bluetooth 4.0 smart phone(Android 4.3 version and upgrade version)

Working distance:<10 m(outdoor environment)

Battery:CR2032 Lithium Coin Battery,Last about half a year.

Package

User Manual

 

 

simplegattprofile

 

UUID,就是用来唯一识别一个特征值的ID.

handle,就是对应的attribute的一个句柄。

所有对特征值的操作,都是通过对UUID的搜索得到对应的handle之后,通过handle来操作特征值的。

 

添加新的特征值CHAR6

下面对主要几个文件进行修改

simpleGATTprofile.h文件添加以下定义

#define SIMPLEPROFILE_CHAR6                  5

#define SIMPLEPROFILE_CHAR6_UUID           0xFFF6

#define SIMPLEPROFILE_CHAR6_LEN          5(单字节没这句)

 

 

SIMPLEPROFILE_CHAR6 全大写case参数用到case SIMPLEPROFILE_CHAR6

SIMPLEPROFILE CHAR6

 

simpleGATTprofile.c

1、  添加特征值UUID

 

// Characteristic 6 UUID: 0xFFF6

CONST uint8 simpleProfilechar6UUID[ATT_BT_UUID_SIZE] =

LO_UINT16(SIMPLEPROFILE_CHAR6_UUID),   //低八位

HI_UINT16(SIMPLEPROFILE_CHAR6_UUID) }; //高八位

 

/**************#define HI_UINT16(a)   (((a) >> 8) & 0xFF)*******

/**************#define LO_UINT16(a)  ((a) & 0xFF)*******

 

SIMPLEPROFILE CHAR6 uuid

2、  设置属性    

 

// Simple Profile Characteristic 6 Properties 可读可写(声明而已,只是能让lightblue在列表中显示为可读可写或通知,真正要改在属性表那里改。Props= PropertiesDesp=Description

 

static uint8 simpleProfileChar6Props GATT_PROP_READ | GATT_PROP_WRITE;

 

// Characteristic 6 Value   // simpleProfileChar6是个5位数组,接收数据后存在这

static uint8simpleProfileChar6[SIMPLEPROFILE_CHAR6_LEN] = { 0, 0, 0, 0, 0 };

 

// Simple Profile Characteristic 6 User Description

static uint8 simpleProfileChar6UserDesp[17] = "Characteristic 6\0";

                                                                                                                           

4

3、  属性表 Profile Attributes - Table最重要,添加了这个才会在lightblue中列表出来

 

static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED]

这里要把数组改为

#define SERVAPP_NUM_ATTR_SUPPORTED       20 原来是17

                                     //添加了3组结构体数组CHAR6

simpleProfileAttrTbl表中,可读可写属性都是3个数组,只有char4的通知是4组,多了个// Characteristic 4 configuration

 

5

并把CHAR6添加进去

 // Characteristic 6 Declaration (声明,没加这个lightblue属性表找不到)

   {

     { ATT_BT_UUID_SIZE, characterUUID },

     GATT_PERMIT_READ,

     0,

     &simpleProfileChar6Props

   },

// Characteristic Value 6   (特征值)!!!

     

       { ATT_BT_UUID_SIZE, simpleProfilechar6UUID },

       GATT_PERMIT_READ | GATT_PERMIT_WRITE,  //设置可读可写

       0, 

       simpleProfileChar6 //由于值是5位数组,不用&,一个字节就用

     },

 // Characteristic 6 User Description  //描述

     

       { ATT_BT_UUID_SIZE, charUserDescUUID },

       GATT_PERMIT_READ, 

       0, 

       simpleProfileChar6UserDesp 

     },

 

6

能列出来了但是 点进去会报错,还没设置读写参数simpleProfile_WriteAttrCB, 

simpleProfile_ReadAttrCB

 

 

4、设置参数函数 SimpleProfile_SetParameter函数

 

 

bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value )中:

//即修改SimpleProfile_SetParameter();函数

7

 

 

添加以下代码:

case SIMPLEPROFILE_CHAR6:

     if ( len == SIMPLEPROFILE_CHAR6_LEN ) //特征值赋值到数组

     {

       VOID osal_memcpy(simpleProfileChar6, value, SIMPLEPROFILE_CHAR6_LEN );

 //把要改写的数据写到simpleProfileChar6数组来

     }

     else

     {

       ret = bleInvalidRange;

     }

     break;

 

 

8

 

4、  获取参数函数 {SimpleProfile_GetParameterUUID,获取到的值)函数}

                 实际上就是把被新进的值simpleProfileChar6放进value数组

 

bStatus_tSimpleProfile_GetParameter( uint8 param, void *value )中添加:

 

case SIMPLEPROFILE_CHAR6:

     VOID osal_memcpy( value, simpleProfileChar6, SIMPLEPROFILE_CHAR6_LEN );

break;

 

//读取simpleProfileChar6的值放到*value中,char1是单个字节读取,为

*((uint8*)value) = simpleProfileChar1;

9

 

·        6、读写特征值函数2个回调函数

·        这个两个是注册到GATT层的回调函数,GATT初始化的时候注册的.这部分代码封装在库里面.

每当GATT层有数据发过来的时候,会调用simpleProfile_WriteAttrCB, 

每当GATT层收到对方读取数据请求的时候,会调用simpleProfile_ReadAttrCB

这两个函数包含在gattServiceCBs_t类型的结构体里CONST gattServiceCBs_t simpleProfileCBs

simpleProfile_ReadAttrCB

这个设置后就能在lightblue里读出值,值为

simpleProfileChar6[SIMPLEPROFILE_CHAR6_LEN]={数组的数值(16进制显示)}

 

simpleProfile_WriteAttrCB

读取被写进去的值

 

 

 

static uint8 simpleProfile_ReadAttrCB( uint16 connHandle,

                                      gattAttribute_t *pAttr,

                                      uint8 *pValue,  

                                      uint8 *pLen, 

                                      uint16 offset, 

                                      uint8 maxLen )中:

添加 case SIMPLEPROFILE_CHAR6_UUID:

       *pLen = SIMPLEPROFILE_CHAR6_LEN;

       VOID osal_memcpy(pValue, pAttr->pValue, SIMPLEPROFILE_CHAR6_LEN );

      break;        //读:pAttr->pValue的内容复制到pValue

      

10

添加单字节char7要在接char13后面,不能加break

11

 

simpleProfile_WriteAttrCB()中添加(添加后发送过去就不会提示出错了)

 case SIMPLEPROFILE_CHAR6_UUID: 

           //Validate the value检测输入数据是否合法

       // Make sure it's not a blob oper

       if ( offset == 0 )//是第一字节

       {

         if ( len != SIMPLEPROFILE_CHAR6_LEN )

         {

           status = ATT_ERR_INVALID_VALUE_SIZE;

         }//若输入长度不对,status

       }

       else

       {

         status = ATT_ERR_ATTR_NOT_LONG;//不是第一字节

       }

    //Write the value一开始定义了status == SUCCESS,若上述条件不符,不会运行到这里。osal_memcpy(目的A,源地址B,长度)复制B内容到A

 

       if ( status == SUCCESS )

        

       VOID osal_memcpy( pAttr->pValue, pValue, SIMPLEPROFILE_CHAR6_LEN );

       notifyApp = SIMPLEPROFILE_CHAR6;

         //写:pValue的内容复制到pAttr->pValue(别弄反了)

       break;

 

 

(下面没用到)osal_memset为字符串集体赋同一数值 return目的存储区地址

void *osal_memset(void *dest, uint8 value , intlen)

{

Return memset(dest,value,len);

}

 

if ( status == SUCCESS )

        

uint8 *pCurValue = (uint8 *)pAttr->pValue;

osal_memset(pCurValue, 0, SIMPLEPROFILE_CHAR6_LEN );

                                         //为新数组pCurValue赋值N0

VOID osal_memcpy(pCurValue, pValue, SIMPLEPROFILE_CHAR6_LEN );

                                   //复制pValue内容到新数组pCurValue                notifyApp = SIMPLEPROFILE_CHAR6;                                                                                           

 }

 break;

 

12

 

7 .simpleBLEperipheral.c添加初始化值

 

void SimpleBLEPeripheral_Init( uint8 task_id )函数中初始化参数

13

 

现在可以在手机设备中读取CHAR6的值为0x0102030405

char6写进0x3344556677 再读取值已经改写为0x3344556677

星期三, 12 08月 2020 11:50

talent recruitment

Recruit website editors and business development elites.

General Electrical Specification

Absolute Maximum Ratings:  

Ratings  Min.  Max. 
Storage Temperature  -40 +85
Supply Voltage (VCHG)  -0.4V  5.75V 
Supply Voltage (VREG_ENABLE,VBAT_SENSE)  -0.4V  4.2V 
Supply Voltage (LED[2:0])  -0.4V  4.4V 
Supply Voltage (PIO_POWER)  -0.4V  3.6V 

Recommended Operating Condition:

Operating Temperature range  -20 +75
Supply Voltage (VBAT)  2.7V  4.25V 
Supply Voltage (VCHG)  4.75V / 3.10 V  5.25V 
Supply Voltage (VREG_ENABLE,VBAT_SENSE)  0V  4.2V 
Supply Voltage (LED[2:0])  1.10V  4.25V 
Supply Voltage (PIO_POWER)*  1.7V  3.6V

1.8V Switch-mode Regulator :

 

 

 

 

 

 

 

星期六, 08 08月 2015 20:37

Bluetooth controlled BLE RGB LED light strip

Click here

Undersea rescue system based on bionic stretchable nanogenerator.
 
Photograph of undersea rescue system which included (a) integrated energy harvesting diving suit, (b) integrated wireless transmitter and (c) wireless receiver integrated with a red warning light. d Simple circuit diagram of undersea rescue system. e Voltage changes of a 100 μF capacitor charged by BSNG and used to power a wireless transmitter to emit a trigger signal. f Physical map of undersea rescue system sending an alert when swimmer in danger (red LED was lighted up remotely)
 

The nRF52 Series of System-on-Chip (SoC) devices embed a powerful yet low-power Arm® Cortex®-M4 processor with our industry leading 2.4 GHz RF transceivers. In combination with the very flexible orthogonal power management system, and a programmable peripheral interconnect (PPI) event system, the nRF52 Series enables you to make ultra-low power wireless solutions.

The nRF52 Series offers pin-compatible device options for Bluetooth® Low Energy, proprietary 2.4 GHz, and ANT™ solutions giving you the freedom to develop your wireless system using the technology that suits your application the best. Our unique memory and hardware resource protection system allows you to develop applications on devices with embedded protocol stacks running on the same processor without any need to link in the stack or strenuous testing to avoid application and stack from interfering with each other.

nRF52 Series IC comparison

FeaturesnRF52805nRF52810nRF52811nRF52820nRF52832nRF52833nRF52840
CPU Cortex-M4 Cortex-M4 Cortex-M4 Cortex-M4 Cortex-M4 with FPU Cortex-M4 with FPU Cortex-M4 with FPU
64 MHz 64 MHz 64 MHz 64 MHz 64 MHz 64 MHz 64 MHz
 
Memory 192 kB flash 192 kB flash 192 kB flash 256 kB flash 512/256 kB flash 512 kB flash 1 MB flash
- - - - Cache Cache Cache
24 kB RAM 24 kB RAM 24 kB RAM 32 kB RAM 64/32 kB RAM 128 kB RAM 256 kB RAM
 
EasyDMA MAXCNT bit length I2S - - - - 14 14 14
PDM - 15 15 - 15 15 15
PWM - 15 15 - 15 15 15
RADIO 8 8 8 8 8 8 8
SAADC - 15 15 - 15 15 15
SPIM 14 10 14 15 8 16 16
SPIS 14 10 14 15 8 16 16
TWIM 14 10 14 15 8 16 16
TWIS 14 10 14 15 8 16 16
UARTE 10 10 10 15 8 16 16
NFCT - - - - 9 9 9
USBD - - - 7 - 7 7
QSPI - - - - - - 20
 
Crypto AES engine AES engine AES engine AES engine AES engine AES engine AES engine
- - - - - - CryptoCell™310
 
Radio Protocols Bluetooth Low Energy/ANT/2.4 GHz Bluetooth Low Energy/ANT/2.4 GHz Bluetooth Low Energy/ANT/2.4 GHz/IEEE 802.15.4 Bluetooth Low Energy/Bluetooth mesh/Thread/ Zigbee/ANT/2.4 GHz/IEEE 802.15.4 Bluetooth Low Energy/Bluetooth mesh/ANT/2.4 GHz Bluetooth Low Energy/Bluetooth mesh/Thread/ Zigbee/ANT/2.4 GHz/IEEE 802.15.4 Bluetooth Low Energy/Bluetooth mesh/Thread/ Zigbee/ANT/2.4 GHz/IEEE 802.15.4
Bluetooth 5 PHYs 2 Mbps 2 Mbps 2 Mbps/Long range 2 Mbps/Long range 2 Mbps 2 Mbps/Long range 2 Mbps/Long range
Bluetooth 5.1 support - - Yes Yes - Yes -
Output power +4 dBm +4 dBm +4 dBm +8 dBm +4 dBm +8 dBm +8 dBm
Sensitivity -97 dBm (Bluetooth 1 Mbps) -96 dBm (Bluetooth 1 Mbps) -97 dBm (Bluetooth 1 Mbps) -95 dBm (Bluetooth Low Energy 1 Mbps) -96 dBm (Bluetooth Low Energy 1 Mbps) -95 dBm (Bluetooth Low Energy 1 Mbps) -95 dBm (Bluetooth Low Energy 1 Mbps)
 
Clock 32 MHz crystal 32 MHz crystal 32 MHz crystal 32 MHz crystal 32 MHz crystal 32 MHz crystal 32 MHz crystal
64 MHz on chip (PLL) 64 MHz on chip (PLL) 64 MHz on chip (PLL) 64 MHz on chip (PLL) 64 MHz on chip (PLL) 64 MHz on chip (PLL) 64 MHz on chip (PLL)
32.768 kHz crystal (optional) 32.768 kHz crystal (optional) 32.768 kHz crystal (optional) 32.768 kHz crystal (optional) 32.768 kHz crystal (optional) 32.768 kHz crystal (optional) 32.768 kHz crystal (optional)
32.768 kHz on-chip RC 32.768 kHz on-chip RC 32.768 kHz on-chip RC 32.768 kHz on-chip RC 32.768 kHz on-chip RC 32.768 kHz on-chip RC 32.768 kHz on-chip RC
External 32.768 kHz clock External 32.768 kHz clock External 32.768 kHz clock External 32.768 kHz clock External 32.768 kHz clock External 32.768 kHz clock External 32.768 kHz clock
 
Power management 1.7 V to 3.6 V supply voltage 1.7 V to 3.6 V supply voltage 1.7 V to 3.6 V supply voltage 1.7 V to 5.5 V supply voltage
  • 1.7 V to 3.6 V (VDD)
  • 2.5 V to 5.5 V (VDDH)
1.7 V to 3.6 V supply voltage 1.7 V to 5.5 V supply voltage
  • 1.7 V to 3.6 V (VDD)
  • 2.5 V to 5.5 V (VDDH)
1.7 V to 5.5 V supply voltage
  • 1.7 V to 3.6 V (VDD)
  • 2.5 V to 5.5 V (VDDH)
1 stage LDO and DC/DC 1 stage LDO and DC/DC 1 stage LDO and DC/DC 2 stage regulator LDO for high voltage and DC/DC or LDO for low voltage 1 stage LDO and DC/DC 2 stage regulator LDO for high voltage and DC/DC or LDO for low voltage 2 stage LDO and DC/DC
- - - On-chip VBUS 3.3 V reg - On-chip VBUS 3.3 V reg On-chip VBUS 3.3 V reg
- - - - - - Regulated supply for external components
 
Digital interfaces 1 × SPI master and slave 1 × SPI master and slave 2 × SPI master and slave 2 × SPI master and slave 3 × SPI master and slave 4 × SPI master and 3 × SPI slave 4 × SPI master and 3 × SPI slave
1 × TWI master and slave 1 × TWI master and slave 1 × TWI master and slave 2 × TWI master and slave 2 × TWI master and slave 2 × TWI master and slave 2 × TWI master and slave
1 × UARTE 1 × UARTE 1 × UARTE 1 × UARTE 1 × UARTE or UART 2 × UARTE 2 × UARTE
- 1 × PWM 1 × PWM - 3 × PWM 4 × PWM 4 × PWM
- QDEC QDEC QDEC QDEC QDEC QDEC
- PDM PDM - PDM PDM PDM
- - - - I2S I2S I2S
- - - 1 × USB Full-speed device - 1 × USB Full-speed device 1 × USB Full-speed device
- - - - - 1 × high-speed SPI master 1 × high-speed SPI master
- - - - - - 1 × Quad SPI (w.XIP)
 
Analog interfaces - 64-level analog comp 64-level analog comp 64-level analog comp 64-level analog comp 64-level analog comp 64-level analog comp
- - - - 15-level low-power comp 15-level low-power comp 15-level low-power comp
2-channel 12-bit ADC 8-channel 12-bit ADC 8-channel 12-bit ADC - 8-channel 12-bit ADC 8-channel 12-bit ADC 8-channel 12-bit ADC
- - - - NFC Tag NFC Tag NFC Tag
True Random Number Generator True Random Number Generator True Random Number Generator True Random Number Generator True Random Number Generator True Random Number Generator True Random Number Generator
Temperature sensor Temperature sensor Temperature sensor Temperature sensor Temperature sensor Temperature sensor Temperature sensor
 
Timers 3 × 32-bit 16 MHz timers 3 × 32-bit 16 MHz timers 3 × 32-bit 16 MHz timers 4 × 32-bit 16 MHz timers 5 × 32-bit 16 MHz timers 5 × 32-bit 16 MHz timers 5 × 32-bit 16 MHz timers
2 × 32.768 kHz RTC 2 × 32.768 kHz RTC 2 × 32.768 kHz RTC 2 × 32.768 kHz RTC 3 × 32.768 kHz RTC 3 × 32.768 kHz RTC 3 × 32.768 kHz RTC
Watchdog timer (32.768 kHz) Watchdog timer (32.768 kHz) Watchdog timer (32.768 kHz) Watchdog timer (32.768 kHz) Watchdog timer (32.768 kHz) Watchdog timer (32.768 kHz) Watchdog timer (32.768 kHz)
 
Other interfaces SWI debug interface SWI debug interface SWI debug interface SWI debug interface SWI debug interface SWI debug interface SWI debug interface
 
PPI 10 programmable channels 20 programmable channels 20 programmable channels 20 programmable channels 20 programmable channels 20 programmable channels 20 programmable channels
12 fixed channels 12 fixed channels 12 fixed channels 12 fixed channels 12 fixed channels 12 fixed channels 12 fixed channels
6 channel groups 6 channel groups 6 channel groups 6 channel groups 6 channel groups 6 channel groups 6 channel groups
 
Other features BPROT BPROT BPROT BPROT BPROT ACL ACL
6 × SWI 6 × SWI 6 × SWI 6 × SWI 6 × SWI 6 × SWI 6 × SWI
2 × EGU 2 × EGU 2 × EGU 6 × EGU 6 × EGU 6 × EGU 6 × EGU
- - - - MWU MWU MWU
 
Power fail Power fail comparator and brownout Power fail comparator and brownout Power fail comparator and brownout Power fail comparator and brownout Power fail comparator and brownout Power fail comparator and brownout Power fail comparator and brownout
 
GPIO Up to 10 pins Up to 32 pins Up to 32 pins Up to 18 pins Up to 32 pins Up to 42 pins Up to 48 pins
8 × GPIOTEs channels 8 × GPIOTEs channels 8 × GPIOTEs channels 8 × GPIOTEs channels 8 × GPIOTEs channels 8 × GPIOTEs channels 8 × GPIOTEs channels
 
Packages - 6 × 6 QFN48 w/32 GPIOs 6 × 6 QFN48 w/32 GPIOs - 6 × 6 QFN48 w/32 GPIOs 7 × 7 AQFN73 w/42 GPIOs 7 × 7 AQFN73 w/48 GPIOs
- 5 × 5 QFN32 w/17 GPIOs 5 × 5 QFN32 w/17 GPIOs 5 × 5 QFN40 w/18 GPIOs and USB - 5 × 5 QFN40 w/18 GPIOs & USB -
2.5 × 2.5 WLCSP w/10 GPIOs 2.5 × 2.5 WLCSP w/15 GPIOs 2.5 × 2.5 WLCSP w/15 GPIOs - 3.0 × 3.2 WLCSP w/32 GPIOs & USB 3.2 × 3.2 WLCSP w/42 GPIOs & USB 3.5 × 3.5 WLCSP w/48 GPIOs
 
Temperature -40 to 85°C -40 to 85°C -40 to 85°C -40 to 105°C -40 to 85°C -40 to 105°C -40 to 85°C