MMA9553L 计步器快速使用指南

MMA9553L是飞思卡尔的一款计步传感器,本文就如何快速使用该传感器做一个简单介绍。

你可能还见到过MMA955xL, 它与MMA9553L是什么关系呢?简单的来说MMA955xL是一个统称,它包括MMA9550L、MMA9551L、MMA9553L和MMA9559L这几个具体型号,其实这四种传感器在硬件上都是一样的。其内部主要由ColdFire 内核、模拟前端、Flash、IIC和SPI接口等部分组成,原理框图如下图所示:

它们的不同之处在于内部的Firmware不同,Firmware在芯片出厂时就已经固化在芯片里面了,不同的Firmware对于不同的功能。这里介绍的MMA9553L主要就用作计步器功能。

MMA9553L和MCU之间可以通过IIC接口或者SPI接口通讯,所以使用MMA9553L的首要前提是把MCU的IIC或者SPI调通。接口调通之后就可以来操作此传感器了。

下面分析一下源代码:

首先是调用初始化函数pedometer_init(),此函数主要调用以下几个函数:

    pedometer_write_config();       // config
    pedometer_enable();         // enable pedometer
    pedometer_int0_enable();    // enable INT_O pin
    pedometer_active();         // active MMA9553
    pedometer_wakeup();   // wakeup

在此重点分析前两个函数。第一个函数 pedometer_write_config(),该函数的具体实现如下:

void pedometer_write_config(void)
{
    unsigned char Buf[]={0x15,0x20,0x00,0x10,
                           0x0C,0xE0,
                           0x13,0x20,
                           0x00,0x96,
                           0x60,0x50,
                           0xAF,0x50,
                           0x04,0x03,
                           0x05,0x01,
                           0x00,0x00};
   dvMMA9553_Write(MMA9553_Slave_Addr, MMA9553_Sub_Addr, Buf, 20);
}

此函数很简单,就是通过IIC给9553发送一条命令,命令的内容Buf数组中的20个字节 的数据。

dvMMA9553_Write()函数的第一个参数代表MMA9553L的地址,为0x4C。datasheet中有说明。

dvMMA9553_Write()函数的第二个参数代表寄存器地址,为0x00。

发送的这一串命令:0x15,0x20,0x00,0x10,0x0C,0xE0,0x13,0x20,0x00,0x96,0x60,0x50,0xAF,0x50,0x04,0x03,0x05,0x01,0x00,0x00 具体是什么含义呢?

0x15:表示Application ID,计步器的Application ID就是0x15

0x20:表示这条命令是Write Config command,即这条命令是用来写Configuration 寄存器的。

0x00:表示配置寄存器的偏移地址。

0x10:表示要写16字节的内容。

0x0C,0xE0,0x13,0x20,0x00,0x96,0x60,0x50,0xAF,0x50,0x04,0x03,0x05,0x01,0x00,0x00 这16字节就是写入配置寄存器中的具体内容。

配置寄存器共用8个,分别是Sleep Minimum register,Sleep Maximum register,Sleep Count Threshold register,Configuration/Step Length register,Height/Weight register,Filter register,Speed Period/Step Coalesce register,Activity Count Threshold register,每个寄存器为16 bit(2 字节),所以总共16字节。

寄存器具体内容见《MMA9553LSWRM.pdf》文档

第二个函数 pedometer_enable(),该函数的具体实现如下:

void pedometer_enable(void)
{
    unsigned char Buf[]={0x17,0x20,0x05,0x01,0x00};
    dvMMA9553_Write(MMA9553_Slave_Addr, MMA9553_Sub_Addr, Buf, 5);
}

这次写入的命令是0x17,0x20,0x05,0x01,0x00

0x17:表示Application ID

0x20:表示这条命令是Write Config command

0x05,0x01,0x00 这三个表示在偏移地址0x5处,写入一个字节的数据0x00

其他几个函数也类似,都是写入一条命令,对某种Application的配置寄存进行设置。

初始化完了,现在就可以读取步数了。

通过调用pedometer_main() 函数就可以读取到步数。

该函数的实现如下:

void pedometer_main(void)
{
    unsigned char Buf[20];
    pedometer_cmd_readstatus(); // read  status
    while(1)
    {
      dvMMA9553_Read(MMA9553_Slave_Addr, MMA9553_Sub_Addr, Buf, 2);
      if(Buf[1]==0x80)
        {
        dvMMA9553_Read(MMA9553_Slave_Addr, MMA9553_Sub_Addr, Buf, 16);
         break;
        }
    }
    m_status.StepCount = Buf[6] * 256 + Buf[7];
}

主要调用了两个函数,一是pedometer_cmd_readstatus(),这个函数的实现如下:

void pedometer_cmd_readstatus(void)
{
    unsigned char Buf[]={0x15,0x30,0x00,0x0C};
    dvMMA9553_Write(MMA9553_Slave_Addr, MMA9553_Sub_Addr, Buf, 4 );
}

}

它是发送了0x15,0x30,0x00,0x0C这条命令

0x15:表示Application ID

0x30:表示Read Status command

0x00:表示偏移地址

0x0C:表示需要读的字节数为12

之后调用dvMMA9553_Read()函数,通过IIC读取16字节的数据(4字节起始信息+12字节status register内容),读到的16字节数据如下:

