This is a simple device driver for the 3 axis accelerometer MMA8452 that works with mbed.

Dependents:   MMA8452_test S05APP3_routeur

Revision:
0:bcf2aa85d7f9
Child:
1:ef026bf28798
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA8452.h	Fri Oct 04 14:48:02 2013 +0000
@@ -0,0 +1,194 @@
+// Author: Nicholas Herriot
+/* Copyright (c) 2013 Vodafone, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+// the SparkFun breakout board defaults to 1, set to 0 if SA0 jumper on the bottom of the board is set
+// see the Table 10. I2C Device Address Sequence in Freescale MMA8452Q pdf
+
+//#define SA0 1
+//#if SA0
+  //#define MMA8452_ADDRESS 0x3A  // SA0 is high, 0x1C if low - it should be 0x1D, but we shift now to save shifting in the code
+//#else
+  //#define MMA8452_ADDRESS 0x1C
+//#endif
+
+//#ifndef MBED_MMA8452
+
+//#define MBED_MMA8452
+ 
+#include "mbed.h"
+ 
+/** Accelerometer MMA8452 class 
+ *
+ * Example:
+ * @code
+ * 
+ * #include "mbed.h"
+ * #include "MMA8452.h"
+ * 
+ * 
+ * Accelerometer_MMA8452 Acc(p28, p27);
+ * serial pc(USBTX, USBRX);
+ *
+ * int main() 
+ * {
+ *   Acc.init(); 
+ *      while(1)
+ *      {
+ *          int x=0, y=0, z=0;
+ *          Acc.read_Tilt(&x, &y, &z);
+ *          pc.printf("Tilt x: %2.2f degree \n", x);                    // Print the tilt orientation of the X axis
+ *          pc.printf("Tilt y: %2.2f degree \n", y);                    // Print the tilt orientation of the Y axis
+ *          pc.printf("Tilt z: %2.2f degree \n", z);                    // Print the tilt orientation of the Z axis
+ *          wait(1);       
+ *      }
+ * }
+ * @endcode
+ */ 
+
+// More info on MCU Master address can be found on section 5.10.1 of http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MMA8452Q
+#define SA0 1
+#if SA0
+  #define MMA8452_ADDRESS 0x1D  // SA0 is high, 0x1C if low - 
+#else
+  #define MMA8452_ADDRESS 0x1C
+#endif
+
+// Register descriptions found in section 6 of pdf
+#define STATUS 0x00                         // Type 'read' : Real time status, should return 0x00
+#define OUT_X_MSB 0x01                      // Type 'read' : x axis - 8 most significatn bit of a 12 bit sample
+#define OUT_X_LSB 0x02                      // Type 'read' : x axis - 4 least significatn bit of a 12 bit sample
+#define OUT_Y_MSB 0x03                      // Type 'read' : y axis - 8 most significatn bit of a 12 bit sample
+#define OUT_Y_LSB 0x04                      // Type 'read' : y axis - 4 least significatn bit of a 12 bit sample
+#define OUT_Z_MSB 0x05                      // Type 'read' : z axis - 8 most significatn bit of a 12 bit sample
+#define OUT_Z_LSB 0x06                      // Type 'read' : z axis - 4 least significatn bit of a 12 bit sample
+
+#define SYSMOD 0x0B                         // Type 'read' : This tells you if device is active, sleep or standy 0x00=STANDBY 0x01=WAKE 0x02=SLEEP
+#define WHO_AM_I 0x0D                       // Type 'read' : This should return the device id of 0x2A
+
+#define PL_STATUS 0x10                      // Type 'read' : This shows portrait landscape mode orientation
+#define PL_CFG 0x11                         // Type 'read/write' : This allows portrait landscape configuration
+#define PL_COUNT 0x12                       // Type 'read' : This is the portraint landscape debounce counter
+#define PL_BF_ZCOMP 0x13                    // Type 'read' :
+#define PL_THS_REG 0x14                     // Type 'read' :
+
+#define FF_MT_CFG 0X15                      // Type 'read/write' : Freefaul motion functional block configuration
+#define FF_MT_SRC 0X16                      // Type 'read' : Freefaul motion event source register
+#define FF_COUNT 0X17                       // Type 'read' : Freefaul motion threshold register
+#define FF_COUNT 0X18                       // Type 'read' : Freefaul motion debouce counter
+
+#define ASLP_COUNT 0x29                     // Type 'read/write' : Counter setting for auto sleep
+#define CTRL_REG_1 0x2A                     // Type 'read/write' :
+#define CTRL_REG_2 0x2B                     // Type 'read/write' :
+#define CTRL_REG_3 0x2C                     // Type 'read/write' :
+#define CTRL_REG_4 0x2D                     // Type 'read/write' :
+#define CTRL_REG_5 0x2E                     // Type 'read/write' :
+
+
+ 
+#define TILT_STATUS 0x03        // Tilt Status (Read only)
+#define SRST_STATUS 0x04        // Sample Rate Status Register (Read only)
+#define SPCNT_STATUS 0x05       // Sleep Count Register (Read/Write)
+#define INTSU_STATUS 0x06       // Interrupt Setup Register
+#define MODE_STATUS 0x07        // Mode Register (Read/Write)
+#define SR_STATUS 0x08          // Auto-Wake and Active Mode Portrait/Landscape Samples per Seconds Register (Read/Write)
+#define PDET_STATUS 0x09        // Tap/Pulse Detection Register (Read/Write)
+#define PD_STATUS 0xA           // Tap/Pulse Debounce Count Register (Read/Write)
+
+
+
+
+
+ 
+class Accelerometer_MMA8452         
+{        
+    public:
+        
+        
+       /** Create an accelerometer object connected to the specified I2C object
+        *
+        * @param sda I2C data port
+        * @param scl I2C8452 clock port
+        * 
+        */ 
+      Accelerometer_MMA8452(PinName sda, PinName scl);
+       
+       /** Destroys an MMA8452 object
+        *
+        */
+      ~Accelerometer_MMA8452();
+      
+      /** Activate the MMA8452 (required)
+       *
+       *
+       */
+      int activate();
+      
+       /** Initialization of device MMA8452 (required)
+        *
+        */
+      void init();
+    
+       /** Read the Tilt Angle using Three Axis
+        *
+        * @param *x Value of x tilt
+        * @param *y Value of y tilt
+        * @param *z Value of z tilt
+        */
+      void read_Tilt(float *x, float *y, float *z);
+      
+      /** Read the x register of the MMA8452
+        *
+        * @returns The value of x acceleration
+        */
+      int read_x();
+      
+      /** Read the y register of the MMA8452
+        *
+        * @returns The value of y acceleration
+        */
+      int read_y();
+      
+      /** Read the z register of the MMA8452
+        *
+        * @returns The value of z acceleration
+        */
+       int read_z();
+            
+        /** Read from specified MMA8452 register
+         *
+         * @param addr The internal registeraddress of the MMA8452
+         * @returns The value of the register
+         */
+      char read_reg(char addr);
+        
+        /** Write to specified MMA8452 register
+        *
+        * @param addr The internal registeraddress of the MMA8452
+        * @param data New value of the register
+        */    
+      void write_reg(char addr, char data); 
+      
+   
+    private:
+      I2C m_i2c;
+      int m_frequencey;
+         
+};
+
+//#endif