Library for driving the MMA8452 accelerometer over I2C

Dependents:   MMA8452_Test MMA8452_Demo Dualing_Tanks IMU-Controlled_MP3_Player ... more

Here is a simple example:

#include "mbed.h"
#include "MMA8452.h"

int main() {
   Serial pc(USBTX,USBRX);
   pc.baud(115200);
   double x = 0, y = 0, z = 0;

   MMA8452 acc(p28, p27, 40000);
   acc.setBitDepth(MMA8452::BIT_DEPTH_12);
   acc.setDynamicRange(MMA8452::DYNAMIC_RANGE_4G);
   acc.setDataRate(MMA8452::RATE_100);
   
   while(1) {
      if(!acc.isXYZReady()) {
         wait(0.01);
         continue;
      }
      acc.readXYZGravity(&x,&y,&z);
      pc.printf("Gravities: %lf %lf %lf\r\n",x,y,z);
   }
}

An easy way to test that this actually works is to run the loop above and hold the MMA8452 parallel to the ground along the respective axis (and upsidedown in each axis). You will see 1G on the respective axis and 0G on the others.

Revision:
10:ca9ba7ad4e94
Parent:
9:dfb0f6a7a455
Child:
11:dfd1e0afcb7b
--- a/MMA8452.cpp	Thu Oct 17 10:21:37 2013 +0000
+++ b/MMA8452.cpp	Tue Mar 04 11:14:34 2014 +0000
@@ -20,8 +20,7 @@
 # include "MMA8452.h"
 
 // Connect module at I2C address using I2C port pins sda and scl