Step count register寄存器如下,通过其值可以算出步数来。

另外还可以读取三轴加速度的值,过程与读取步数是类似的,也是先写配置寄存器,然后再读取状态寄存器。

总结如下:

操作MMA955L的关键搞清楚有两个重要的寄存器:配置寄存器状态寄存器。配置寄存器可读可写,状态寄存器只可读。

写配置寄存器,格式是:

APP_ID+20+offset+number+number字节的内容

读配置寄存器,格式为:

先发送:APP_ID+10+offset+number, 再通过IIC读number+4字节的内容,前4字节为起始信息。

读状态寄存器,格式为:

先发送:APP_ID+30+offset+number,再通过IIC读number+4字节的内容,前4字节为起始信息。

读Command 返回的内容如下:

各个部分的含义如下:

Error code的含义如下:

这样分析下来操作MMA9553L还是很简单的,就是按照固定格式发送特定的命令就行了。

说明:

参考代码和使用过程中需要参考的相关文档的链接为:

MMA9553L 资料下载链接

例程的测试平台为:IAR7.2 + FRDM_KL25Z+FRDM-FXS-MULTI

FRDM-FXS-MULTI开发板上带有MMA9553L,将FRDM-FXS-MULTI开发板和FRDM_KL25Z连接在一起就可以使用了。

如果使用其他平台,只需要将dvMMA9553.c和dvMMA9553.h文件放到工程里,修改一下IIC读写函数就可以了。

时间: 2024-08-27 02:10:10

MMA9553L 计步器快速使用指南的相关文章

JWPlayer快速入门指南(中文)

将JW Player嵌入到网页中非常的简单,只需要进行如下3个步骤: 1.解压mediaplayer-viral.zip文件,将jwplayer.js和player.swf文件拷贝到工程中: 2.在页面引入jwplayer.js文件: <script type="text/javascript" src="/jwplayer/jwplayer.js"></script> 3.将下面代码粘贴在body标签内,如下所示: <div id=&

Chapter 0.SymmetricDS快速入门指南( Quick Start Guide)

本文档是SymmetricDS3.6.14文档的第一章节Quick Start Guide文档的翻译,的目的是帮助读者快速搭建一个SymmetricDS集群并普及一些基本概念术语. 本文档描述了如何在两个SymmetricDS节点之间同步两个相同schema的数据库.下面的例子构建了一个分销业务模型,有一个中央数据库(我们叫它root或者corp节点)和多个零售商店的数据库(我们叫它client或者store节点).对于本教程,我们将只有一个store(商店)节点,如下图.如果你愿意,可以再教程

Redmine与Zentao同机快速部署指南

Redmine与Zentao 同机快速部署指南 1.环境 系统:CentOS 7 x64 软件:Redmine 3.0.Zentao 7.2 Source Redmine 3.0 是先安装的,目录 /opt/redmine,访问地址 http://127.0.0.1/redmine Zentao 7.2 是后安装的,目标访问地址 http://127.0.0.1/zentao 2.已知 Redmine与zentao 都依赖 apache mysql, apache 监听端口为 80 8080 s

AngularJS快速入门指南20:快速参考

thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table.reference>thead>tr>td, table.reference>tbody>tr>td, table.reference>tfoot>tr>td { padding: 8px; line-height: 1.42857143; vertic

AngularJS快速入门指南05:控制器

AngularJS控制器用来控制AngularJS applications的数据. AngularJS控制器就是普通的JavaScript对象. AngularJS控制器 AngularJS applications通过控制器进行控制. ng-controller指令定义了一个application的控制器. 一个控制器就是一个JavaScript对象,它可以通过标准的JavaScript对象构造函数来创建. <div ng-app="myApp" ng-controller=

Drozer快速使用指南

Drozer快速使用指南 1.简介: Drozer是一款用于测试android应用程序漏洞的安全评估工具,能够发现多种类型的安全的漏洞,免费版本的相关资源下载地址: https://www.mwrinfosecurity.com/products/drozer/community-edition/ 其中包含了Drozer的使用说明书,里面对Drozer的使用方法进行了详细的描述. 攥写本文的目的在于提取说明书内主要关键步骤,并结合实际例子,以便于自己能够快速参考和使用,同时也方便英文不好的同事做

[转] Clojure 快速入门指南:1/3

[From] http://huangz.iteye.com/blog/1325228 导读 本文的目标是为熟悉 Ruby.Python或者其他类似语言.并对 Lisp 或者函数式编程有一定程度了解的程序员写的 Clojure 快速入门指南. 为了让文章尽可能地精炼且简单易懂,本文有以下三个特点: 一:不对读者的知识水平作任何假设,当遇上重要的知识点时,只给出 wikipedia 等网站的链接引用而不对知识点进行解释,有需要的读者可以沿着链接查看,没需要的直接略过就行了. 二:和第一条类似,没有

AngularJS快速入门指南15:API

thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table.reference>thead>tr>td, table.reference>tbody>tr>td, table.reference>tfoot>tr>td { padding: 8px; line-height: 1.42857143; vertic

AngularJS快速入门指南14:数据验证

thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table.reference>thead>tr>td, table.reference>tbody>tr>td, table.reference>tfoot>tr>td { padding: 8px; line-height: 1.42857143; vertic