加载中…
正文 字体大小:

基于玩咖K1智能手环再编程入门指引

(2016-05-12 09:20:41)
标签:

玩咖

k1

智能手环

编程

计步

玩咖K1智能手环再编程入门指引

Re-Program base on Wanka K1 smartband’s hardward

 

版本

时间

作者

描述

V0.1

2016-04-11

launcher

首次发布

V0.2

2016-04-16

launcher

新增MOTOR、KEY的管脚及使用方法

V0.3

2016-04-20

Launcher

新增三轴加速度Sensor的管脚及驱动方法

        对于玩咖K1的再次开发,是必然性与偶然性的统一,必然是我本身学习的专业是电子科学与技术,有一定的技术储备和Cortex-M芯片的使用经验,偶然是通过朋友那里看到一篇玩咖K1的拆解贴,获知了玩咖K1使用的主控芯片型号:QN9020,再一个偶然是当我在Google这颗芯片资料的时候发现了一个FireBLE团队,这个团队做了一套开源的QN9020开发板,而这个团队的核心成员正是我的一个好朋友兼同学。这一系列的优质条件奠定了这篇开发入门的基础。这篇文章旨在提供一个开发入门的引导,为了是希望更多的电子爱好者能够一起参与进来,一起来开发它,实际上你只要有些51单片机或者stm32单片机的基础就可以,当然我们也得首先感谢玩咖科技出品的这款优质漂亮的手环。

clip_image002

这便是前面提到的某网友的拆机分析图,可以发现这手环的主要包括:主控QN9020,传感器、电池管理、按键、震动电机、OLED显示屏,因此外设并不算多。

手环拆机:

        在目前,我们为了能够对手环进行编程调试需要将它拆开,以便我们的仿真器能够连上主控芯片。当然,我希望随着后续的深入研究,我们可以实现不用拆机手环就可以对手环进行编程。虽然目前需要拆机,但是我希望完美无损的拆开并且今后调试好之后还能装上去继续使用,因此拆机步骤需要慢、小心。

(1) 先用小刀在手环胶套和面板的所有结合缝隙处用小刀划拉几遍:

clip_image004

(2) 用小刀切入到侧边慢慢用力撬动面板

clip_image006

(3) 这是面板完全分离后的效果

clip_image008

(4) 这是我拆开又盖上的效果

clip_image010

(5) 拆开后,电路板只有两颗对角螺钉与手环固定,用小螺丝刀拧开即可

(6) 电路的正面是显示屏,背面是电池:

clip_image012

clip_image014

(7) OLED屏幕是用双面胶粘在一个铁架子上,铁架子又是焊在电路板上的,因此这个不好拆的,大家就不要拆开了。电池也是用双面胶粘在电路板上的,电池轻轻用力慢慢就可以跟电路板分离,然后就露出了几个重要的测试点,图上我已经做了标注

clip_image016

RST是复位管脚,只要跟GND短接一下就芯片就复位了,这个平时用不到,某些特殊情况下可以用来解决程序无法下载的问题。

SWCLK、SWDIO、GND这个三个脚是Jlink仿真器的连接管脚,使用Jlink仿真器连接,就可以实现程序的调试、下载了。

TX、RX一看就是个串口,由于QN9020内部ROM固化有一个bootloader,可以使用串口下载程序,因此我初步估计这个串口可以用来下程序,但需要后续的验证,如果可以串口下载,那如果没有jlink的同学就可以降低开发成本使用串口来烧录程序了。

(8) 因此总体来说要进行开发,你需要的所有设备为:一个玩咖K1手环,一个Jlink调试器、一台PC电脑。随着后续深入的研究我们可能可以省去Jlink调试器这个东西。

开发环境搭建:

        有了上面的硬件,接下来需要搭建软件开发环境以便进行程序的编写调试。

(1) 安装Keil V4.72,实际上开发Cortex-M的芯片最常用的就是Keil和IAR,比较推荐使用Keil,一方面是高低版本工程的兼容性较好,另一方面是昆天科官方提供的例程代码也是Keil V4建立的。Keil 4.72应该是Keil V4系列下的目前最新版本。当然现在也有了Keil V5系列,但是Keil V4是打不开Keil V5的工程的,考虑到这个项目各个网友的代码可能需要共享参考,因此推荐使用Keil V4.72版本。 IAR有个很大缺点就是只能高版本打开低版本建立的工程,否则工程的配置信息可能会丢失。

(2) 安装Jlink驱动

(3) 安装昆天科官方提供的QBLUE,安装这个软件可以得到一个串口下载软件及基于QN9020的BLE及驱动库函数以及各个示例代码,是我们基于这颗芯片进行开发的最权威最直接也是最丰富的参考。软件及资料下载地址末尾同一提供。

