[经验分享] 【跑步姿势训练鞋】No.006-蓝牙通信程序设计

sipower   2021-6-27 00:18 楼主

上一篇介绍了算法部分,姿态识别和步频计算这一篇介绍蓝牙通讯程序的设计过程。

对于蓝牙通讯部分,原本以为利用现成的例程改一下应该很容易实现,没成想被现实狠狠打脸,结果搞了好几个晚上才弄出来,差点就放弃了。

先说一下最开始的思路:受《Energy HarvestingBluetooth Low EnergySwitch User Guide》这个应用启发,我计划使用广播包把数据发出去。每个广播包可以发31个字节,我实际每包要传输的数据只有20字节,剩余11个字节做头也够用。我先研究这个文件里面提到的例程《BLE-SWITCH001-GEVB EDDYSTONE FIRMWARE》。这个是采用的谷歌的Eddystone协议,因为例程编写的跟协议关联性很大,要想裁剪移植这个例程,需要先搞清楚Eddystone协议,研究了一晚上,感觉我用不到Eddystone协议,在这个基础上裁剪太麻烦了,放弃这个思路。找个简单点的例程移植吧,放过我自己,洗洗睡吧。

下一个晚上在论坛里逛逛放松心情,发现w494143467大神的帖子《【环境专家之智能手表】Part6:BLE广播温度、湿度和气压数据 》讲到用ble广播传输,移植过程写的非常详细,这不是为我准备的吗,仔细研究之!

链接如下:https://bbs.eeworld.com.cn/thread-1168955-1-1.html

这个是选择从心率例程移植广播包代码到自己工程的过程,如下图。我比较习惯用IAR,所以移植的时候也用的IAR例程,一通复制粘贴,一编译出错,一通查找修改,编译不出错了,一运行又出错,然后重复以上过程n+1次,依然莫名其妙的出错,我在浓浓的夜色中凌乱了...嗯,这个也好难,我先睡觉吧。

001-原计划用心率例程广播包.png

1,心率例程

第二天在论坛版主的帮助下,联系上了w494143467大神,请教了移植的问题,并给到了移植好的整个工程让我参考,这里非常感谢。不过大神说这个移植也不完美,建议把外设代码往蓝牙例程上移植更靠谱。

由于例程是ON Semiconductor IDE工程,晚上我不情不愿的装上了ON Semiconductor IDE,然后我发现ON Semiconductor IDE下的例程竟然比IAR例程多好多好多好多好多!见下图对比。

002-例程.png

2,例程数量对比

难道这是亲儿子和干儿子的区别吗!!!没办法了,只能重新学习新的开发环境了。考虑到之前看心率例程里面,广播包的发送代码关联比较多,改起来也挺费事,现在多出来这么多例程,我何不选择最简单的一个修改呢,另外传输也不一定非得用广播包啊,只要能满足传输要求就行啊。

接下来我几乎遍历的所有的带蓝牙传输的例程,最终选定《peripheral_server》这个例程,结构简单,没有使用太多外设,方便往里面移植我之前调试好的代码。

然后又开始了一通复制粘贴,一编译出错,一通查找修改,编译不出错了,一运行又出错,然后重复以上过程n+1次,终于正常运行了。但是,为什么ADC只进一次中断,后面就再也不进中断呢???返回去运行不带蓝牙的就好好的。代码上找不出问题,就从寄存器单步调试找问题。

参考《RSL10_getting_started_guide》里面“3.4.2 Peripheral Registers View with the ON Semiconductor IDE”章节,设置IDE debug参数,一步一步的执行看寄存器变化,然后就发现运行完这个“Sys_RFFE_SetTXPower(OUTPUT_POWER_DBM);”初始化函数后,我之前设置的ADC寄存器就变化了。搞进去,看看这个函数搞什么鬼!

003-搞进去.jpg

3,查看函数定义

我看到,这个函数里面对ADC一顿操作啊,最后还把ADC给我关了....好深的坑!!原来初始化无线的时候,先采样电源电压再根据电压配置无线部分的电源。既然找到原因了,解决起来就简单了。这个地方只是用一下ADC就释放了。我只需把我要的ADC参数在这个函数之后配置就好了。

004-隐藏ADC使用.png

4,深坑之隐藏的ADC配置

改好后,果然运行没问题了,从手机蓝牙调试APP里能够连接上蓝牙设备了。

005-打开notification.jpg

5,连接成功

打开notification,就能看到上报的检测结果了。

006-传输成功.jpg

6,采集到的数据

如上图所示,1-2字节是足部姿态标识,3-4是步频数据,由于测试时传感器悬空,图中出现的数据是随机值。后面的分别是4个传感器的实际数值,每个占4字节,为int32型。

最后就是对可能浪费时间、电能的地方做处理,比如led比较费电,我把整个LED_Timer任务除了关灯的代码都注释掉了;把APP_Timer任务里面每6秒触发一次notification的代码注释掉;如下图。

007.png

7,去掉多余的代码

008-timer trig del.jpg

8,去掉多余的代码

 

综上,蓝牙传输部分终于完成了,虽然遇到各种问题,最终都搞定了,还是很有成就感的。后面介绍自发电功能研究。

回复评论 (3)

能帮上忙还是挺荣幸的哈~

点赞  2021-6-27 08:07
引用: w494143467 发表于 2021-6-27 08:07 能帮上忙还是挺荣幸的哈~

点赞  2021-6-27 21:14

厉害了。经验互相借鉴,步步攻克设计难题,为楼主点赞。

加油!在电子行业默默贡献自己的力量!:)
点赞  2021-6-28 09:36
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复