加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

NRF52832开发日志——ANT与BLE协议的简单测试

(2016-11-05 09:18:46)
分类: NRF52832开发日志
ANT相对简单,先来ANT的。
首先,要想能让ANT+的表头能接收到,先得把这个网络Key给弄过来....ANT官网有的。
http://s6/mw690/002VF2gAzy76a7Vx22Ve5&690

接下来ANT的初始化。
1、设置ANT的事件回调函数,就是on_ant_evt了,ANT的事件几乎就一个RX和TX需要处理,非常简单后面详细说
2、调下ant_stack_static_config()让他自己去配置各种啥buffer size之类的东东
3、调下ant_plus_key_set()把刚刚说的那个key设置好
然后完事了,接下来可以开启通道干活了
下面这个就是通道配置就是功率计传感器的配置:
使用芯片的通道0(最多16个)
通道类型是主机(ANT传感器是主机,和蓝牙相反)
没别的啥需要额外的
频率2457MHz
传输方式5,也就是非共享通道的可收可发
设备类型11,就是功率计
设备编号13,就是传说中的ANT ID,我幸运数字13
传输时间间隔,ANT+标准的8182个tick,大概就是4Hz多一点点
网络key,用0那个(之前那一长串在static_config里面已经注册成0代号了)

调用ant_channel_init()之后,别忘了调用sd_ant_channel_open()开启通道。
http://s11/mw690/002VF2gAzy76a7VBKWeda&690
然后打开你的码表,就能搜索到这个设备了~~~

接下来看下蓝牙的,蓝牙初始化主要这几个流程,基本都用原厂例程代码就可以了,只需简单修改。
http://s9/mw690/002VF2gAzy76a7VFAGkb8&690

我们主要需要配置的参数也都在这里有宏定义:
DEVICE_NAME:搜索时显示的设备名称
MANUFACTURE_NAME:这个是在device information模块里面的厂商名称特性的内容
APP_ADV_INTERVAL:广播周期,这个严重关系到搜索时间和功耗,单位是0.625mS。设置为500mS时候,功耗100uA不到,一般2-3就能搜索到设备
APP_ADV_TIMEOUT_IN_SECONDS:如果广播开启后这么长时间还没连接就超时,一般我还是设为0,无限

MIN_CONN_INTERVAL:连接之后,两次通信最小时间间隔,1.25mS为单位,这样是4Hz的意思
MAX_CONN_INTERVAL:连接之后,两次通信最大时间间隔,1.25mS为单位,这样是1Hz的意思
以上俩,连接时候,主机和从机会negotiation来决定具体连接时间间隔,从机至接收以上范围内的。
SLAVE_LATENCY:从机可以选择跳过一些传输时隙,以降低通信频率节省功耗,一般都没必要...
CONN_SUP_TIMEOUT:超过这个时间如果还没有收到主机信号则认为连接中断,10mS单位,这样是4s意思

接下来简单看看官方初始化代码都在干啥。
ble_stack_init()
这个主要初始化协议栈的内存分配,设定回调函数
关注下CENTRAL_LINK_COUNT和PERIPHERAL_LINK_COUNT
ble_evt_dispatch就是设定用来接收蓝牙事件的回调函数。

gap_params_init()
这个用来设定连接参数咯,包括:
设备名称:DEVICE_NAME
设备类型:BEL_APPREARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT(这里是心率带)
设备通信时隙:CONN_INTERVAL那一堆的
设备的广播初始化,这里至初始化但并不开启广播
此外,还有设备的服务列表,这个一般都打上去,但就算没有也不会影响使用。这里就俩,一个电池服务,一个设备信息服务,也基本是最基础的俩了
调用这个,就能开始广播了
http://s6/mw690/002VF2gAzy76aJUxzcFf5&690

service_init()
这个才是重点,没的话,设备连接之后就是空的。这里先添加了俩官方提供了代码的服务,device_information_service和battery service,一个指示设备基本信息,一个指示电量,就酱
http://s5/mw690/002VF2gAzy76aJURPaA14&690

conn_params_init()
这个函数是初始化连接时候通道参数negotiation的模块用的,另外提供一个事件,谈判失败,那就断开连接咯,也可以直接在里面设置,disconnect_on_fail = true
http://s4/mw690/002VF2gAzy76aJVutr583&690

接下来,这个函数,处理协议栈的事件的。注意这个函数及调用的其它函数都是在中断里面运行的,要非常小心,尤其是在使用操作系统之后。这里面就负责把消息分派给各个模块去处理。我们自己添加的服务的事件处理也添加在这。
http://s6/mw690/002VF2gAzy76aJVwLRP35&690

这个是连接模块处理事件的回调函数,基本上不需要修改,直接用就好。
http://s8/mw690/002VF2gAzy76aJVAAxF07&690

另外还有个函数,最重要的,初始化协议栈最基础的时钟相关资源的:
这里xtal_accuracy会影响每次通信时隙开启的提前量,精度越低提前量越高功耗越大。按照实际来就好,如果设置精度太高晶振跟不上的话会影响通信稳定性。
http://s2/mw690/002VF2gAzy76aLg0xmFa1&690
此外,上面模块是需要用到nrf_libraries里面的软件定时器的,主要用于超时判断这些,比如连接谈判模块。如果未用操作系统则用RTC1来干这个,而用了操作系统之后,RTC1被用于操作系统的定时中断了,不过他们也提供了个基于freertos的定时器模块,直接使用操作系统的软件定时器来模拟,加入时候注意。
http://s6/mw690/002VF2gAzy76aLg2BTf85&690
最后,这个softdevice_init()实测发现不能放在操作系统的线程,会挂。怀疑可能是因为操作系统线程默认配置都是thread态的,这个可能需要privileged态才能运行。也可以在操作系统里面设置,不过略麻烦,反正就这一个,先直接丢在main里面就ok了,后面有空研究。
http://s4/mw690/002VF2gAzy76aJVE9kD53&690

编译,下载,然后就能在手机上面搜索到这个设备啦~

简单对比了下功耗,这个是没开蓝牙的
http://s7/mw690/002VF2gAzy76aJSjBEG16&690
这个是开了蓝牙的,大概多30个uA,还是相当省电的~
http://s11/mw690/002VF2gAzy76aJT6tMS6a&690
蓝牙和ANT就算可以用了,再就是完善编写代码了,不过还是先再折腾其他一些外设的了~

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有