(4) 建议是先安装好Keil之后再安装QBLUE,安装完QBLUE后会弹出一个往Keil的数据库中添加QN9020芯片的对话框:

clip_image018

关于开发环境搭建,也可以参考FireBLE团队的文档,再次感谢它们为此做出的努力:

http://wiki.t-firefly.com/index.php/FireBLE/Build_development_environment

主控芯片初探:

        介绍一下主控芯片:QN9020是昆天科微电子产的一颗BLE4.0芯片,片上集成了Cortex-M0内核,相当于一颗MCU+蓝牙,不过昆天科后来被NXP半导体收购了,这也导致了它的资料变得零散,很多官方资料NXP都不放出来了,不过不用担心本文最后会提供相关的资料,更多资料的挖掘还需要广大网友的努力。

clip_image020

这是该芯片的管脚图,由于我们无法获得玩咖K1手环的原理图,因此有它我们可以通过万用表探测得到板上这些外设所连接的控制管脚,当然这些工作我不希望还需要其它参与的网友来做,我会附上目前我已经探测好的管脚连接关系,并且会持续的更新探测。值得关注的是这颗芯片的存储结构,因为我们需要编程就得知道我们的程序应该写到哪里:

clip_image022

实际上,你只需要关注我画出的蓝色区域和红色区域即可,ROM区域是芯片出厂固化的一段代码,这段代码用户是无法去擦写修改的,它包括bootloader以及BLE协议栈的底层,这些底层函数提供了接口可供用户进行调用,SYSTEM MEMORY区域是提供给用户的。

clip_image024

从QBLUE提供给Keil的编程算法文件的描述来看,这64K实际上映射到了一个扩展的SPI Flash上面,也就是存放我的代码的地方,但是真正的程序执行时,不可能是从SPI Flash上提取指令的,并且RAM又在哪呢。实际上我们的应用代码+变量用的RAM在编程时虽然被存储在SPI Flash上面,但是在芯片上电后,系统还是会从0地址执行芯片出厂的bootloader,如果没有串口指令过来,那么就会将这用户代码Copy到RAM中开始执行用户代码,因此我猜测这64K空间同时又是内部RAM的映射地址,因此它不像其它MCU明确区分flash是多大,RAM是多大,而是用户自己分配两者的大小的。

第一个工程:

        我们无需自己去建立一个工程,可以直接使用QBLUE安装目录下释放的示例工程,或者直接使用我提供的能够点亮OLED的示例代码工程。

clip_image026

Projects工程目录下有BLE和Driver两个文件夹,BLE是蓝牙的示例代码,Driver是芯片各个外设比如GPIO、SPI、IIC、ADC等这些的驱动库函数及示例代码,前期的控制学习可以直接使用Driver目录下的工程把QN9020当做普通的单片机用,最终要完成一个智能手环,应该是BLE下的工程再结合Driver下的工程做一个整体的工程使得QN9020既能够发挥它的蓝牙功能又能正常控制OLED、按键、电机等外设。

clip_image028

打开其中的一个Keil工程,可以发现该添加的文件都帮你添加好了,可以直接进行编译。

clip_image030

我们可以点击Target Options按钮,然后选择 Target标签,查看一下官方给的工程的存储分配:

clip_image032

clip_image034

玩咖K1电路结构(此部分会持续摸索更新):

QN9020管脚

外设引脚

P02

OLED: SDA

P05

OLED: SCL

P03

OLED: RES#

P32

OLED: VDD CTRL(低有效)

P26

MOTOR:PWM1 output(低有效)

P16

KEY: (低有效)

P13

Sensor:CLK

P10

Sensor:MISO

P11

Sensor:MOSI

P12

Sensor:CS

P14

Sensor:INT1

P15

Sensor:INT2

OLED部分:玩咖K1使用0.84寸OLED,像素点为96x16,驱动芯片为SSD1306,使用IIC接口方式驱动,SSD1306使用内部Charge升压的方式,因为屏幕的驱动电压实际上是需要7V左右的一个高压的,这个电压可以通过SSD1306内部升压出来。

clip_image036

clip_image038

14pin管脚定义如上图,实际上与MCU相连的只有,RES#:复位管脚,低电平复位;SCL、SDA:IIC时钟和数据管脚。VDD实际上是芯片逻辑供电,玩咖手环做了一个MOS管开关,使用MCU的一个管脚控制MOS管的通断,因此要点亮OLED必须将这个控制VDD的MOS管打开。下面简单介绍一下我点亮OLED的工程初始化代码:

clip_image040

(1) 是对整个MCU系统的基本初始化,是系统库函数,每个工程中都应该首先调用。

