蓝牙主flash芯片型号需要接flash吗

蓝牙开发与应用的困惑?_百度知道后使用快捷导航没有帐号?
查看: 25935|回复: 14
注册时间最后登录阅读权限20积分104精华0帖子
童生, 积分 104, 距离下一级还需 96 积分
该用户从未签到
本帖最后由 wkong501 于
17:21 编辑
开始在我的博客更新nRF51822的学习笔记了,玩51822这么久一直都在蓝牙软件层玩,硬件这块特别陌生所以这次准备先把硬件过一遍。然后再更新软件篇的教程。很多笔记都存在为知笔记里,只先整理了一篇发出来后续有空会继续发。有错的地方大家请指出,欢迎讨论交流。
Created: 14-03-20&&Updated: 14-03-20一、介绍一下nRF51822片上资源
CPU:& &32-bit ARM(R) Cortex(TM) M0 32-bit CPU
Memery:256/128 KB embedded flash、 16 KB RAM
System Peripherals:
一个32位定时器,两个16位定时器。(注:nRF51定时器的位数可以通过寄存器设置的,可变的)
16通道的CPU独立编程外设互联(PPI)
(翻译太渣,献原句:16 channel CPU independent Programmable Peripheral Interconnect (PPI))
128位AES ECB/CCM/AAR加密协处理器
RNG:随机数发生器
两个RTC时钟,RTC0,RTC1
温度传感器
31个GPIO引脚
支持多达4路PWM输出
Digital I/O:
SPI Master/Slave, 2-wire Master (I2C compatible), UART (CTS/RTS)
正交解码器(Quadrature decoder)
Analog I/O:
8/9/10 bit ADC - 8 configurable channels
Low power comparator
Power Management:
支持1.8V到3.6V宽电压
在芯片DC/DC转换
0.6 uA @ 3V OFF mode
1.2 uA @ 3V OFF mode + 1 region RAM retention
2.6 uA @ 3V ON mode, all blocks in idle mode
二、寄存器介绍
&&nRF51822的寄存器分为三类
&&* Task寄存器 :即该外设可以执行的task
&&* Event寄存器:即该外设带有的event
&&* 普通寄存器
&&Task寄存器和event寄存器在PPI的使用中是非常重要的,举个例子,在PPI中,设置EEP寄存器地址为某个外设A的Event寄存器地址,TEP寄存器设为另一个外设B的Task寄存器地址,那么当那个外设A的event发生时,可以直接触发执行外设B的task,而不经过CPU,这点在后面的PPI介绍中会有说明。
三、nRF51822的中断
&&1.nRF51822的中断源分别对应外设相应的event寄存器。
&&2.Nordic为了节省功耗把systick给去掉了,所以SysTick_Handler可以无视。& && &
DCD& &&&Reset_Handler& && && && & ; Reset Handler
DCD& &&&NMI_Handler& && && && && &; NMI Handler
DCD& &&&HardFault_Handler& && && &; Hard Fault Handler
DCD& &&&0& && && && && && && && & ; Reserved
DCD& &&&0& && && && && && && && & ; Reserved
DCD& &&&0& && && && && && && && & ; Reserved
DCD& &&&0& && && && && && && && & ; Reserved
DCD& &&&0& && && && && && && && & ; Reserved
DCD& &&&0& && && && && && && && & ; Reserved
DCD& &&&0& && && && && && && && & ; Reserved
DCD& &&&SVC_Handler& && && && && &; SVCall Handler
DCD& &&&0& && && && && && && && & ; Reserved
DCD& &&&0& && && && && && && && & ; Reserved
DCD& &&&PendSV_Handler& && && && &; PendSV Handler
DCD& &&&SysTick_Handler& && && &&&; SysTick Handler
外部中断源也比常规的ARM芯片要少很多,SWI中断大多用在蓝牙协议栈中。
; External Interrupts
DCD& && &POWER_CLOCK_IRQHandler OWER_CLOCK
DCD& && &RADIO_IRQHRADIO
DCD& && &UART0_IRQHUART0
DCD& && &SPI0_TWI0_IRQHSPI0_TWI0
DCD& && &SPI1_TWI1_IRQHSPI1_TWI1
DCD& && &0 ;Reserved
DCD& && &GPIOTE_IRQHGPIOTE
DCD& && &ADC_IRQHADC
DCD& && &TIMER0_IRQHTIMER0
DCD& && &TIMER1_IRQHTIMER1
DCD& && &TIMER2_IRQHTIMER2
DCD& && &RTC0_IRQHRTC0
DCD& && &TEMP_IRQHTEMP
DCD& && &RNG_IRQHRNG
DCD& && &ECB_IRQHECB
DCD& && &CCM_AAR_IRQHCCM_AAR
DCD& && &WDT_IRQHWDT
DCD& && &RTC1_IRQHRTC1
DCD& && &QDEC_IRQHQDEC
DCD& && &LPCOMP_IRQHLPCOMP
DCD& && &SWI0_IRQHSWI0
DCD& && &SWI1_IRQHSWI1
DCD& && &SWI2_IRQHSWI2
DCD& && &SWI3_IRQHSWI3
DCD& && &SWI4_IRQHSWI4
DCD& && &SWI5_IRQHSWI5
下面简单介绍一些外设,像定时器、GPIOTE、PPI等后面介绍。
&&NVMC和其他ARM芯片一样,负责芯片Flash的擦写烧录,这里要说一下Nordic nRF51822 Flash结构。截图选自最新的softdevice 7.0.0.3alpha。新版的s110 softdevice将最底部的0×0~0×1000区域用作MBR,关于MBR和softdevice以及用户app之间的跳转过程,看我另一篇笔记 nRF51822-问答笔记【1】。也就是说Region0包含了Softdvice以及MBR,Region1包含了用户app和bootloader。
&&nRF51822芯片在flash操作上有个限制,为了保护R0区的softdevice不被破坏,它禁止了R1区的程序调用flash操作函数去读写R0区。也就是说,在softdevice6.0以及更早版本,我们是无法更新softdevice的,因为bootloader位于R1区。
&&当然你可以有个极端的办法,虽然我们无法单独擦除R0区代码,但nRF51822允许我们整个芯片擦除。所以,我们可以把程序拷贝到RAM中,在RAM中跑bootloader,对整个芯片的擦写,实现bootloader的升级。这样做的缺点很显示,一旦中途断电,整个芯片就瘫痪了。
&&为了实现softdevice的升级Nordic官方推出了新的softdevice 7.0,加入MBR使得bootloader可以调用MBR中的Flash操作函数实现softdevice升级。下面简单地介绍一下原理:
&&首先,上电后程序跳转到MBR中断向量入口,检测是否存在bootloader,存在则接着跳转到Bootload,在bootloader中,通过BLE方式或者串口方式收到新的softdevice firmware放在用户的app区,校验完毕,开始调用MBR中的flash擦写函数,覆盖旧版本的softdevice。
四、UICR寄存器的说明
&&UICR: 用户信息配置寄存器(User Information Configuration Registers)
&&UICR-&CLENR0寄存器:很重要 CLENR0存放了Region0的大小,对于softdevice6.0需要设置为0×14000,对于softdevice 7.0要设置为0×15000。换句话说这个寄存器存放了用户APP的起始地址。(Region0存放softdevice,Region1存放APP、Bootloader)
&&UICR-&RBCONF: read back protection,回读保护。保护的是region0的。
&&还有两个XTALFREQ寄存器和FWID寄存器不常用,见手册。
五、FICR寄存器
&&手册里面写的很详细,常用的寄存器有:
&&CODEPAGESIZE:softdevice将Region1的Flash分成一个个page,每个page的字节数存放在此。
&&CODESIZE:Flash被分成的总的page数
&&FICR寄存器组的东西很丰富,建议去看看手册,我用到的不多,其他的以后用到了再更新。
六、GPIO tasks and events (GPIOTE)
&&1.GPIOTE模块也是设计成减少了CPU占用的Task Event模式,使得事件可以不经过CPU就能得到响应。
& & Event引脚的触发源有:上升沿,下降沿等任何改变
& & Task引脚的操作方式有:置位,清0,反转
& & Event和task之间可以靠PPI连接在一起(见nRF51822学习笔记–硬件外设篇【3】PPI的描述)
&&2.一旦把某个引脚分配给Task(OUT[n])或Event(IN[n]),那么该引脚就只能被GPIOTE模块写操作,正常的GPIO写入时无效的。
&&3.当GPIOTE通道被配置用于操作一个任务引脚n,那么该引脚n的初值需要在CONFIG[n]寄存器的OUTINIT区域中设定。
&&4.GPIOE的事件触发源可以不仅仅只是某个引脚,还可以是某个port(nRF51把32个引脚分为4个port),同属一个port的任意一个引脚只要被检测到上升沿发生都会触发Port Event。
&&5.GPIOTE中断的使用。
* @brief Function for configuring: pin 0 for input, pin 8 for output,
* and configures GPIOTE to give an interrupt on pin change.
static void gpio_init(void)
nrf_gpio_cfg_input(BUTTON_0, BUTTON_PULL);
nrf_gpio_cfg_output(LED_0);nrf_gpio_pin_write(LED_0, BUTTON_0);// Enable interrupt:
NVIC_EnableIRQ(GPIOTE_IRQn);
& & //配置工作模式为event
& & //选择一个引脚作为event来源
& & //配置该event的触发源为翻转
& & NRF_GPIOTE-&CONFIG[0] =&&(GPIOTE_CONFIG_MODE_Event && GPIOTE_CONFIG_MODE_Pos)
| (0 && GPIOTE_CONFIG_PSEL_Pos)
| (GPIOTE_CONFIG_POLARITY_Toggle && GPIOTE_CONFIG_POLARITY_Pos);
& & //开启4路GPIOTE通道中的IN0通道的中断
NRF_GPIOTE-&INTENSET&&= GPIOTE_INTENSET_IN0_Set && GPIOTE_INTENSET_IN0_P
}/** @brief Function for handling the GPIOTE interrupt which is triggered on pin 0 change.
void GPIOTE_IRQHandler(void)
// Event causing the interrupt must be cleared.
if ((NRF_GPIOTE-&EVENTS_IN[0] == 1) && //判断中断是否来自GPIOTE通道0
(NRF_GPIOTE-&INTENSET & GPIOTE_INTENSET_IN0_Msk))
NRF_GPIOTE-&EVENTS_IN[0] = 0;
nrf_gpio_pin_toggle(LED_0);
* @brief Function for application main entry.
int main(void)
gpio_init();
while (true)
// Do nothing.
&&6.GPIOTE配合PPI的使用,见PPI部分
注册时间最后登录阅读权限40积分762精华0帖子
举人, 积分 762, 距离下一级还需 238 积分
TA的每日心情开心 15:47签到天数: 6 天[LV.2]偶尔看看I
赞一个!喜欢原创的笔记!
注册时间最后登录阅读权限40积分762精华0帖子
举人, 积分 762, 距离下一级还需 238 积分
TA的每日心情开心 15:47签到天数: 6 天[LV.2]偶尔看看I
另外有两个问题
1. 教育网看不了你的图片,我没法加载出来
2. 题目中的GY是啥意思?
注册时间最后登录阅读权限20积分104精华0帖子
童生, 积分 104, 距离下一级还需 96 积分
该用户从未签到
liubenyuan 发表于
另外有两个问题
1. 教育网看不了你的图片,我没法加载出来
2. 题目中的GY是啥意思? ...
图片我这边可以显示,不过代码部分论坛里面先显示的偏杂乱了,我博客里面的显示很好看,等我多上传几篇笔记到博客后再把博客链接发出来。
GY是我英文名缩写哈
注册时间最后登录阅读权限20积分91精华0帖子
童生, 积分 91, 距离下一级还需 109 积分
TA的每日心情慵懒 10:39签到天数: 1 天[LV.1]初来乍到
赞一个先....
注册时间最后登录阅读权限20积分91精华0帖子
童生, 积分 91, 距离下一级还需 109 积分
TA的每日心情慵懒 10:39签到天数: 1 天[LV.1]初来乍到
然后默默的问下楼主SPI Slave发送数据的资料可否借鉴一下
注册时间最后登录阅读权限50积分1139精华0帖子
进士, 积分 1139, 距离下一级还需 1861 积分
TA的每日心情奋斗 10:02签到天数: 298 天[LV.8]以坛为家I
楼主写得很棒!啥时候有续集呢?
注册时间最后登录阅读权限10积分11精华0帖子
白丁, 积分 11, 距离下一级还需 39 积分
该用户从未签到
好,我正在开发手环
注册时间最后登录阅读权限10积分43精华0帖子
白丁, 积分 43, 距离下一级还需 7 积分
TA的每日心情开心 19:08签到天数: 6 天[LV.2]偶尔看看I
学习了,求博客地址
注册时间最后登录阅读权限10积分3精华0帖子
白丁, 积分 3, 距离下一级还需 47 积分
该用户从未签到
MARK,最近刚上手这个,楼主很NB
站长推荐 /5
我们从众多的智能硬件中选择 “智能插座”来作为话题的切入点。不管你有没有使用过,但站在用户的角度,你一定有你的想法和发言权。针对智能插座,说出你的想法和观点,你觉得怎样才能算的上一个好的智能插座?查看详情
LinkNode D1是LinkSprite推出的一款物联网开发评估板,开源了硬件、软件,使用的是WIFI技术,板载ESP8266EX模块,提供Arduino兼容接口,使用开源社区提供的源代码,可以在Arduino IDE中轻松访问ESP8266EX。立即申请!
查看泰克示波器相关视频和技术文档,回答问题,就有机会抽奖赢好礼啦!邀请好友更可额外获得奖励哦!
即日起至9月8日,参加活动——Keysight示波器,汽车串行总线测试,回答问题就有机会获得动感单车/显示器、VR眼镜3D头盔等豪礼!立即参加
英飞凌半导体推出了一整套基于自家产品的四轴飞行器解决方案,包括高性能、多功能的飞控主板以及高效率的电调,在保证续航、系统可靠稳定的同时大大节省了四轴飞行器方案的项目开发周期。查看详情
Powered by Discuz!后使用快捷导航没有帐号?
查看: 6908|回复: 7
注册时间最后登录阅读权限20积分68精华0帖子
童生, 积分 68, 距离下一级还需 132 积分
TA的每日心情奋斗 07:48签到天数: 4 天[LV.2]偶尔看看I
目前为了提高集成度,我采用了使用自带的Flash来配置为可实时擦写的数据区,使用不带协议栈,既裸跑方式实现没问题,但是带协议栈就无法实现,请问谁可以提供一个带协议栈并有擦写Flash作为数据存储的例子?或者操作方式也可以。
注册时间最后登录阅读权限20积分68精华0帖子
童生, 积分 68, 距离下一级还需 132 积分
TA的每日心情奋斗 07:48签到天数: 4 天[LV.2]偶尔看看I
目前我的操作方式如下:
#define CAL_DATA_START_ADDR& && && && && && &(0x27000)& && && && && && && && && && && & /**& cal_store */
#define CAL_DATA_END_ADDR& && && && && && &&&(0x27800)& && && && && && && && && && && & /**& cal_store */
uint8_t data_array[40]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,
& && && && && && && && && &&&0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
& && && && && && && && && &&&0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
& && && && && && && && && &&&0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49};
static void storage_init(void)
{//作为初始化工具
& & uint32_t err_
& & pstorage_module_param_t&&& & & &
& & param.block_size&&= 32;
& & param.block_count = 64;
& & param.cb = storage_
& & err_code = pstorage_raw_register(&param, &m_storage_handle);
& & APP_ERROR_CHECK(err_code);
& & //data start address& &
& & m_storage_handle.block_id = CAL_DATA_START_ADDR;
& & //before using, clear the region
& & err_code = pstorage_raw_clear(&m_storage_handle, 64*32);
& & APP_ERROR_CHECK(err_code);
while(kk--)
& && &&&err_code = pstorage_raw_store(&m_storage_handle,data_array,32,m_app_data_received);
& & & && && &APP_ERROR_CHECK(err_code);
& && &&&m_app_data_received += 32;& && && &
& &&&}& & & && &
调试显示,并没有将数据存到Flash中
注册时间最后登录阅读权限20积分68精华0帖子
童生, 积分 68, 距离下一级还需 132 积分
TA的每日心情奋斗 07:48签到天数: 4 天[LV.2]偶尔看看I
Boin 发表于
目前我的操作方式如下:
#define CAL_DATA_START_ADDR& && && && && && &(0x27000)& && && && && && && && &...
附上我所用的工程
15:41 上传
点击文件名下载附件
1.72 MB, 下载次数: 200
注册时间最后登录阅读权限10积分27精华0帖子
白丁, 积分 27, 距离下一级还需 23 积分
TA的每日心情开心 15:15签到天数: 1 天[LV.1]初来乍到
我也碰到了这个问题BLE_STACK_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, BLE_L2CAP_MTU_DEF, ble_evt_dispatch, true);
NRF_NVMC-&CONFIG = (NVMC_CONFIG_WEN_Wen && NVMC_CONFIG_WEN_Pos);复制代码只要初始化了Softdevice, 就不能写Flash了;
还有个现象: 单步调试可以写F
注册时间最后登录阅读权限10积分27精华0帖子
白丁, 积分 27, 距离下一级还需 23 积分
TA的每日心情开心 15:15签到天数: 1 天[LV.1]初来乍到
问题解决了
用Softdevice6.0中新增加的函数 sd_flash_write 可以正常写入;
注册时间最后登录阅读权限10积分3精华0帖子
白丁, 积分 3, 距离下一级还需 47 积分
该用户从未签到
感谢分享,
用Softdevice6.0中新增加的函数 sd_flash_write 可以正常写入
注册时间最后登录阅读权限10积分43精华0帖子
白丁, 积分 43, 距离下一级还需 7 积分
该用户从未签到
楼上的同学,能不能把Softdevice6.0中新增加的函数 sd_flash_write 上传一下
注册时间最后登录阅读权限10积分10精华0帖子
白丁, 积分 10, 距离下一级还需 40 积分
该用户从未签到
jnzgoto 发表于
感谢分享,
用Softdevice6.0中新增加的函数 sd_flash_write 可以正常写入
为何SD6.0只有 sd_flash_write,没有sd_flash_read,,有什么方法读出来,,
站长推荐 /5
我们从众多的智能硬件中选择 “智能插座”来作为话题的切入点。不管你有没有使用过,但站在用户的角度,你一定有你的想法和发言权。针对智能插座,说出你的想法和观点,你觉得怎样才能算的上一个好的智能插座?查看详情
LinkNode D1是LinkSprite推出的一款物联网开发评估板,开源了硬件、软件,使用的是WIFI技术,板载ESP8266EX模块,提供Arduino兼容接口,使用开源社区提供的源代码,可以在Arduino IDE中轻松访问ESP8266EX。立即申请!
查看泰克示波器相关视频和技术文档,回答问题,就有机会抽奖赢好礼啦!邀请好友更可额外获得奖励哦!
即日起至9月8日,参加活动——Keysight示波器,汽车串行总线测试,回答问题就有机会获得动感单车/显示器、VR眼镜3D头盔等豪礼!立即参加
英飞凌半导体推出了一整套基于自家产品的四轴飞行器解决方案,包括高性能、多功能的飞控主板以及高效率的电调,在保证续航、系统可靠稳定的同时大大节省了四轴飞行器方案的项目开发周期。查看详情
Powered by Discuz!1.&&&&问:什么是蓝牙通信?
答:蓝牙通讯最初设计初衷是方便移动电话(手机)与配件之间进行低成本、低功耗无线通信连接,现在已经成为IEEE802.15标准,得到全球上万家厂商支持。
2.&&&&问:如果从事蓝牙开发有没有前途?
答:严格地说,这不是一个技术问题,而是一个世界观问题。什么是前途?如果单纯是金钱,从事技术是不太可能暴富的(注意比尔.盖茨是个技术商人);如果想用你所能改善世界,这是可能的,毕竟蓝牙的主要用途是民用。附带说一句,考虑赚钱和改变世界是中国和西方人世界观的主要差别。
3.&&&&问:蓝牙有什么优势?
答:首先是低功耗,以BLE 4.0为例,一节钮扣电池在静态工作状态可以支持一年;其次是低成本,TI公司的CC2540蓝牙SOC方案芯片出售价仅1美元,可以让人们低廉使用蓝牙技术;再次是开放性,2.4GHz的频段全球开放,没有政府监管;最后是适合时代潮流,现在是手机的时代,蓝牙技术本来就为它而生。
4.&&&&问:蓝牙4.0协议和BLE是什么?
答:蓝牙4.0协议是2010年6月由SIG(Special Interest Group)发布的最新标准,它有2种模式:BLE(Bluetooth low energy)只能与4.0协议设备通信,适应节能且仅收发少量数据的设备(如家用电子);BR/EDR(Basic Rate / Enhanced Data Rate),向下兼容(能与3.0/2.1/2.0通信),适应收发数据较多的设备(如耳机)。
5.&&&&问:目前支持蓝牙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软件;技术知识,《CC2540/41 BLE Software Developer’s Guide 1.3》和《CC2540/41 User’s Guide》。
7.&&&&问:刚开始接触蓝牙如何快速上手?
答:理论联系实践是比较好的学习方法,建议先学习《CC2540/41 BLE Software Developer’s Guide 1.3》,然后将SimpleBLEPerepheral工程导入IAR for 8051,结合电子狗和BTool,调试蓝牙通讯中的广播/连接/绑定/访问。光看书不动手,空虚;不看书光动手,浅薄。
8.&&&&问:IAR调试CC2540时程序导入到了芯片的Flash中了吗?
答:确实。CC2540是SOC(System On Chip)芯片,它的内核就是8051,它需要从ROM中取指令,从RAM中取数据来运行。仿真时,CC Debugger会把程序导入芯片Flash中,再执行仿真。
9.&&&&问:当IAR调试中出现警告“缺少断点,无法运行到main()”?
答:出现这个错误的原因是,IAR for 8051最多只能设置3个断点,如果设置过多,当程序下载后,将出现些调试警告。解决的方法很简单,去掉一些断点,再重新载入程序。
10.&问:为什么IAR调试时有很多变量无法查看它的值?
答:主要的原因是IAR编译器设置了优化功能,函数中的自动变量以及一些静态函数都被优化过了,所以没有生成对应的调试信息,无法查看和设置断点。解决的方法是关闭编译器的优化功能,右键点击工程的Options -& C/C++ Compiler -& Optimizations中的Level设置为None。
11.&问:蓝牙协议分层很多且比较复杂,该如何掌握呢?
答:蓝牙协议从应用层到物理层一共分了8层,看上去比较复杂且API函数很多。首先不必要知道每一层的具体实现,掌握与应用紧密关联GAP/GATT(或者GAP Role和GATT Profiles)层就可以满足大部分设计需要;每一层的软件都是通过OSAL来调用的,因此需要了解OSAL的基本原理:任务/事件/消息/定时器/动态分配内存;最后把蓝牙通讯过程理解,将有助于开发。
12.&问:OSAL是一个操作系统吗?
答:OSAL(Operating System Abstraction Layer)操作系统抽象层,它不是一个真正的操作系统(它没有Context Switch上下文切换功能),但它巧妙地组织各任务,支持任务优先级,任务之间可以通过事件和消息来通信,为任务提供软定时器和动态内存分配。要避免的陷阱是,应用任务的单个函数运行时间不能太长(如操作大批量数据的Flash写),否则它无法及时调度高优先级的LL(Link Layer)任务而导致蓝牙通信中断。
13.&问:蓝牙节点是如何组成微微网的呢?
答:蓝牙节点组网中,只能存在一个主节点(Central)和多个从节点(Peripheral),从节点是发出信号者,主节点是扫描且发起连接者。
14.&问:主节点和从节点通信的过程是怎样的呢?
答:当从节点发出广告信号(包括设备地址和设备名称之类的附加信息);主节点收到此广告信号后,向从节点发出扫描请求;当从节点回应扫描时,就完成了设备发现过程。
接着主节点向从节点发出连接请求(包括连接时隙、从节点待机次数、连接超时值),从节点回应连接,就完成了建立连接。
为了安全起见,一些数据的访问需要认证,它的完成是这样的:一方(可以是主节点,也可以是从节点)向另一方索要6位数字的密码,之后,两个节点彼此交换安全密钥用于加密和认证,此过程称为配对。
认证的过程比较繁琐,BLE协议支持两节点保存认证的安全密钥(一般是非易失性存储器中),以便于两节点下次连接后快速认证,这就是绑定技术。
15.&问:蓝牙通信中两个节点如何交换数据?
答:这是蓝牙通信中最让初学者迷惑的地方。大部分通信,尤其是TCP/IP,交换数据的婚介是数据包,但蓝牙通信中,工程师找不到数据包访问方式,于是就产生疑问。其实蓝牙最底层也是基于无线数据包交换,只是通过层层封装,交付给工程师的API接口就变成了Client访问Server的方式。
16.&问:Client和Server节点是如何定义呢?
答:通俗地说吧,Server(服务器)就是数据中心,Client(客户端)就是访问数据者。特别说明,它与主/从设备是独立的概念:一个主设备既可以充当Server,又可以充当Client;从设备亦然。
17.&问:Server是如何提供数据呢?
答:Server首先将一个服务按“属性/句柄/数值/描述”这种格式予以组织,然后调用API函数GATTServApp_RegisterService将服务数据进行注册。举个实例吧,设提供一个电池电量服务字节,它允许Client读取,数据为一个8比特无符号数(0~100%),它的组织如下:02 25 00 19 2A, 这5个数据(小端格式)分别是:0x02=只读属性,0x0025=句柄;0x2A19=服务UUID。
18.&问:不明白Server提供服务中的UUID?
答:UUID(Universal Unique Identifier)全球惟一标识符,本来是SIC组织分配给特定蓝牙服务的标识,如分配0x2A25为设备序列号的UUID,这样任意蓝牙设备都可以通过它得到另一个设备的序列号。
打个类比,它就像书名,如《现代操作系统》,所有人一看就知道它是计算机大师Andrew S. Tanenbaum写的书。
19.&问:什么是Server提供服务中的句柄呢?
答:句柄(Handle)就是服务数据在数据中心的地址,当所有的服务数据组织起来后,它总得有个先后顺序,某个服务的位置就是它的句柄。还是上面的类比,如果想去图书馆借阅《现代操作系统》,需要查明该书在哪一层楼,哪个房间,这就是该书的Hanle。
20.&问:为什么Server提供的服务中有描述?
答:有些服务是有描述(Descriptor)的,它是用于Client配置该服务的功能(通知或者显示)。像某人没有借到《现代操作系统》该书(可能是被别人借光了),他(她)可以打个电话给图书馆工作人员,请求一旦该书可以借阅了给他一个通知,这个过程相当于配置该书的Descriptor。
21.&问:服务的属性与描述有区别吗?
答:有区别,服务的属性是Server设置访问权限。就像图书馆的工作人员可以设置《现代操作系统》仅能在阅览室看不能外借(只读),或者即可以看也可以外借(读/写)。
22.&问:Client如何访问Server的服务呢?
答:大致分三类:读取服务的值,需要知道服务的UUID或者Handle;写服务的值,需要知道服务的Hanle;写服务描述符,需要知道该Descriptor的Hanle。
23.&问:如何知道一个服务的Handle?
答:根据服务的UUID调用API函数GATT_ReadUsingCharUUID
协议栈会返回该服务的Handle。特别注意的是,一个服务的Descriptor的Handle总是该服务的Handle+1,如电池电量服务的Handle是0x0025,那么它的Descriptor的Handle是0x0026。
24.&问:Server可以访问Client吗?
答:蓝牙通信中,Server不能直接访问(读/写)Client,但是可以通知(Notification)Client,通知的前提是Client通过写Descriptor使能通知功能。例如,某Server发现电池电量已经低于安全阀值,它可以调用GATT_Notification通知所有已连接的Client,但是Client接收后如果处理是它自己的事情。
25.&问:如果得知电池容量?
答:任何使用电池供电的设备都必须精确监控电池容量,否则设备可以突然断电而停止工作,它的基本原理是通过ADC(模数转换器)计算电池电压。以CC2540芯片用一钮扣电池为例,电池电压从2.0v~3.0v,即电量的0%~100%;CC2540有一10比特的ADC,量程范围为0~511,参考电压为1.25v,最大测量电压为3.75v,以上信息可以得知:(v/3)/ 1.25 * 511 = adc,则2.0v=273adc,3.0v=409adc,根据下图可以很容易得知ADC转换为电压的公式:
Percentage / (X – 273) = 100 / 136 = 25 / 34,变换后为:
Percentage = (X - 273) * 25 / 34,为四舍五入提高计算精度则有:
Percentage = [(X - 273) * 25 + 33] / 34。
26.&问:蓝牙发射信号功率调整会影响通信距离吗?
答:会,以TI公司的CC2540为例,它支持4种发射功率选择:4dBm、0dBm、-6dBm和-23dBm,按无线电功率定义:LdBm=10lg(Pwr/1mW),以上4种分贝值换算成瓦特为:2.51mW、1mW、0.251mW和0.005mW,有效通信距离分别为:30米、10米、7米和3米。
27.&问:如何知道两个蓝牙通信节点之间的距离?
答:要知道蓝牙通信节点(如手机和蓝牙设备)之间的距离,最容易实现的方法是通过读取接收RSSI(Received Signal Strength
Indication)值来计算。无线通讯中功率与距离的关系如下:
&其中A可以看作是信号传输1米远时接收信号的功率,n是传播因子(它受障碍,温度和湿度等影响),r是节点之间的距离。当确定了常数A与n的值后,距离r就可以根据PR(dBm)计算出来。
28.&问:如何获取蓝牙节点的接收RSSI值?
答:具体的设备接收RSSI值的方法不一样,以iPhone手机为例,iOS提供API函数获取RSSI值;TI公司的CC2540芯片的BLE协议栈中,首先将读取RSSI值回调函数挂载到gapRolesRssiRead_t类型的指针下,建立连接后,主设备调用GAPCentralRole_StartRssi(),从设备调用
GAPRole_SetParameter(GAPROLE_RSSI_READ_RATE, ……)。这样就可以定时读取接收的RSSI值了。
29.&问:如何开展读取RSSI值的实验?
答:读取RSSI值的实验可以这样搭建,主设备固定位置,向从设备发送信号,从设备LED光和Buzzer报警为通信成功,逐次移动从设备,而获取RSSI值随物理距离之间的关系。下图是笔者做实验的数据:
Distance(m)
实验器材为2块CC2540芯片,主芯片发射功率为4dBm(2.51mW),Loss是通信节点中失败次数。
30.&问:如何将接收RSSI实验数据得到距离计算公式呢?
答:最好的工具是EXCEL软件,以上表中的实验数据和EXCEL 2007为例。首先选中Distance和RSSI两行,点击“插入-&散列图”,软件会自动生成如下图:
选取其中任意点,点右键,“添加趋势线-&对数”,将会出现下图:
可见RSSI与距离的关系是比较符合指数函数,再点击“显示公式”
此时得到指数函数公式为:y = -49.53 – 17.7 ln (x),再把自然对数换成10常用对数,则有:y = -49.53 – 40.71 lg (x)。通过以上几步就轻松得到RSSI与距离之间的计算公式。
31问:针对RSSI采样值选用什么样的滤波算法?
答:RSSI采样值遵循以下特点:有个别的脉冲干扰引起极大值和极小值的出现,其他采样数据值沿平均值分布,比较适合的算法是:滑动防脉冲干扰平均滤波法。它的原理是,设有N个单位的队列,用新的采样值覆盖旧的采样值,去除队列中最大值和最小值后,再计算队列中采样数据的平均值。用C语言描述如下:
static INT8S Filter(INT8S chVal)
&&& #define FIFO_NUM&&& 10
&&& INT8S&&& chMinVal, chMaxVal, chT
&&& INT16S&&& nCnt, nS&&
&&& static INT8S&&& s_chIx = 0, s_chIsFull = FALSE;
&&& static INT8S&&& s_achBuf[FIFO_NUM];
&&& /* Save the NEW value, kick out the OLDest one */
&&& s_achBuf[s_chIx] = chV
&&& if (++s_chIx &= FIFO_NUM)
&&&&&&& s_chIx = 0;&&& /* Wrap to 1th unit */
&&&&&&& s_chIsFull = TRUE;&&&&&&&&&
&&& /* Number of sampled data less than N */
&&& if (!s_chIsFull)
&&&&&&& nSum = 0;
&&&&&&& for (nCnt = 0; nCnt & s_chIx; ++nCnt)
& &&&&&&&&&&nSum += s_achBuf[nCnt];
&&&&&&& return (INT8S)(nSum / s_chIx);&&&&&&&&
&&& /* Get the SUM and Max. and Min. */
&&& chMaxVal = chMinVal = nSum = 0;&&&
&&& for (nCnt = 0; nCnt & FIFO_NUM; ++nCnt)
&&&&&&& chTemp = s_achBuf[nCnt];
&&&&&&& nSum += chT
&&&&&&& if (chTemp & chMaxVal)&&&
&&&&&&&&&&& chMaxVal = chT
&&&&&&& else if (chTemp & chMinVal)
&&&&&&&&&&& chMinVal = chT
&&& /* Calculate the average */
&&& nSum -= (chMaxVal + chMinVal);&& /* SUB Max. and Min. */
&&& nSum /= (FIFO_NUM - 2);&&& /* Get average */
&&& return (INT8S)nS
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9017次
排名:千里之外
原创:13篇
(2)(1)(2)(2)(1)(3)(3)(5)

我要回帖

更多关于 flash芯片16脚8脚转接 的文章

 

随机推荐