1

Revision:
11:dfd1e0afcb7b
Parent:
10:ca9ba7ad4e94
Child:
12:172540ff6b8b
--- a/MMA8452.h	Tue Mar 04 11:14:34 2014 +0000
+++ b/MMA8452.h	Tue Mar 04 16:23:40 2014 +0000
@@ -20,6 +20,10 @@
 // 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 DBG(...) pc.printf(__VA_ARGS__); pc.printf("\r\n");
+#define DBGX(...) pc.print(__VA_ARGS__);
+
 //#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
@@ -64,9 +68,9 @@
 // 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 - 
+  #define MMA8452_ADDRESS 0x3A // 0x1D<<1  // SA0 is high, 0x1C if low - 
 #else
-  #define MMA8452_ADDRESS 0x1C
+  #define MMA8452_ADDRESS 0x38 // 0x1C<<1
 #endif
 
 // Register descriptions found in section 6 of pdf
@@ -116,21 +120,53 @@
 #define PDET_STATUS 0x09        // Tap/Pulse Detection Register (Read/Write)
 #define PD_STATUS 0xA           // Tap/Pulse Debounce Count Register (Read/Write)
  
+#define MMA8452_ACTIVE_MASK 0x01
+#define MMA8452_STANDBY_MASK 0xFE
+ 
+#define MMA8452_XYZ_DATA_CFG 0x0E
+#define MMA8452_CTRL_REG_1 0x2A
+
+#define MMA8452_DYNAMIC_RANGE_MASK 0xFC
+
+
+#define MMA8452_DATA_RATE_MASK 0xC7
+#define MMA8452_DATA_RATE_MASK_SHIFT 0x03
+
+#define MMA8452_WRITE_MASK 0xFE
+#define MMA8452_READ_MASK 0x01
+
+#define MMA8452_BIT_DEPTH_MASK 0xFD
+#define MMA8452_BIT_DEPTH_MASK_SHIFT 0x01
+ 
 class MMA8452         
 {        
     public:
     
-       enum OperationalMode {
-           MODE_STANDBY,
-           MODE_ACTIVE_2G,
-           MODE_ACTIVE_4G,
-           MODE_ACTIVE_8G
+       enum DynamicRange {
+           DYNAMIC_RANGE_2G=0x00,
+           DYNAMIC_RANGE_4G,
+           DYNAMIC_RANGE_8G,
+           DYNAMIC_RANGE_UNKNOWN
        };
         
        enum BitDepth {
-           BIT_DEPTH_8,
-           BIT_DEPTH_12
+           BIT_DEPTH_12=0x00,
+           BIT_DEPTH_8 // 1 sets fast read mode, hence the inversion
        };
+       
+       enum DataRateHz {
+          RATE_800=0x00,
+          RATE_400,
+          RATE_200,
+          RATE_100,
+          RATE_50,
+          RATE_12_5,
+          RATE_6_25,
+          RATE_1_563,
+          RATE_UNKNOWN
+       };
+       
+       //void setDynamicRange(
         
        /** Create an accelerometer object connected to the specified I2C object
         *
@@ -145,26 +181,8 @@
         *
         */
       ~MMA8452();
-            
-      /** Get system mode of the MMA8452 (not required)
-        *   returns 0 for success in reading the system mode of the chip
-        *   returns 1 for failure in reading the system mode of the chip
-        *   -currently no retries or waiting is done, this method tries 1 time then exits.
-        *
-        *   This method is used to find out the system mode of the chip ACTIVE = 0x00 or STANDBY = 0x01
-      */
-      int getSystemMode(int *dst);    
       
-      /** Get status of the MMA8452 (not required)
-        *   returns 0 for success in reading the status of the chip
-        *   returns 1 for failure in reading the status of  the chip
-        *   -currrently no retries or waiting is done, this method tries 1 time then exits.
-        *
-        *   This method is used to find out the real time status of the device it shows if
-        *   x,y and z values have been overwritten before they have been read since a change happened.
-        *   
-      */
-      int getStatus(int *dst);
+      //int setOperationMode(OperationMode m);
       
       
       /** Activate the MMA8452 (required)
@@ -195,7 +213,7 @@
         *   This will return the state of the control register 1. This holds and sets values for auto wake, sleep mode
         *   output data rate, fast read mode and active/standby. More info on 6.7 of pdf for MMA8452 Freescale doc.
       */
-      int get_CTRL_Reg1(int* dst);
+      int get_CTRL_Reg1(char* dst);
       
       
        /** Initialization of device MMA8452 (required)
@@ -208,7 +226,7 @@
         * return 0 for success or
         * return 1 for failure.
         */        
-      int getDeviceID(int *dst);  
+      int getDeviceID(char* dst);  
       
       int read_y();
       
@@ -246,24 +264,36 @@
          * @param addr The internal registeraddress of the MMA8452
          * @returns The value of the register
          */
-      int readRegister(char addr, int *dst);
+      int readRegister(char addr, char *dst);
+      
+      int readRegister(char addr, char *dst, int nbytes);
         
         /** Write to specified MMA8452 register
         *
         * @param addr The internal registeraddress of the MMA8452
         * @param data New value of the register
         */    
-      void writeRegister(char addr, char data);
+      int writeRegister(char addr, char data);
+      int writeRegister(char addr, char *data, int nbytes);
+      
+      int logicalANDRegister(char addr, char mask);
+      int logicalORRegister(char addr, char mask);
+      int logicalXORRegister(char addr, char mask);
       
-      int setOperationalMode(OperationalMode m);
-      int setBitDepth(BitDepth b);
+      int setDynamicRange(DynamicRange range, int toggleActivation=1);
+      int setBitDepth(BitDepth depth, int toggleActivation=1);
+      int setDataRate(DataRateHz dataRate, int toggleActivation=1);
+      DynamicRange getDynamicRange();
+      DataRateHz getDataRate();
+      
+      void debugRegister(char reg);
    
     private:
       int readRaw(char src, char *dst, int len);
-    
+      int maskAndApplyRegister(char reg, char mask, char value, int toggleActivation);
     
-      I2C m_i2c;
-      int m_frequency;
+      I2C _i2c;
+      int _frequency;
       int _readAddress;
       int _writeAddress;