




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Ti CC2540 蓝牙模块学习笔记整理 接触 CC2540 几天,终于有了初步的理解,现将笔记整理如下,只是皮毛,如有错误,还请指正,还有好 多没闹明白的地方,以后应该还会继续向里面更新 一、整体 1. TI 的蓝牙平台支持 2 种协议栈 /应用配置:单一设备配置、网络处理器配置 2. 协议栈最顶层 2 个通用 profile : GAP 通用访问配置文件层 Generic Access Profile GATT 通用属性配置文件层 Generic Attribute Profile 3. GAP :处理设备的接入方式及接入过程:设备发现链路建立 链路终止启动安全功能 设备 配置(主要是连接
2、参数配置) GATT :完成服务器与客户端之间通信的相关子过程 4. BLE支持40个信道的跳频机制,其中 3个通道用于Advertise,剩下的用于数据通信 5.OS 抽象层:疑问 如何配置一个新的任务,任务的优先级,事件触发机制,消息的传递 6. 主要用于实现的是 2 个代码文件: OSAL_SimpleBLEPeripheral.c 任务回调函数数据的定义 和 任务初始化函数定义 作为 OSAL 的外部全局 变量 SimpleBLEPeripheral.c BLE 应用程序的实现代码,该源文件调用一系列的 BLE API 函数,完成复杂的蓝牙 协议 通过 constpTaskEventH
3、andleFntasksArr 数组来存储要调用的函数 simpleBLEPeripheral.h 一些常量的定义,和蓝牙应用程序任务初始化和任务回调函数声明。 7. LL 层任务函数优先级 最高, 而应用程序函数的优先级最低 8.OSAL为每个任务分配了 1个16位的Event,每一位代表一个事件,最高位代表SYS_EVENT_MSG,这 个事件被 OSAL 系统保留 9. main()函数中最后进入的 void osal_run_system( void ),这个函数就是看相应任务有没有事件发生,有时间 发生就跳转到相应的函数 10. 任务间通信,一般通过 事件 和 消息 进行,每当任务间
4、有消息传递,都会触发 SYS_EVENT_MSG 事 件,并且每次处理完事件后,都要清空标志位。 osal_set_event() OSAL.h 中 该函数会直接调度一个事件 osal_start_timerEx() OSAL_Timers.h 中 需要掩饰触发的事件,调用这个函数 II. Heap Manager(堆栈管理),函数osal_mem_alloc,给函数分配需要的字节数,osal_mem_free()用来释放内 存。 二、OSAL ( 操作系统抽象层 Operate System Abstraction Layer ) 1.OSAL 中的消息: 发送消息前,用osal_msg_a
5、llocate()函数分配内存空间,填充数据,调用osal_msg_send()将消息发送到指定 的函数中去。然后置位该函数的 SYS_EVENT_MSG,然后接收端使用osal_mem_receive()将消息接收过来, 接收完成后,使用osal_mem_deallocate()函数来回收当前消息所占用的内存。OSAL推荐在任务中使用独立 的消息接收函数来处理消息,例如: simpleBLEPeripheral_ProcessOSALMsg() 函数。 2. GAP (通用访问配置文件层 Generic Access Profile ) 连接过程:设备发现链路建立链路终止启动安全功能设备配置
6、(主要是连接参数配置) GAP 层总是工作在以下角色中的 1 种: Broadcaster 广播员,表明我在,但是你们只能看到我,不可以连接我 Observer 观察者,看看谁在,我只观察,不连接 Peripheral 外设,我存在,设想连我,我就连谁 Centeral 中心,看看谁在,工作在单层或多层的连接 3. 连接过程:Peripheral向外广播-Centeral接收到向从机发送 “Scar命令-Peripheral以“ScanRes命令回 应-Centeral发送连接请求 4. Connect Interval通信间隙 每个间隔1.25ms为基本单位,最小 6单位7.5mS,最大32
7、00单位4.0S。 5.Slave Latency从机延时 表示Peripheral可以连续忽略的连接数,最大不能超过499个,最长不能超过32S。 6.Supervision Timeout 监管超时 2 个成功连接事件之间的最大间隔。 7. Profile 一种规范 ; Service 一个服务 ; Characteristic 特征值 ; UUID 统一标识码 (Service,Characteristic 都需要), Centeral 与 Peripheral 间的通信,均通过 Characteristic 实现 8. 发送数据 主-从 Client 调用 GATT_WriteChar
8、Value() 函数发送; 从- 主 Service 调用 GATT_Notification() 函数实现 9. 接收数据 从-主 从机接收后,会产生 1 个 GATT_Profile_Callback 调用; 三、BLE 四、低功耗部分 1. 如何总是在 PM1 osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); 2. 如何进入 PM2 osal_pwrmgr_device( PWRMGR_BATTERY ); 在空闲的时候就会进入到 PM2 模式 3. 如何进入 PM3 存在连接就断开连接,存在广播就停掉广播,并确认自己创建的所有定时任务都已关闭,则系统应该就
9、会 进入 PM3 模式,只能进行外部中断唤醒 4. CC2540 低功耗中引脚的设置问题 不用的引脚应该与外部不连接,并将引脚配置为通用上拉输入状态(除了P1.0,P1.1),并且这些脚不应该 与 VDD , GND 直接相连。 *关于 P1.0,P1.1,“ User Guide给”的解释是except P1.0 and P1.1, which do not have pullup/pulldown capability ,字面意思是没有上下拉能力,可是我没理解,这个上下拉,是指什么。 五、常用的命令,功能,以及实现方法 1. 切换电源模式 osal_pwrmgr_device( PWRMG
10、R_ALWAYS_ON ); osal_pwrmgr_device( PWRMGR_BATTERY ); 2. Peripheral 怎么主动断开与 Centeral 的连接 bStatus_tGAPRole_TerminateConnection(); 在文件 peripheralBroadcaster.c 文件中 3. 怎么设置 Peripheral 的广播的超时时间 首先保证是限制类型的广播 即 DEVDISC_MODE_LIMIT( 永久广播是 DEVDISC_MODE_GENERAL ) ,在 simpleBLEPeripheral.c 文件 static uint8 advertD
11、ata 数组中设置。 当模式处于Limit模式时,广播超时的设置可通过设置宏TGAP_LIM_ADV_TIME_OUT,不设置的话,默 认超时时间是180S。 4. 如何打开与关闭广播 uint8 initial_advertising_enable = TRUE/FALSE TRUE :打开广播 FALSE :关闭广播 GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof(uint8), CC2541 BLE源码阅读知识积累之外设从机Peripheral工作模式 阅读的源代码:核心主要是位于BLE/project/SimpleBLEPeri
12、pheral部分 阅读的参考文档:TI_BLE_Software_Developers_Guide.pdf ,BLE_CC2540_DeepDive_Training_2011.pdf , TI_BLE_Sample_Applications_Guide.pdf ,SIG 的 Core_V4.0.pdf 在BLE的源码架构中,感觉是好复杂,还好TI对协议栈不开源,不然就得累死。能力有限只能把整个架 构从最简单的主从工作模式入手。 1.BLE中主从机建立连接,到配对和绑定的过程如下图。 Advertise!从机处于广减态 R蚀社址门I,.机集迢,厂对I】心打描诂求沢外比 :盘前繼印Q肪岀从机接收
13、请求忙軀回押描响园到帶l Establish Link Request:卞机向从机发谜一个连揍请求 次完黠的连接J connect F.vr-nt 旳汁恤;配对过片 Bond nn;綁定过艸.卞从欄绑定后下次连捲可以快速配对 正如上图所示,最简单一次蓝牙通信需要以上相关步骤,包括discovery device,connect,pairing,bond等4个 主要部分。 2.BLE 中的 GAP 和 GATT 初始接触,感觉十分的抽象,到现在为止,GAP个人认为就是监控上图中的交互状态,比如从广播变成连 接,到配对等。 GATT通俗理解为用于主从机之间的客户端和服务器端的数据交互,以Attri
14、bute Table来体现。 GAP Role Profile:在GAP剧本里所处的 4个角色:广播 Advertise,主机central,从机Peripheral,观察者 Observer。 GATT Attribute:通用属性配置文件。 3.SimpleBLEPeripheral_lnit 函数解析。 无论是在主机还是从机,任何的蓝牙都将这部分内容作为自己的APPlication,在init中都会完成Bluetooth 的GAP,GATT,SM等相关初始化。 void SimpleBLEPeripheral_Init( uint8 task_id ) simpleBLEPeripher
15、al_TasklD = task_id; / Setup the GAP Peripheral Role Profile /GAP 外设剧本 #if defined( CC2540_MINIDK ) / For the CC2540DK-MINI keyfob, device doesnt start advertising until button is pressed uint8 initial_advertising_enable = FALSE; #else / For other hardware platforms, device starts advertising upon i
16、nitialization uint8 initial_advertising_enable = TRUE;/ 广播使能 #endif / By setting this to zero, the device will go into the waiting state after / being discoverable for 30.72 second, and will not being advertising again / until the enabler is set back to TRUE uint16 gapRole_AdvertOffTime = 0; uint8 e
17、nable_update_request = DEFAULT_ENABLE_UPDATE_REQUEST;使能请求更新 uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL; / 最小连接间隔 0.1ms uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;/ 最大连接间隔 1ms uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;/O uint16 desired_conn
18、_timeout = DEFAULT_DESIRED_CONN_TIMEOUT;/10s,定义该参数表示在该时间段 内建立的连接不成功 / Set the GAP Role Parameters GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanR
19、spData );/ 当主机扫 描到广播后会发岀扫描请求,从机就发回该数据到主机 GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );/ 广播参数 GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), GAPRole_SetParameter( GAPROLE_MAX_CO NN
20、N TERVAL, sizeof( uint16 ), GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), / Set the GAP Characteristics, Set GAP GATT Server parameter GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName );/GAP
21、 GATT服务器参数设置 / Set advertising interval uint16 advInt = DEFAULT_ADVERTISING_INTERVAL; GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt ); GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt ); GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt ); GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX,
22、advInt ); / Setup the GAP Bond Manager /GAP 绑定管理器设置 uint32 passkey = 0; / passkey 000000,密钥 uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;配对模式,配置成等待主机的配对请 求 uint8 mitm = TRUE; uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; uint8 bonding = TRUE; GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, siz
23、eof ( uint32 ), GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), / Initialize GA
24、TT attributes GGS_AddService( GATT_ALL_SERVICES );/ GAP GATTServApp_AddService( GATT_ALL_SERVICES );/ GATT attributes Devlnfo_AddService();/ Device Information Service SimpleProfile_AddService( GATT_ALL_SERVICES );/ Simple GATT Profile #if defined FEATURE_OAD VOID OADTarget_AddService();/ OAD Profil
25、e #endif / Setup the SimpleProfile Characteristic Values,对相关数值做初始化 uint8 charValue1 = 1; uint8 charValue2 = 2; uint8 charValue3 = 3; uint8 charValue4 = 4; uint8 charValue5SIMPLEPROFILE_CHAR5_LEN = 1,2, 3, 4, 5 ; SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR1, sizeof ( uint8 ), SimpleProfile_SetPara
26、meter( SIMPLEPROFILE_CHAR2, sizeof ( uint8 ), SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR3, sizeof ( uint8 ), SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof ( uint8 ), SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR5, SIMPLEPROFILE_CHAR5_LEN, charValue5 ); #if defined( CC2540_MINIDK ) SK_
27、AddService( GATT_ALL_SERVICES ); / Simple Keys Profile / Register for all key events - This app will handle all key events RegisterForKeys( simpleBLEPeripheral_TasklD );/注册按键,在这里当按键按下时,该任务会收到一个事 件发来的消息 / makes sure LEDs are off HalLedSet( (HAL_LED_1 | HAL_LED_2), HAL_LED_MODE_OFF ); / For keyfob boa
28、rd set GPIO pins into a power-optimized state / Note that there is still some leakage current from the buzzer, / accelerometer, LEDs, and buttons on the PCB. POSEL = 0; / Configure Port 0 as GPIO P1SEL = 0; / Configure Port 1 as GPIO P2SEL = 0; / Configure Port 2 as GPIO P0DIR = 0 xFC; / Port 0 pins
29、 P0.0 and P0.1 as input (buttons), / all others (P0.2-P0.7) as output P1DIR = 0 xFF; / All port 1 pins (P1.0-P1.7) as output P2DIR = 0 x1F; / All port 1 pins (P2.0-P2.4) as output P0 = 0 x03; / All pins on port 0 to low except for P0.0 and P0.1 (buttons) P1 = 0; / All pins on port 1 to low P2 = 0; /
30、 All pins on port 2 to low #endif / #if defined( CC2540_MINIDK ) #if (defined HAL_LCD) #else HalLcdWriteStringValue( BLE Peri-B, OAD_VER_NUM(m gHdr.ver ), 16, HAL_LCD_LINE_1 ); #endif / HAL_IMAGE_A #else HalLcdWriteString( BLE Peripheral, HAL_LCD_LINE_1 ); #endif / FEATURE_OAD #endif / (defined HAL_
31、LCD) /给应用注册回调函数 / Enable clock divide on halt / This reduces active current while radio is active and CC254x MCU / is halted HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT ); #if defined ( DC_DC_P0_7 ) / Enable stack to toggle bypass control on TPS62730 (DC/DC converter) HCI_EXT_MapPmIoP
32、ortCmd( HCI_EXT_PM_IO_PORT_P0, HCI_EXT_PM_IO_PORT_PIN7 ); #endif / defined ( DC_DC_P0_7 ) / Setup a delayed profile startup osal_set_event( simpleBLEPeripheral_TasklD, SBP_START_DEVICE_EVT );/ 标志 SBP_START_DEVICE_EVT 启动该 event 4.GAP部分的初始化和相关 API以及,事件的处理过程。 在上3中的init中可以看到GAP作为Peripheral Role需要设置的核心参数
33、如下 GAPROLE_ADVERT_ENABLED :广播使能。 GAPROLE_ADVERT_DATA :广播时的参数, GAPROLE_SCAN_RSP_DATA :从机扫描响应,返回的数据包 GAPROLE_MIN_CONN_INTERVAL :处于连接状态后的设备,都会有个hop,一段时间内进行数据交互, 以保证两者是连接的。当前后两次交互时,需要等待的最小间隔时间 GAPROLE_MAX_CONN_INTERVAL :.需要等待的最大间隔时间 GAPROLE_SLAVE_LATENCY :处于连接后,从机可以做出不响应连接请求的间隔数目即跳过 n个交互 的连接。 GAPROLE_TI
34、MEOUT_MULTIPLIER :从上次成功连接到这次连接成功的最大允许延时。如果规定时间内 未成功则认为本次连接失败,丢弃。该值必须比有效连接的间隔大。 GAPROLE_PARAM_UPDATE_ENABLE :请求主机更新参数,主机可以接受也可以拒绝。 GAP通过在启动设备事件的任务处理中启动设备,其实主要是向GAP中注册回调函数,让系统在发现自 身运行状态变化时,调用该函数,方便应用层进行相关操作。 VOID GAPRole_StartDevice( / 启动设备,注册回调函数,用于监督设 备的状态变化:广播、连接、配对、绑定等。 static void peripheralState
35、NotificationCB( gaprole_States_t newState )/ 传入参数由 GPA 自己输入,内部调用回 调函数给用户 switch ( newState ) case GAPROLE_STARTED:/ 在 GAPRole_StartDevice 后发生状态变化 uint8 ownAddressB_ADDR_LEN; uint8 systemldDEVINFO_SYSTEM_ID_LEN; GAPRole_GetParameter(GAPROLE_BD_ADDR, ownAddress); / use 6 bytes of device address for 8
36、bytes of system ID value systemldO = ownAddress0; systemld1 = ownAddress1; systemld2 = ownAddress2; / set middle bytes to zero systemld4 = 0 x00; systemld3 = 0 x00; / shift three bytes up systemld7 = ownAddress5; systemld6 = ownAddress4; systemld5 = ownAddress3; Devlnfo_SetParameter(DEVINFO_SYSTEM_I
37、D, DEVINFO_SYSTEM_ID_LEN, systemld); #if (defined HAL_LCD) HalLcdWriteString( Initialized, HAL_LCD_LINE_3 ); #endif / (defined HAL_LCD) case GAPROLE_ADVERTISING: #if (defined HAL_LCD) #endif / (defined HAL_LCD) case GAPROLE_CONNECTED: #if (defined HAL_LCD) #endif / (defined HAL_LCD) case GAPROLE_WAI
38、TING: #if (defined HAL_LCD) #endif / (defined HAL_LCD) case GAPROLE_WAITING_AFTER_TIMEOUT: #if (defined HAL_LCD) #endif / (defined HAL_LCD) case GAPROLE_ERROR: #if (defined HAL_LCD) #endif / (defined HAL_LCD) default: #if (defined HAL_LCD) #endif / (defined HAL_LCD) 可以看到GAP Role作为外设从机时,各种状态的变化,而这些状态
39、 变化都由GAP (不开源部分)调用回 调函数,将当前状态参数传入,以使得不同的APP做出反应。体现了一种回调函数设计的便捷性。 5.GATT Server的相关设置函数。 / Initialize GATT attributes GGS_AddService( GATT_ALL_SERVICES );/ GAP Service GATTServApp_AddService( GATT_ALL_SERVICES );/ GATT attributes DevInfo_AddService();/ Device Information Service SimpleProfile_AddServi
40、ce( GATT_ALL_SERVICES );/ Simple GATT Profile 通常一个 GATT中GAP server和GATT server是必须强制存在的(Mandatory )以及自己设计的 profile server. 作为GATT的server和client,主要通过 Attribute来进行交互,当 client请求server读取数据时,通过如下 注册的回调函数来进行访问。 / Register callback with SimpleGATTprofile VOID SimpleProfile_RegisterAppCBs( /给应用注册回调函数 在回调函数中对
41、时间做岀处理。 蓝牙设计 1. 1 问:什么是蓝牙通信? 答:蓝牙通讯最初设计初衷是方便移动电话(手机)与配件之间进行低成本、低功耗无线通信连接, 现在已经成为IEEE802.15标准,得到全球上万家厂商支持。 2. I 问:如果从事蓝牙开发有没有前途? 答:严格地说,这不是一个技术问题,而是一个世界观问题。什么是前途?如果单纯是金钱,从事技 术是不太可能暴富的(注意比尔.盖茨是个技术商人);如果想用你所能改善世界,这是可能的,毕竟 蓝牙的主要用途是民用。附带说一句,考虑赚钱和改变世界是中国和西方人世界观的主要差别。 3.问:蓝牙有什么优势? 答:首先是低功耗,以 BLE 4.0为例,一节钮扣
42、电池在静态工作状态可以支持一年;其次是低成本, TI公司的CC2540蓝牙SOC方案芯片出售价仅1美元,可以让人们低廉使用蓝牙技术; 再次是开放性, 2.4GHz的频段全球开放,没有政府监管;最后是适合时代潮流,现在是手机的时代,蓝牙技术本来就 为它而生。 4. I 问:蓝牙4.0协议和BLE是什么? 答:蓝牙4.0协议是2010年6月由SIG( Special Interest Group)发布的最新标准, 它有2种模式:BLE (Bluetooth low energy )只能与4.0协议设备通信,适应节能且仅收发少量数据的设备(如家用电子); BR/EDR( Basic Rate / E
43、nhanced Data Rate),向下兼容(能与 3.0/2.1/2.0 通信),适应收发数据较多 的设备(如耳机)。 5. I 问:目前支持蓝牙4.0的移动设备有哪些? 答:苹果公司的iPhone 4S、iPhone 5、miniPad和iPad 3;小米手机 2;三星公司的 Galaxy SIII和Note II ; HTC ONE 系列。 6.问:如何开始蓝牙4.0的开发呢? 答:概括地讲至少以下三方面的准备吧。硬件方面,需要购买TI公司蓝牙迷你套件,包括蓝牙USB 电子狗和KeyFob以及CC Debugger传真器;软件方面,安装IAR for 8051,TI公司BTool软件;
44、技术 知识,CC2540/41 BLE Software Developer s Guide 1和CC2540/41 User s Guide 。 7. I 问:刚开始接触蓝牙如何快速上手? 答:理论联系实践是比较好的学习方法,建议先学习CC2540/41 BLE Software Developer Guide 1.3 然后将SimpleBLEPerepheral工程导入IAR for 8051,结合电子狗和 BTool,调试蓝牙通讯中的广播/连 接/绑定/访问。光看书不动手,空虚;不看书光动手,浅薄。 8. I 问:IAR调试CC2540时程序导入到了芯片的 Flash中了吗? 答:确实。
45、CC2540是SOC(System On Chip)芯片,它的内核就是 8051,它需要从 ROM中取指令, 从RAM中取数据来运行。仿真时,CC Debugger会把程序导入芯片 Flash中,再执行仿真。 9. I 问:当IAR调试中出现警告 缺少断点,无法运行到main() ” 答:出现这个错误的原因是,IAR for 8051最多只能设置3个断点,如果设置过多,当程序下载后,将 岀现些调试警告。解决的方法很简单,去掉一些断点,再重新载入程序。 10.问:为什么IAR调试时有很多变量无法查看它的值? 答:主要的原因是IAR编译器设置了优化功能,函数中的自动变量以及一些静态函数都被优化过了
46、, 所以没有生成对应的调试信息,无法查看和设置断点。解决的方法是关闭编译器的优化功能,右键点 击工程的 Options - C/C+ Compiler - Optimizations 中的 Level 设置为 None。 11.问:蓝牙协议分层很多且比较复杂,该如何掌握呢? 答:蓝牙协议从应用层到物理层一共分了8层,看上去比较复杂且 API函数很多。首先不必要知道每 一层的具体实现,掌握与应用紧密关联GAP/GATT (或者GAP Role和GATT Profiles )层就可以满足 大部分设计需要;每一层的软件都是通过OSAL来调用的,因此需要了解 OSAL的基本原理:任务/ 事件/消息/定
47、时器/动态分配内存;最后把蓝牙通讯过程理解,将有助于开发。 12.问:OSAL是一个操作系统吗? 答:OSAL (Operating System Abstraction Layer )操作系统抽象层,它不是一个真正的操作系统(它没 有Context Switch上下文切换功能),但它巧妙地组织各任务,支持任务优先级,任务之间可以通过 事件和消息来通信,为任务提供软定时器和动态内存分配。要避免的陷阱是,应用任务的单个函数运 行时间不能太长(如操作大批量数据的Flash写),否则它无法及时调度高优先级的LL ( Link Layer ) 任务而导致蓝牙通信中断。 13.问 可:蓝牙节点是如何组成
48、微微网的呢? 答:蓝牙节点组网中,只能存在一个主节点(Central)和多个从节点(Peripheral),从节点是发出信 号者,主节点是扫描且发起连接者。 14.问:主节点和从节点通信的过程是怎样的呢? 答:当从节点发岀广告信号(包括设备地址和设备名称之类的附加信息);主节点收到此广告信号后, 向从节点发出扫描请求;当从节点回应扫描时,就完成了设备发现过程。 接着主节点向从节点发出连接请求(包括连接时隙、从节点待机次数、连接超时值),从节点 回应连接,就完成了建立连接。 为了安全起见,一些数据的访问需要认证,它的完成是这样的:一方(可以是主节点,也可以 是从节点)向另一方索要 6位数字的密码
49、,之后,两个节点彼此交换安全密钥用于加密和认证,此过 程称为配对。 认证的过程比较繁琐,BLE协议支持两节点保存认证的安全密钥(一般是非易失性存储器中), 以便于两节点下次连接后快速认证,这就是绑定技术。 Central Device Peripheral Dev ice advertise*! scan request scan response establish response- 上 -require a passkey exchange security keys device discovery establish connection Pairing 从设备亦然。 17.问:Se
50、rver是如何提供数据呢? 答:Server首先将一个服务按 属性/句柄/数值/描述”这种格式予以组织,然后调用API函数 GATTServApp_RegisterService将服务数据进行注册。举个实例吧,设提供一个电池电量服务字节,它 允许Client读取,数据为一个 8比特无符号数(0100%),它的组织如下:02 25 00 19 2A,这5个数 据(小端格式)分别是:0 x02=只读属性,0 x0025=句柄;0 x2A19=服务UUID。 18.问:不明白Server提供服务中的UUID ? 答:UUID(Universal Unique Identifier)全球惟一标识符,本
51、来是 SIC组织分配给特定蓝牙服务的标识, 如分配0X2A25为设备序列号的 UUID,这样任意蓝牙设备都可以通过它得到另一个设备的序列号。 打个类比,它就像书名,如现代操作系统,所有人一看就知道它是计算机大师Andrew S. Tanenbaum 写的书。 19.问:什么是Server提供服务中的句柄呢? 答:句柄(Handle)就是服务数据在数据中心的地址,当所有的服务数据组织起来后,它总得有个先后顺 序,某个服务的位置就是它的句柄。还是上面的类比,如果想去图书馆借阅现代操作系统,需要 查明该书在哪一层楼,哪个房间,这就是该书的Hanle。 员,请求一旦该书可以借阅了给他一个通知,这个过程
52、相当于配置该书的Descriptor。 21.问:服务的属性与描述有区别吗? 答:有区别,服务的属性是 Server设置访问权限。就像图书馆的工作人员可以设置现代操作系统 仅能在阅览室看不能外借(只读),或者即可以看也可以外借(读 /写) 22.问:Client如何访问Server的服务呢? 答:大致分三类:读取服务的值,需要知道服务的UUID或者Handle;写服务的值,需要知道服务的 Hanle;写服务描述符,需要知道该Descriptor的Hanle。 23 .问:如何知道一个服务的Handle ? 答:根据服务的 UUID 调用API函数GATT_ReadUsingCharUUID 协
53、议栈会返回该服务的Handle。特别注意的是,一个服务的Descriptor的Handle总是该服务的Handle+1 如电池电量服务的 Handle是0 x0025,那么它的 Descriptor的Handle是0 x0026。 24.问:Server可以访问Client吗? 答:蓝牙通信中,Server不能直接访问(读/写)Client,但是可以通知(Notification ) Client,通知的 前提是Client通过写Descriptor使能通知功能。例如,某Server发现电池电量已经低于安全阀值,它 可以调用GATT_Notification通知所有已连接的 Client,但是
54、Client接收后如果处理是它自己的事情。 25.问:如果得知电池容量? 答:任何使用电池供电的设备都必须精确监控电池容量,否则设备可以突然断电而停止工作,它的基 本原理是通过ADC(模数转换器)计算电池电压。以CC2540芯片用一钮扣电池为例,电池电压从2.0v 3.0v,即电量的0%100%; CC2540有一 10比特的ADC,量程范围为 0511,参考电压为1.25v, 最大测量电压为 3.75v,以上信息可以得知: (v/3) / 1.25 * 511 = adc,_则 2.0v=273adc,3.0v=409adc, 根据下图可以很容易得知 ADC转换为电压的公式: Percent
55、age / (X -273) = 100 / 136 = 25 / 34,变换后为: Percentage = (X - 273) * 25 / 34,为四舍五入提高计算精度则有: Percentage = (X - 273) * 25 + 33 / 34。 答:会,以TI公司的CC2540为例,它支持4种发射功率选择:4dBm、OdBm、-6dBm和-23dBm,按 无线电功率定义:LdBm=1Olg(Pwr/1mW),以上4种分贝值换算成瓦特为: 2.51mW、1mW、0.251mW 和0.005mW,有效通信距离分别为: 30米、10米、7米和3米。 27问:如何知道两个蓝牙通信节点之间
56、的距离? 答:要知道蓝牙通信节点(如手机和蓝牙设备)之间的距离,最容易实现的方法是通过读取接收RSS (Received Signal Strength Indication )值来计算。无线通讯中功率与距离的关系如下: (dBm) = A 10 其中A可以看作是信号传输1米远时接收信号的功率, n是传播因子(它受障碍,温度和湿度等影响),r是节点之间的距离。当确定了常数 A与n的值后, 距离r就可以根据PR(dBm)计算出来。 28问:如何获取蓝牙节点的接收 RSSI值? 答:具体的设备接收 RSSI值的方法不一样,以iPhone手机为例,iOS提供API函数获取RSSI值;TI 公司的CC
57、2540芯片的BLE协议栈中,首先将读取RSS 1值回调函数挂载到 gapRolesRssiRead_t类型的 指针下,建立连接后,主设备调用GAPCentralRole_StartRssi (),从设备调用 GAPRole_SetParameter(GAPROLE_RSSI_READ_RATE,)。这样就可以定时读取接收的RSS 1 值了。 29 .问:如何开展读取 RSS 1值的实验? 答:读取RSSI值的实验可以这样搭建,主设备固定位置,向从设备发送信号,从设备LED光和Buzzer 报警为通信成功,逐次移动从设备,而获取RSSI值随物理距离之间的关系。下图是笔者做实验的数据: Dist
58、ance(m) 1 2 3 4 5 6 7 8 9 10 RSSI(dBm) -47 -59 -73 -80 -80 -79 -85 -88 -86 -87 Loss(p) 0 0 9 11 27 2 50 32 22 49 实验器材为2块CC2540芯片,主芯片发射功率为 4dBm(2.51mW) , Loss是通信节点中失败次数。 30. 问:如何将接收RSSI实验数据得到距离计算公式呢? 答:最好的工具是 EXCEL软件,以上表中的实验数据和 EXCEL 2007为例。首先选中Distance和RSSI 两行,点击 插入-散列图”,软件会自动生成如下图: 选取其中任意点,点右键,添加趋势
59、线-对数”将会岀现下图: -100 可见RSSI与距离的关系是比较符合指数函数,再点击显示公式” I e 一 _ -一一 申 T RSSIdBm) 01IIiii IQ 仆亡A6知1Z -100 此时得到指数函数公式为:y = -49.53 -17.7 In (x),再把自然对数换成10常用对数,则有:y = -49.53 - 40.71 lg (x)。通过以上几步就轻松得到RSSI与距离之间的计算公式。 31问:针对RSSI采样值选用什么样的滤波算法? 答:RSSI采样值遵循以下特点:有个别的脉冲干扰引起极大值和极小值的岀现,其他采样数据值沿平均值 分布,比较适合的算法是:滑动防脉冲干扰平均
60、滤波法。它的原理是,设有N个单位的队列,用新的采样 值覆盖旧的采样值,去除队列中最大值和最小值后, 再计算队列中采样数据的平均值。 用C语言描述如下: static INT8S Filter(INT8S chVal) #define FIFO_NUM 10 INT8S chMinVal, chMaxVal, chTemp; INT16S nCnt, nSum; static INT8Ss_chIx = 0, s_chlsFull = FALSE; static INT8Ss_achBufFIFO_NUM; /* Save the NEW value, kick out the OLDest o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高新创业区物业管理协议
- 五年级下册数学教案 -1.4 公因数 ︳西师大版
- 2024-2025学年三年级下册数学 一 除法《练习二》(教案)
- 六年级下册数学教案 图形的认识 北师大版
- 2025年贵阳康养职业大学单招职业技能测试题库带答案
- 化学-四川省金太阳2025届高三2月开学考试试题和答案
- 2025年惠州城市职业学院单招职业技能测试题库审定版
- 2025年广西卫生职业技术学院单招职业倾向性测试题库一套
- 2025年湖北轻工职业技术学院单招职业倾向性测试题库新版
- 2025年湖北科技职业学院单招职业倾向性测试题库完整
- 新《卷烟营销》理论知识考试题库(附答案)
- 三年级下册语文核心素养教案电子版
- 中考英语688高频词大纲词频表
- 知识产权保护与跨境执法合作
- 肉类食品配送服务投标方案(技术方案)
- 含新能源发电接入的电力系统低频振荡阻尼控制研究综述
- 财务管理学(第10版)课件 第3章 财务分析
- NB-T32019-2013太阳能游泳池加热系统技术规范
- 道闸施工方案
- 寺庙佛事活动方案设计
- 湘教版高中地理必修2全册导学案
评论
0/150
提交评论