(2) 是使能GPIO的时钟,只要工程中有使用到GPIO就必须执行这个函数,否则GPIO没有时钟是不会工作的。

(3) 打开OLED VDD的控制MOS管,使得OLED VDD供电。

(4) 系统启动后对OLED RES#管脚先拉低一下再拉高,使得OLED进行一下复位。

(5) 初始化QN9020内部的I2C模块,I2C速率设置为100K。

(6) 使用I2C进行OLED SSD1306的初始化寄存器配置。

显示字符到OELD上:

clip_image042

(1) 前面提到此OLED为96*16像素,因此你可以设定你希望显示的起始像素的坐标。这里是横向的第10个像素点,纵向的第5个像素点。

(2) 送入需要显示的字符到MCU的数据缓存中。

(3) 使用I2C更新数据缓存到SSD1306的RAM中,使得可以显示出来。

clip_image044

MOTOR部分:玩咖K1使用PWM来驱动震动电机,所接管脚为P26,使用其PWM1 Output的复用功能:

clip_image046

并且是低电平时电机导通,因此对于PWM驱动波形来说,占空比越小,电机震动得越厉害。

clip_image048

驱动代码参考官方的PWM例程,初始化通道CH1,配置PWM的周期和占空比,使能PWM,使能IO的PWM输出复用功能即可。当然,这里强烈建议初始化完PWM之后再使能IO的PWM功能,因为如果PWM还没有初始化就直接使能IO的PWM输出复用功能,那这个管脚将会默认输出低电平,我们的电机就处于满负荷的转动。因此先初始化PWM再初始化IO,这样输出占空比就处于可控状态了。

KEY部分:如我们所知玩咖K1有一个机械按键,这个按键接在P16口,该IO平时为高电平,按键按下时为低电平,因此也是低电平有效,实际上它接的管脚并没有什么特殊之处,但是对于一款低功耗的手环,它肯定是用来进行低功耗唤醒CPU的。但是通常的MCU中我们都是用按键的外部中断来唤醒CPU的休眠,我看了一下官方的Sleep例程,发现其唤醒按键可以是该芯片的任何一个GPIO,因此这肯定将会被我们后面用来唤醒手环低功耗模式。

三轴加速度部分:众所周知,智能手环需要计步那就需要一个加速度传感器,以便检测出人的行走步伐,通过资料查阅,推测玩咖K1使用的加速度传感器为BOSCH的产品,但是博世的三轴产品也比较多管脚封装也好多都一样,这里推测其具体型号为:BMA250E,至少我读出的Chip ID是与BMA250E的数据手册相同的,我想该芯片八九不离十。玩咖K1使用SPI四线接口与Sensor进行通信,实际上这个电路连接图在BMA250E的手册上也有示意图:

clip_image050

SPI为四线全双工通信,SDI实际上对应着MCU 的MOSI,SDO对应MCU的MISO,CSB是片选管脚,虽然QN9020有硬件SPI片选,但是我发现并不是很好用,因此我驱动这颗芯片时还是把CS管脚作为普通的IO进行控制。另外芯片的中断输出管脚INT1,INT2则接到MCU的两个普通IO用于告知MCU加速度计的中断事件。BOSCH提供了该芯片寄存器访问的API代码,因此我们需要做的工作仅仅是实现与MCU通信的最底层的SPI接口即可比较方便的使用它了。

clip_image052

BOSCH提供三个文件,其中bma2x2.c是所有读写寄存器的API,bma2x2_support.c是对底层SPI的接口实现,我们的SPI实现代码就是放在这个文件中。

这是API读函数中加入的QN9020实现的SPI代码:

clip_image054

这是SPI写函数中加入的QN9020实现的SPI代码:

clip_image056

做好底层SPI接口之后,就可以直接调用BOSCH提供的API访问传感器了,并且,在bma2x2_support.c中,官方还给我们提供了一个读取Sensor数据的example:

clip_image058

需要注意这个example函数中最后会将芯片进入休眠模式,再测试时,我们并不希望如此,因此这句话请先注释掉:

clip_image060

在主程序中,对其的使用则是先初始化SPI CS的IO口,然后 初始化SPI,设定速率及数据位数(通常为8bit),之后我首先调用了官方提供的驱动example的函数,因为这个函数中有些对芯片的简单初始化,比如设置工作模式,设置滤波带宽等,然后在循环中不断读取xyz轴的数据。

clip_image062

能够访问sensor的数据远远不够,我们需要使用计步算法实现计步统计,这将需要后续为之付出努力了。

 

由于知识有限,如有理解或者书写上的错误欢迎指出,并请随时关注该文档的讨论及最新版的发布位置:www.isoebbs.com .

该项目PDF文档以及完整的源码等开发资料,请移步至此处下载

0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

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

    新浪公司 版权所有