MMA9553L/MMA955L 计步器快速使用指南

MMA9553L是飞思卡尔的一款计步传感器,本文就如何快速使用该传感器做一个简单介绍。
你可能还见到过MMA955xL, 它与MMA9553L是什么关系呢?简单的来说MMA955xL是一个统称,它包括MMA9550L、MMA9551L、MMA9553L和MMA9559L这几个具体型号,其实这四种传感器在硬件上都是一样的。其内部主要由ColdFire 内核、模拟前端、Flash、IIC和SPI接口等部分组成,原理框图如下图所示:
MMA9553L原题框图
它们的不同之处在于内部的Firmware不同,Firmware在芯片出厂时就已经固化在芯片里面了,不同的Firmware对于不同的功能。这里介绍的MMA9553L主要就用作计步器功能。
这里写图片描述
客户经常会问MMA9553和MMA9555的区别,从上图可以看出MMA9555相比较MMA9553多了 Six-Direction 检测和GPIO Input/Output 功能。其他的功能都是相同的。
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寄存器如下,通过其值可以算出步数来。
这里写图片描述

在实际使用过程中,您可能需要读取传感器的ID,版本信息等,方法是发送0x00,0x00,0x00,0x0C:
这里写图片描述

这里写图片描述
这里没有配置寄存器和状态寄存器。

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

总结如下:
操作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 资料下载链接

补充:
功能1:每隔10步产生一个中断
这里写图片描述
03 20 02 02 15 05 ,最后05的含义是:
这里写图片描述

对于MMA9555L,它的操作方法是:
这里写图片描述

它多了一条:
这里写图片描述

目的是为了防止冲突:
这里写图片描述

MMA9555L 具有Six-Direction检测功能:
这里写图片描述
它的寄存器很简单,
这里写图片描述

使用这个功能的话先配置一下:
这里写图片描述

之后就可以读取状态寄存器的值进行判断了:
这里写图片描述

这样通过轮询的方式读取状态寄存器的方法去判断是否有方向变化不太方便,可以使用中断的方法,将SC_Flag的变化映射到GPIO上,这样在你MCU端就可以通过中断的方式进行处理。将SC_Flag映射到GPIO上的例子:
这里写图片描述

(AB & 6F)这个手册中描述的比较模糊,实际上AB可以理解为GPIO input/output enable register返回值(实际上是通过19 10 01 01读指令读回来的值),这样的话AB&6F可以理解成读-修改-写的过程。这样操作的原因是:
这里写图片描述

是6F,即01101111,即把EN6的GPIO功能给关掉了,这样的目的是防止GPIO Input/Output Application和GPIO AppMap相互冲突(因为他们都占用GPIO6)。

例程的测试平台为:IAR7.2 + FRDM_KL25Z+FRDM-FXS-MULTI
FRDM-FXS-MULTI开发板上带有MMA9553L,将FRDM-FXS-MULTI开发板和FRDM_KL25Z连接在一起就可以使用了。
如果使用其他平台,只需要将dvMMA9553.c和dvMMA9553.h文件放到工程里,修改一下IIC读写函数就可以了。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值