蓝牙芯片组 MT1020基带控制器 PH2401无线收发器 蓝牙系统结构 功能块 蓝牙无绳电话 1 关于蓝牙 “蓝牙”是一项令人振奋的技术,它利用微波取代传统中错综复杂的电缆,使家庭或办公场所的移动电话、便携式计算机、打印机、复印机、键盘、耳机及其它手持设备实现互联互通,将人们从无数的连接电缆中解放出来,自由方便地构成自己的个人网络。有了蓝牙,你甚至不用掏出你的移动电话,就可以用PDA(个人数字助理)通过口袋中的移动电话查阅新闻、订票以及进行其它电子商务活动,无拘无束、自由自在。这个由爱立信公司于1995年提出的概念已广泛地为业界所接受,从SIG(蓝牙特殊利益集团)的成员就可以看出业界对它的重视程度。SIG的九个成员包括爱立信、诺基亚、摩托罗位、3COM、IBM、INTEL等,都是各自行业的“领导者”。
1 目前,这一技术已经有2000多家支持厂商。蓝牙技术的应用非常广泛,来自IDC的数据预测,到2005年全球围绕移动设备、桌面设备和其它设备将有40亿蓝牙产品被广泛应用,具有极大的市场潜力。 作为取代数据电缆的短距离无线通信技术,蓝牙支持点对点及对多点的通信,它以无线方式将家庭或办公室中的各种数据和语音设备联成一个微微网(Piconet),几个微微网还可以进一步实现互联,形成一个分布式网络(Scatternet),从而在这些联接设备之间实现快捷而方便的通信联系。蓝牙的工作频段为全球开放的2.4GHz ISM(工业、科学、医学)频段,由于就保证施行者可以毫无障碍地使用蓝牙设备。由于ISM频段是对所有无线电都开放的频段,汽车、微波炉等将有可能成为其不可预测的干扰源,因此对蓝牙特别设计了快速确认和跳频方案以确保连接的稳定和数据保密。在目前公布的蓝牙规范“Bluetooth V1.0”中,数据传输速率最大为721kbit/s,通信距离为10m,若加大发射功率,通信距离可达100m。
2 蓝牙系统结构 MT1020基带控制器和PH2401无线收发器分别由MITEL公司和PHILSAR公司提供,两者配合可构成完整的低功耗的蓝牙模块,提供高至HCI(主机控制接口)层的功能。它们在蓝牙系统中的位置如图1所示。 MT1020基带控制器负责蓝牙基带部分的功能,完成基带以及链路的管理,包括对SCO(同步)和ACL(异步)连接方式的支持、差错控制、物理层的认证与加密、链路管理等;PH2401实现数据的无线接收和发送;虚线以上部分由用户根据不同的应用需求来实现。特别值得一提的是,在该蓝牙模块解决方案中,即将推出的改进型基带控制器MT1020B可提供20K的用户ROM,使用户可以利用其内嵌的低功耗、高性能的32位ARM7TDMI内核,从而简化用户设计,实现最低楞耗、最高集成度的蓝牙产品。
3 蓝牙芯片组简介
3.1 MT1020的内部结构及各功能块介绍
MT1020由嵌入式微处理器和蓝牙基带外设组成,如图2所示。在该芯片中,系统仙部时钟可以低至5MHz、内核供电电压为2V、硬件解码、支持DMA传输,所有这些使得该芯片具有超低功耗。
3.1.1 基带外设
基带外设以最小的开销完成重要的蓝牙操作,它挂在“向上集成模块总线(Uintegration Module Bus)”上,由以下几个功能块组成。
3.1.1.1 总线接口
总线接口完成微处理器与基带外设之间的通信,基带外设内各个模块之间使用专门的BT总线传送数据。
3.1.1.2 链路控制器
链路控制器与PH2401无线收发器接口,需要发送的数据在链路控制器中被装配,加上同步字、帧头以及CRC校验字,并且被白化,是否进行加密可由用户选择;收到的数据由在此被解码、检错。 3.1.1.3 队列管理器 队列管理器完成缓冲RAM与链路控制器以及USB或串行主机与音频接口之间的智能DMA传输。它能识别不同格式的蓝牙数据包,并能进行相互转换。 3.1.1.4 缓冲RAM 专门用于存储蓝牙数据包和变量,容量为12K Byte。
3.1.1.5 音频编解码器 音频编解码器是一个全双工的编解码器,包括麦克风放大器和耳机驱动器,其听数字转换器能够进行线性PCM、A律PCM、μ律PCM及CVSD(连续可变斜率增量调制)之间的相互转换。
3.1.2 嵌入式微控制器内核
嵌入式微处理器由32位RISC架构的ARM7TMDI中内处理单元、专用的模块交互总线(Inter-Module Bus)和其它一些功能块组成。 3.1.2.1 ARM7TDMI处理器 ARM7TDMI是一款性能优异的嵌入式CPU,具有极快的运算速度和很低功耗,利用其内部的Thumb指令压解器可支持16位指令,并支持扩展调试、快速乘法等功能,它通过模块交互总线其它功能块交换数据。
3.1.2.2 外设控制器
外设控制器是MT1020A中内部总线与外部总线进行通信的主要通道,它支持动态总线宽度,并能产生访问外设所需要的控制信号。
3.1.2.3 串行I/O 串行I/O用来连接各种串行接口器件,例如与串行EEPROM、串行时钟等器件接口。
3.1.2.4 中断控制器 ARM7TDMI处理器接受两种中断请求:普通中断请求和快速中断请求。根据用户所需要的优先级,所有中断都可设置成两种类型中的一种。中断控制器能处理八个外部中断和两个内部中断。外部中断可被编程设置成电平触发或沿触发。为减少中断响应的延迟时间,对每种类型的中断,中断控制器能进行硬件优先级判断,从而加快对中断的实时响应。
3.1.2.5 定时器/计数器 MT1020A提供两个双独立32位定时器/计数器,它们与系统时钟同步,可以在程序中轮询,也可设置成溢出中断,并能自动重装。
3.1.2.6 DMA控制器 在该控制器中有两个DMA引擎,它们可以配置成一对,从而支持ARM7TDMI中任意位置两个内存块的DMA传输。当然,它们也可独立使用。
3.1.2.7 通用异步收发器 通用异步收发器接口形式为RS-232,支持硬件握手和XON/XOFF软件协议,收发通道上各有一个缓冲器,可以在程序中轮询,也可使用中断形式。器件内部的波特率发生器用来产生需要的数据速率。
3.1.2.8 系统存储器 系统存储器挂在UIM总线上。MT1020有20KB的内部静态RAM,用于程序变量的存储。用户需要外挂一个外部ROM/FLASH来存储蓝牙链路控制和管理协议代码。在MT1020的下一个版本中,将提供片上ROM,并具备存储用户代码的能力,从而简化用户设计,降低功耗。
3.2 PH2041蓝牙无线收发器功能
PH2401单片无线收发器用砷化镓工艺制造,具有高集成度、超低功耗、体积小等优点,专门优化用于2.4GHz无线个人系统,完全兼容蓝牙规范“Bluetoooth V1.0”。它工作于2.4GHz的ISM频段,以每秒1600次的速度在79个频道(2.402GHz-2.408GHz)上快速跳频,最大位传输速率可达1Mbit/s。 PH2401采用调制指数为0.3的高斯频移键控制(GFSK)调制方式,信道带宽为1MHz,频偏在140kHz-175kHz之间,满足蓝牙2级和3级操作, 送功率可在-10dBm-+2dBm之间编程设定,发射范围为10-100m。接收器由RF-IF下变频器、自动增益控制(AGC)、滤波器、双通道模/数转换器及调制器组成。 基带控制器通过串行总线与PH2401接口。通过对其内部寄存器的读写实现跳频、调谐等其它控制。
4 蓝牙无绳电话 由MT1020和PH2401构成的蓝牙模块提供高至HCI的功能,因此可以很方便地利用它构成蓝牙系统。我们采用该芯片组设计了蓝牙无绳电话。 根据蓝牙规范对无绳电话的协议要求,无绳电话实现协议栈如图3所示。 通过服务发现协议(SDP),子机寻找通信范围内所有蓝牙设计信息和服务类型,从而与无绳电话主机建立连接。语音呼 叫的控制信令则在二元电话控制协议(TCS Binary)中定义。逻辑链路控制应用协议(L2CAP)向上层提供面向连接和无连接的逻辑链路。传输上层协议数据。语音流不经过逻辑链路控制应用协议(L2CAP),直接与基带控制器连接,使用连续可变斜率增量调制(CVSD)技术,以获得高质量传输的音频编码。 蓝牙无绳电话子机的基本电话框图如图4所示。 MCU不仅完成对键盘、显示器的控制,而且实现TCS Binary、DSP和L2CAP协议,受话送话器直接与MT1020基带控制器连接,系统简洁、可靠,具有很好的性能价格比。

