Works with 8g
Fork of MMA8452 by
Diff: MMA8452.cpp
- Revision:
- 8:89272163f395
- Parent:
- 7:8aa5123d403f
- Parent:
- 6:f6bde04bf8be
- Child:
- 9:dfb0f6a7a455
diff -r 8aa5123d403f -r 89272163f395 MMA8452.cpp --- a/MMA8452.cpp Thu Oct 17 09:40:10 2013 +0000 +++ b/MMA8452.cpp Thu Oct 17 10:08:51 2013 +0000 @@ -19,20 +19,19 @@ # 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) { //m_i2c.frequency(m_frequency); + + // setup read and write addresses to avoid duplication + _readAddress = (MMA8452_ADDRESS<<1) | 0x01; + _writeAddress = (MMA8452_ADDRESS<<1) & 0xFE; } // Destroys instance -Accelerometer_MMA8452::~Accelerometer_MMA8452() +Accelerometer_MMA8452::~Accelerometer_MMA8452() { } @@ -40,75 +39,46 @@ // Setting the control register bit 1 to true to activate the MMA8452 int Accelerometer_MMA8452::activate() { - char mcu_address = (MMA8452_ADDRESS<<1); - char init[2]; - init[0] = CTRL_REG_1; // control register 1 - init[1] = ACTIVE; // set to active + // set control register 1 to active + char init[2] = {CTRL_REG_1,ACTIVE}; - if(m_i2c.write(mcu_address,init,2) == 0) - { - return 0; // return 0 to indicate success - } - else - { - return 1; // crumbs it failed!!! - } - + // perform write and return error code + return m_i2c.write(_writeAddress,init,2); } // 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& CTRL_Reg) -{ +int Accelerometer_MMA8452::get_CTRL_Reg1(int* CTRL_Reg) { - char mcu_address = (MMA8452_ADDRESS<<1); m_i2c.start(); - if( m_i2c.write( mcu_address & 0xFE) == 0) // just good practice to force bit 1 to a '0' by ANDing with 0xFE + if( m_i2c.write(_writeAddress) == 0) { - return 1; // we failed to write the mcu address on the bus to initiate dialogue + return 1; // we failed to write the mcu address on the bus to initiate dialogue } if( m_i2c.write( CTRL_REG_1) == 0) { return 1; // we failed to write 'status' to the chip } m_i2c.start(); - if( m_i2c.write( mcu_address | 0x01) == 0) // this is asking to read the slave mcu address - even though it's a 'write' method!!! Crap API... + if( m_i2c.write(_readAddress) == 0) // this is asking to read the slave mcu address - even though it's a 'write' method!!! Crap API... { return 1; // we failed to request a read from that mcu - this really is just writing the mcu vaule on the bus } - CTRL_Reg = m_i2c.read(0); + *CTRL_Reg = m_i2c.read(0); m_i2c.stop(); return 0; - - -} - - - - } // Setting the control register bit 1 to true to activate the MMA8452 int Accelerometer_MMA8452::standby() { - char mcu_address = (MMA8452_ADDRESS<<1); - char init[2]; - init[0] = CTRL_REG_1; // control register 1 - init[1] = STANDBY; // set to standby + // set control register 1 to standby + char init[2] = {CTRL_REG_1,STANDBY}; - if(m_i2c.write(mcu_address,init,2) == 0) - { - // pc.printf("The initialisation worked"); - return 0; // return 0 to indicate success - } - else - { - // pc.printf("The initialisation failed"); - return 1; // crumbs it failed!!! - } - + // write to the register and return the error code + return m_i2c.write(_writeAddress,init,2); } @@ -126,9 +96,8 @@ // Get real time status of device - it can be STANDBY, WAKE or SLEEP int Accelerometer_MMA8452::get_SystemMode(int& deviceSystemMode) { - char mcu_address = (MMA8452_ADDRESS<<1); m_i2c.start(); - if( m_i2c.write( mcu_address & 0xFE) == 0) // just good practice to force bit 1 to a '0' by ANDing with 0xFE + if( m_i2c.write(_writeAddress) == 0) { return 1; // we failed to write the mcu address on the bus to initiate dialogue } @@ -137,7 +106,7 @@ return 1; // we failed to write 'status' to the chip } m_i2c.start(); - if( m_i2c.write( mcu_address | 0x01) == 0) // this is asking to read the slave mcu address - even though it's a 'write' method!!! Crap API... + if( m_i2c.write(_readAddress) == 0) // this is asking to read the slave mcu address - even though it's a 'write' method!!! Crap API... { return 1; // we failed to request a read from that mcu - this really is just writing the mcu vaule on the bus } @@ -153,18 +122,17 @@ // Get real time status of device - it can be STANDBY, WAKE or SLEEP int Accelerometer_MMA8452::get_Status(int& deviceStatus) { - char mcu_address = (MMA8452_ADDRESS<<1); m_i2c.start(); - if( m_i2c.write( mcu_address & 0xFE) == 0) // just good practice to force bit 1 to a '0' by ANDing with 0xFE + if( m_i2c.write(_writeAddress) == 0) // tell the bus this is a write { return 1; // we failed to write the mcu address on the bus to initiate dialogue } - if( m_i2c.write( STATUS) == 0) + if( m_i2c.write(STATUS) == 0) { return 1; // we failed to write 'status' to the chip } m_i2c.start(); - if( m_i2c.write( mcu_address | 0x01) == 0) // this is asking to read the slave mcu address - even though it's a 'write' method!!! Crap API... + if( m_i2c.write(_readAddress) == 0) // this is asking to read the slave mcu address - even though it's a 'write' method!!! Crap API... { return 1; // we failed to request a read from that mcu - this really is just writing the mcu vaule on the bus } @@ -179,9 +147,8 @@ // Get device ID int Accelerometer_MMA8452::get_DeviceID(int& deviceID) { - char mcu_address = (MMA8452_ADDRESS<<1); m_i2c.start(); - if( m_i2c.write( mcu_address & 0xFE) == 0) // just good practice to force bit 1 to a '0' by ANDing with 0xFE + if( m_i2c.write(_writeAddress) == 0) // just good practice to force bit 1 to a '0' by ANDing with 0xFE { return 1; // we failed to write the mcu address on the bus to initiate dialogue } @@ -190,7 +157,7 @@ return 1; // we failed to write 'who am i' to the chip } m_i2c.start(); - if( m_i2c.write( mcu_address | 0x01) == 0) // this is asking to read the slave mcu address - even though it's a 'write' method!!! Crap API... + if( m_i2c.write(_readAddress) == 0) // this is asking to read the slave mcu address - even though it's a 'write' method!!! Crap API... { return 1; // we failed to request a read from that mcu - this really is just writing the mcu vaule on the bus } @@ -226,6 +193,25 @@ } */ +int Accelerometer_MMA8452::read_raw(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(m_i2c.write(_writeAddress,register_address,1,true) == 0) + { + if(m_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 @@ -233,37 +219,23 @@ // the raw data. //int Accelerometer_MMA8452::read_x(int& xaxisLSB) int Accelerometer_MMA8452::read_x_raw(char *xaxis) -{ - char mcu_address = (MMA8452_ADDRESS<<1); // this is the slave address on the bus we want data from - char xaxis_buffer[2]; // this will contain data from that register - char xaxis_register[1]; - xaxis_register[0] = OUT_X_MSB; // this is the register we want to get data from +{ + // this is the register we want to get data from + char xaxis_register[1] = {OUT_X_MSB}; //signed short s = 0; - if(m_i2c.write(mcu_address,xaxis_register,1,true) == 0) + if(m_i2c.write(_writeAddress,xaxis_register,1,true) == 0) { - if(m_i2c.read(mcu_address,xaxis_buffer,2) == 0) + if(m_i2c.read(_readAddress,xaxis,2)==0) { - //strcpy(xaxis, xaxis_buffer); - memcpy(xaxis, xaxis_buffer, 2); - //xaxis[0] = 0x00; // make sure the array is set to zero - //xaxis[1] = 0x00; - //s = *reinterpret_cast<short*>(&xaxis); - return 0; // great we got the two octets - } - else - { - xaxis[0] = 0x00; // make sure the array is set to zero - xaxis[1] = 0x00; - return 1; // failed to read the 12 bit x value + return 0; } } - else - { - xaxis[0] = 0x00; // make sure the array is set to zero - xaxis[1] = 0x00; - return 1; // failed to write and request the OUT_X_MSB bit - } + + // failure case + xaxis[0] = 0x00; // make sure the array is set to zero + xaxis[1] = 0x00; + return 1; // failed to write and request the OUT_X_MSB bit } @@ -272,38 +244,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) -{ - char mcu_address = (MMA8452_ADDRESS<<1); // this is the slave address on the bus we want data from - char yaxis_buffer[2]; // this will contain data from that register - char yaxis_register[1]; - yaxis_register[0] = OUT_Y_MSB; // this is the register we want to get data from - //signed short s = 0; - - if(m_i2c.write(mcu_address,yaxis_register,1,true) == 0) - { - if(m_i2c.read(mcu_address,yaxis_buffer,2) == 0) - { - //strcpy(yaxis, yaxis_buffer); - memcpy(yaxis, yaxis_buffer, 2); - //yaxis[0] = 0x00; // make sure the array is set to zero - //yaxis[1] = 0x00; - //s = *reinterpret_cast<short*>(&xaxis); - return 0; // great we got the two octets - } - else - { - yaxis[0] = 0x00; // make sure the array is set to zero - yaxis[1] = 0x00; - return 1; // failed to read the 12 bit y value - } - } - else - { - yaxis[0] = 0x00; // make sure the array is set to zero - yaxis[1] = 0x00; - return 1; // failed to write and request the OUT_Y_MSB bit - } +int Accelerometer_MMA8452::read_y_raw(char *yaxis) { + return read_raw(OUT_Y_MSB,yaxis,2); } @@ -315,37 +257,7 @@ int Accelerometer_MMA8452::read_z_raw(char *zaxis) { - char mcu_address = (MMA8452_ADDRESS<<1); // this is the slave address on the bus we want data from - char zaxis_buffer[2]; // this will contain data from that register - char zaxis_register[1]; - zaxis_register[0] = OUT_Z_MSB; // this is the register we want to get data from - //signed short s = 0; - - if(m_i2c.write(mcu_address,zaxis_register,1,true) == 0) - { - //if(m_i2c.read(mcu_address,zaxis_buffer,2) == 0) - if(m_i2c.read(mcu_address,zaxis,2) == 0) - { - //strcpy(yaxis, yaxis_buffer); - //memcpy(zaxis, zaxis_buffer, 2); - //yaxis[0] = 0x00; // make sure the array is set to zero - //yaxis[1] = 0x00; - //s = *reinterpret_cast<short*>(&xaxis); - return 0; // great we got the two octets - } - else - { - zaxis[0] = 0x00; // make sure the array is set to zero - zaxis[1] = 0x00; - return 1; // failed to read the 12 bit y value - } - } - else - { - zaxis[0] = 0x00; // make sure the array is set to zero - zaxis[1] = 0x00; - return 1; // failed to write and request the OUT_Y_MSB bit - } + return read_raw(OUT_Z_MSB,zaxis,2); } @@ -444,13 +356,22 @@ char Accelerometer_MMA8452::read_reg(char addr) { - m_i2c.start(); // Start - m_i2c.write(0x98); // A write to device 0x98 - m_i2c.write(addr); // Register to read - m_i2c.start(); - m_i2c.write(0x99); // Read from device 0x99 - char c = m_i2c.read(0); // Read the data - m_i2c.stop(); + m_i2c.start(); + if( m_i2c.write(_writeAddress) == 0) + { + return 1; // we failed to write the mcu address on the bus to initiate dialogue + } + if( m_i2c.write( addr) == 0) + { + return 1; // we failed to write 'status' to the chip + } + m_i2c.start(); + if( m_i2c.write(_readAddress) == 0) // this is asking to read the slave mcu address - even though it's a 'write' method!!! Crap API... + { + return 1; // we failed to request a read from that mcu - this really is just writing the mcu vaule on the bus + } + char c = m_i2c.read(0); + m_i2c.stop(); return c;