-Accelerometer_MMA8452::Accelerometer_MMA8452(PinName sda, PinName scl,int frequency) : m_i2c(sda, scl) , m_frequency(frequency)
-{
+MMA8452::MMA8452(PinName sda, PinName scl,int frequency) : m_i2c(sda, scl) , m_frequency(frequency) {
     //m_i2c.frequency(m_frequency);
     
     // setup read and write addresses to avoid duplication
@@ -31,14 +30,10 @@
 
 
 // Destroys instance
-Accelerometer_MMA8452::~Accelerometer_MMA8452() 
-{
-
-}
+MMA8452::~MMA8452() {}
 
 // Setting the control register bit 1 to true to activate the MMA8452
-int Accelerometer_MMA8452::activate()
-{
+int MMA8452::activate() {
     // set control register 1 to active
     char init[2] = {CTRL_REG_1,ACTIVE};
     
@@ -50,13 +45,13 @@
 // Get 'Fast Read Mode' called F_READ. If bit 1 is set '1' then F_READ is active. Fast read will skip LSB when reading xyz
 // resisters from 0x01 to 0x06. When F_READ is '0' then all 6 registers will be read.
 
-int Accelerometer_MMA8452::get_CTRL_Reg1(int* dst)
+int MMA8452::get_CTRL_Reg1(int* dst)
 {   
-   return read_reg(CTRL_REG_1,dst); 
+   return readRegister(CTRL_REG_1,dst); 
 }
 
 // Setting the control register bit 1 to true to activate the MMA8452
-int Accelerometer_MMA8452::standby()
+int MMA8452::standby()
 {
     // set control register 1 to standby
     char init[2] = {CTRL_REG_1,STANDBY};
@@ -68,40 +63,40 @@
 
 
 // Device initialization
-void Accelerometer_MMA8452::init()
+void MMA8452::init()
 {
     
-    write_reg(INTSU_STATUS, 0x10);      // automatic interrupt after every measurement
-    write_reg(SR_STATUS, 0x00);         // 120 Samples/Second
-    write_reg(MODE_STATUS, 0x01);       // Active Mode
+    writeRegister(INTSU_STATUS, 0x10);      // automatic interrupt after every measurement
+    writeRegister(SR_STATUS, 0x00);         // 120 Samples/Second
+    writeRegister(MODE_STATUS, 0x01);       // Active Mode
     
 }
 
 // Get real time status of device - it can be STANDBY, WAKE or SLEEP
-int Accelerometer_MMA8452::get_SystemMode(int *dst)
+int MMA8452::getSystemMode(int *dst)
 {
-    return read_reg(SYSMOD,dst);
+    return readRegister(SYSMOD,dst);
 }
 
 
 
 // Get real time status of device - it can be STANDBY, WAKE or SLEEP
-int Accelerometer_MMA8452::get_Status(int* dst)
+int MMA8452::getStatus(int* dst)
 {
-    return read_reg(STATUS,dst);
+    return readRegister(STATUS,dst);
 }
 
 
 // Get device ID 
-int Accelerometer_MMA8452::get_DeviceID(int *dst)
+int MMA8452::getDeviceID(int *dst)
 {
-    return read_reg(WHO_AM_I,dst);
+    return readRegister(WHO_AM_I,dst);
 }
 
 
 /*
 // Reads x data
-int Accelerometer_MMA8452::read_x(int& xaxisLSB)
+int MMA8452::read_x(int& xaxisLSB)
 {
     char mcu_address = (MMA8452_ADDRESS<<1);
     m_i2c.start();
@@ -124,7 +119,7 @@
 }
 */
 
-int Accelerometer_MMA8452::read_raw(char src, char *dst, int len) {
+int MMA8452::readRaw(char src, char *dst, int len) {
     // this is the register we want to get data from               
     char register_address[1];
     register_address[0] = src;
@@ -148,10 +143,10 @@
 // It takes a 2 byte char array and copies the register values into the buffer. If it fails the char array
 // is set to '0'. It returns '0' success '1' fail. This method does nothing to the registers - just returns
 // the raw data.
-//int Accelerometer_MMA8452::read_x(int& xaxisLSB)
-int Accelerometer_MMA8452::read_x_raw(char *xaxis)
+//int MMA8452::read_x(int& xaxisLSB)
+int MMA8452::readRawX(char *xaxis)
 {   
-    return read_raw(OUT_X_MSB,xaxis,2);  
+    return readRaw(OUT_X_MSB,xaxis,2);  
 }
 
 
@@ -160,8 +155,8 @@
 // is set to '0'. It returns '0' success '1' fail. This method does nothing to the registers - just returns
 // the raw data.
 
-int Accelerometer_MMA8452::read_y_raw(char *yaxis) {
-   return read_raw(OUT_Y_MSB,yaxis,2);
+int MMA8452::readRawY(char *yaxis) {
+   return readRaw(OUT_Y_MSB,yaxis,2);
 }
 
 
@@ -171,15 +166,15 @@
 // is set to '0'. It returns '0' success '1' fail. This method does nothing to the registers - just returns
 // the raw data.
 
-int Accelerometer_MMA8452::read_z_raw(char *zaxis)
+int MMA8452::readRawZ(char *zaxis)
 {
-   return read_raw(OUT_Z_MSB,zaxis,2);
+   return readRaw(OUT_Z_MSB,zaxis,2);
 }
 
 
 
 // Reads y data
-int Accelerometer_MMA8452::read_y()
+int MMA8452::read_y()
 {
     char mcu_address = (MMA8452_ADDRESS <<1);
 
@@ -197,7 +192,7 @@
 
 
 // Reads z data
-int Accelerometer_MMA8452::read_z()
+int MMA8452::read_z()
 {
     char mcu_address = (MMA8452_ADDRESS <<1);
     
@@ -215,7 +210,7 @@
 
 
 // Reads xyz
-int Accelerometer_MMA8452::read_xyz(char *x, char *y, char *z) 
+int MMA8452::readRawXYZ(char *x, char *y, char *z) 
 {
     
     
@@ -247,7 +242,7 @@
 }
 
         // Write register (The device must be placed in Standby Mode to change the value of the registers) 
-void Accelerometer_MMA8452::write_reg(char addr, char data)
+void MMA8452::writeRegister(char addr, char data)
 {
 
     char cmd[2] = {0, 0};
@@ -266,10 +261,8 @@
                   
 }
 
-
-
         // Read from specified MMA7660FC register
-int Accelerometer_MMA8452::read_reg(char addr, int *dst)
+int MMA8452::readRegister(char addr, int *dst)
 {
     
     m_i2c.start();
@@ -292,9 +285,3 @@
     return 0;
     
 }
-
-
-
-
-
-