- Overview:
- The AC781x product serials is MCU of automotive grade, complies with the AEC-Q100 specification, and is suitable for automotive electronics and high reliability industrial applications.Typical applications cover BCM, T-BOX, BLDC motor control, industrial control, AC charging piles, etc.
The AC781x device family is based on ARM Cortex®-M3 core, running up to 100MHz,up to 256KB Flash memory,supply voltage ranges from 2.7 to 5.5V, excellent EMC/ESD capability to be suit for harsher environment.
- Features:
- - ARM Cortex®-M3 core,100MHz, single cycle 32x32 multiplier
- Support up to 256KB embedded Flash memory
- Support up to 64KB RAM
- Support 2*CAN 2.0B
- Support 1*LIN 2.1, 1*URAT LIN
- Support 2*SPI
- Support up to 6*UART
- Support 2*I2C
- 2.7-5.5V power supply
- Temperature range: -40 to 125 °C
当前很多TWS耳机没有对主控芯片进行标注,对于消费者来说也少了一个很重要的评判价值标准。
络达、瑞昱、恒玄、杰理、中科蓝讯作为独立TWS耳机芯片原厂虽然不具备与手机端的先天优势,但是通过他们在技术上的钻研与市场上的努力也获得了众多音频品牌厂商的采用与认可。
准备工作
- 一台 PC
- IAR Embedded Workbench 集成开发环境,可以用30天试用版本。
- 支持 蓝牙 4.0 的智能手机一部,并安装下列应用之一
- Android Google Play Store.
- iPhone App Store.
- CC2540 开发板
- 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 下载程序到开发板中。
- Select Project > Clean to clean the project.
- Select Project > Make to make the project.
- Select Project > Download and Debug to send the code to the CC2540 Key Fob
- Select Debug > Go to Run the code on the CC2540 Key Fob
1.iBeacon的前世今生
苹果公司,其产品的开发对外历来都是神秘的,正当三星和诺基亚大力推进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】修改广播数据:
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。
【2】, 点击Locate iB 进去后如下图,
【3】, 点击 Locate iBeacons 进入如下界面,如果你的基站已经打开,即可看到如图所示的设备, 下图中 就直接显示了你的手机与 iBeacon 基站间的距离,这个距离可能随着不同的硬件设备而有所差异, 所以需要校准, 请看下一步如何校准。这里为什么一打开这个软件就实现了距离显示了呢,主要是该软件内默认添加了苹果公司发布的UUID,我们亦可以修改基站的uuid,然后在该软件中添加该uuid,同样也能实现该功能的,这个做起来就要深入开发了。
【4】,校准, 点击第一行 ,进入下一步。
【5】,校准提示,把你的iphone放到距离iBeacon基站约1米处,按下Calibrate ,并且保持30秒到1分钟,过程如下面图。
【6】, 校准完毕, 下面图显示聚焦校准完毕了, 你可以随意拿你的 iphone到处走,神奇的iBeacon就告诉你你所处的距离,如果有3个以上的iBeacon基站信号能够被收到,那么就可以实现比较真正的室内定位了。
【7】,显示距离如下。
4.3数据分析
好吧, 上述的iBeacon功能基本完成了,那么, 到底SmartRF开发板与iOS的数据交互如何的呢,这个时候就需要网络协议分析仪来抓包并分析数据了。
准备工作
- 一台 PC
- IAR Embedded Workbench 集成开发环境,可以用30天试用版本。
- 支持 蓝牙 4.0 的智能手机一部,并安装下列应用之一
- Android Google Play Store.
- iPhone App Store.
- CC2540 开发板
- 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 下载程序到开发板中。
- Select Project > Clean to clean the project.
- Select Project > Make to make the project.
- Select Project > Download and Debug to send the code to the CC2540 Key Fob
- 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
UUID,就是用来唯一识别一个特征值的ID.
handle,就是对应的attribute的一个句柄。
所有对特征值的操作,都是通过对UUID的搜索得到对应的handle之后,通过handle来操作特征值的。
添加新的特征值CHAR6
下面对主要几个文件进行修改
simpleGATTprofile.h文件添加以下定义
#define SIMPLEPROFILE_CHAR6
#define SIMPLEPROFILE_CHAR6_UUID
#define SIMPLEPROFILE_CHAR6_LEN
SIMPLEPROFILE_CHAR6
在simpleGATTprofile.c
1、
// 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)
/**************#define LO_UINT16(a)
2、
// Simple Profile Characteristic 6 Properties
static
// Characteristic 6 Value
static uint8simpleProfileChar6[SIMPLEPROFILE_CHAR6_LEN] = { 0, 0, 0, 0, 0 };
// Simple Profile Characteristic 6 User Description
static uint8 simpleProfileChar6UserDe
3、
static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED]
这里要把数组改为
#define SERVAPP_NUM_ATTR_SUPPORTED
simpleProfileAttrTbl表中,可读可写属性都是3个数组,只有char4的通知是4组,多了个// Characteristic 4 configuration
并把CHAR6添加进去
// Characteristic Value 6
能列出来了但是 点进去会报错,还没设置读写参数simpleProfile_WriteAttrCB,
simpleProfile_ReadAttrCB
4、设置参数函数
bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value )中:
//即修改SimpleProfile_SetParameter();函数
添加以下代码:
case SIMPLEPROFILE_CHAR6:
4、
在bStatus_tSimpleProfile_GetParameter( uint8 param, void *value )中添加:
case
break;
//读取simpleProfileChar6的值放到*value中,char1是单个字节读取,为
*((uint8*)value) = simpleProfileChar1;
·
·
每当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,
添加
添加单字节char7要在接char1或3后面,不能加break
在simpleProfile_WriteAttrCB()中添加(添加后发送过去就不会提示出错了)
(下面没用到)osal_memset为字符串集体赋同一数值
void
{
Return
}
if ( status == SUCCESS )
uint8 *pCurValue = (uint8 *)pAttr->pValue;
osal_memset(pCurValue, 0, SIMPLEPROFILE_CHAR6_LEN );
VOID osal_memcpy(pCurValue, pValue, SIMPLEPROFILE_CHAR6_LEN );
7 .在simpleBLEperipheral.c添加初始化值
在void SimpleBLEPeripheral_Init( uint8 task_id )函数中初始化参数
现在可以在手机设备中读取CHAR6的值为0x0102030405;
向char6写进0x3344556677
CSR8635/CSR8615 Class2 Stereo ROM Module Electrical characteristic
男作者 Blue StarGeneral 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 :