1
Diff: MMA8452.cpp
- Revision:
- 12:172540ff6b8b
- Parent:
- 11:dfd1e0afcb7b
- Child:
- 13:4bd8b4cd479d
diff -r dfd1e0afcb7b -r 172540ff6b8b MMA8452.cpp --- a/MMA8452.cpp Tue Mar 04 16:23:40 2014 +0000 +++ b/MMA8452.cpp Tue Mar 04 17:50:47 2014 +0000 @@ -25,11 +25,17 @@ // Connect module at I2C address using I2C port pins sda and scl MMA8452::MMA8452(PinName sda, PinName scl, int frequency) : _i2c(sda, scl) , _frequency(frequency) { DBG("Creating MMA8452"); + + // set I2C frequency _i2c.frequency(_frequency); - // setup read and write addresses to avoid duplication + // setup read and write addresses for convenience _readAddress = MMA8452_ADDRESS | 0x01; _writeAddress = MMA8452_ADDRESS & 0xFE; + + // set some defaults + _bitDepth = BIT_DEPTH_UNKNOWN; + setBitDepth(BIT_DEPTH_12); DBG("Done"); } @@ -40,13 +46,13 @@ // Setting the control register bit 1 to true to activate the MMA8452 int MMA8452::activate() { // perform write and return error code - return logicalORRegister(CTRL_REG_1,MMA8452_ACTIVE_MASK); + return logicalORRegister(MMA8452_CTRL_REG_1,MMA8452_ACTIVE_MASK); } // Setting the control register bit 1 to 0 to standby the MMA8452 int MMA8452::standby() { // perform write and return error code - return logicalANDRegister(CTRL_REG_1,MMA8452_STANDBY_MASK); + return logicalANDRegister(MMA8452_CTRL_REG_1,MMA8452_STANDBY_MASK); } // this reads a register, applies a bitmask with logical AND, sets a value with logical OR, @@ -102,6 +108,7 @@ } int MMA8452::setBitDepth(BitDepth depth,int toggleActivation) { + _bitDepth = depth; return maskAndApplyRegister( MMA8452_CTRL_REG_1, MMA8452_BIT_DEPTH_MASK, @@ -110,105 +117,25 @@ ); } - -// Get device ID -int MMA8452::getDeviceID(char *dst) -{ - return readRegister(WHO_AM_I,dst); +int MMA8452::isXYZReady() { + char rval = 0; + if(readRegister(MMA8452_STATUS,&rval)) { + return 0; + } + return (rval&MMA8452_STATUS_ZYXDR_MASK); } - - -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; - - if(_i2c.write(_writeAddress,register_address,1,true) == 0) - { - if(_i2c.read(_readAddress,dst,len)==0) - { - return 0; - } - } - - // failure case, zero array and return error - for(int i=0; i<len; i++) { - dst[i] = 0x00; - } - return 1; -} - -// Reads x data. This method reads two registers containing the x-axis values from the accelerometer. -// 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 MMA8452::read_x(int& xaxisLSB) -int MMA8452::readRawX(char *xaxis) { - return readRaw(OUT_X_MSB,xaxis,2); -} - - -// Reads y data. This method reads two registers containing the x-axis values from the accelerometer. -// 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 MMA8452::readRawY(char *yaxis) { - return readRaw(OUT_Y_MSB,yaxis,2); + +int MMA8452::getDeviceID(char *dst) { + return readRegister(MMA8452_WHO_AM_I,dst); } - - -// Reads z data. This method reads two registers containing the x-axis values from the accelerometer. -// 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 MMA8452::readRawZ(char *zaxis) -{ - return readRaw(OUT_Z_MSB,zaxis,2); +int MMA8452::getStatus(char* dst) { + return readRegister(MMA8452_STATUS,dst); } - - -// Reads y data -int MMA8452::read_y() -{ - char mcu_address = (MMA8452_ADDRESS <<1); - - _i2c.start(); // Start - _i2c.write(mcu_address); // A write to device 0x98 - _i2c.write(OUT_Y_MSB); // Register to read - _i2c.start(); - _i2c.write(mcu_address); // Read from device 0x99 - int y = _i2c.read(0); // Read the data - _i2c.stop(); - - return y; - -} - -// Reads z data -int MMA8452::read_z() -{ - char mcu_address = (MMA8452_ADDRESS <<1); - - _i2c.start(); // Start - _i2c.write(mcu_address); // A write to device 0x98 - _i2c.write(OUT_Z_MSB); // Register to read - _i2c.start(); - _i2c.write(mcu_address); // Read from device 0x99 - int z = _i2c.read(0); // Read the data - _i2c.stop(); - - return z; - -} - - MMA8452::DynamicRange MMA8452::getDynamicRange() { char rval = 0; - if(readRegister(MMA8452_CTRL_REG_1,&rval)) { + if(readRegister(MMA8452_XYZ_DATA_CFG,&rval)) { return MMA8452::DYNAMIC_RANGE_UNKNOWN; } rval &= (MMA8452_DYNAMIC_RANGE_MASK^0xFF); @@ -228,35 +155,15 @@ } // Reads xyz -int MMA8452::readRawXYZ(char *x, char *y, char *z) -{ - - - char mcu_address = (MMA8452_ADDRESS <<1); - char register_buffer[6] ={0,0,0,0,0,0}; - const char Addr_X = OUT_X_MSB; - _i2c.write(mcu_address); // A write to device 0x98 - _i2c.write(MMA8452_ADDRESS, &Addr_X, 1); // Pointer to the OUT_X_MSB register - - if(_i2c.write(mcu_address,&Addr_X,1) == 0) - { - if(_i2c.read(mcu_address,register_buffer,6) == 0) - { - *x = register_buffer[1]; - *y = register_buffer[3]; - *z = register_buffer[5]; - return 0; // yahoooooo - } - else - { - return 1; // failed oh nooo! - } - } - else - { - return 1; // failed oh nooo! - } - +int MMA8452::readRawXYZ(char *dst) { + if(_bitDepth==BIT_DEPTH_UNKNOWN) { + return 1; + } + int readLen = 3; + if(_bitDepth==BIT_DEPTH_12) { + readLen = 6; + } + return readRegister(MMA8452_OUT_X_MSB,dst,readLen); } // apply an AND mask to a register. read register value, apply mask, write it back @@ -284,7 +191,6 @@ return writeRegister(addr,value); } - // apply an OR mask to a register. read register value, apply mask, write it back int MMA8452::logicalXORRegister(char addr, char mask) { char value = 0; @@ -367,7 +273,7 @@ // get register value char v = 0; if(readRegister(reg,&v)) { - DBG("Error reading control register"); + DBG("Error reading specified register"); return; } // print out details @@ -410,6 +316,18 @@ } break; + case MMA8452_STATUS: + DBG("STATUS has value: 0x%x",v); + DBG(" 7 ZYXOW: %d",(v&0x80)>>7); + DBG(" 6 ZOW: %d", (v&0x40)>>6); + DBG(" 5 YOW: %d", (v&0x20)>>5); + DBG(" 4 XOW: %d", (v&0x10)>>4); + DBG(" 3 ZYXDR: %d",(v&0x08)>>3); + DBG(" 2 ZDR: %d", (v&0x04)>>2); + DBG(" 1 YDR: %d", (v&0x02)>>1); + DBG(" 0 XDR: %d", (v&0x01)); + break; + default: DBG("Unknown register address: 0x%x",reg); break;