thisone
Fork of MMA8451Q8 by
Revision 0:6149091f755d, committed 2012-10-11
- Comitter:
- emilmont
- Date:
- Thu Oct 11 10:54:16 2012 +0000
- Child:
- 1:d2630136d51e
- Commit message:
- Package samux acceleromiter library;
Changed in this revision
MMA8451Q.cpp | Show annotated file Show diff for this revision Revisions of this file |
MMA8451Q.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MMA8451Q.cpp Thu Oct 11 10:54:16 2012 +0000 @@ -0,0 +1,63 @@ +#include "MMA8451Q.h" + +#define REG_WHO_AM_I 0x0D +#define REG_CTRL_REG_1 0x2A +#define REG_OUT_X_MSB 0x01 +#define REG_OUT_Y_MSB 0x03 +#define REG_OUT_Z_MSB 0x05 + +#define UINT14_MAX 16383 + +MMA8451Q::MMA8451Q(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) { + // activate the peripheral + uint8_t data[2] = {REG_CTRL_REG_1, 0x01}; + write_regs(data, 2); +} + +MMA8451Q::~MMA8451Q() { } + +uint8_t MMA8451Q::getWhoAmI() { + uint8_t who_am_i = 0; + read_regs(REG_WHO_AM_I, &who_am_i, 1); + return who_am_i; +} + +int16_t MMA8451Q::getAccX() { + return getAccAxis(REG_OUT_X_MSB); +} + +int16_t MMA8451Q::getAccY() { + return getAccAxis(REG_OUT_Y_MSB); +} + +int16_t MMA8451Q::getAccZ() { + return getAccAxis(REG_OUT_Z_MSB); +} + +void MMA8451Q::getAccAllAxis(int16_t * res) { + res[0] = getAccX(); + res[1] = getAccY(); + res[2] = getAccZ(); +} + +int16_t MMA8451Q::getAccAxis(uint8_t addr) { + int16_t acc; + uint8_t res[2]; + read_regs(addr, res, 2); + + acc = (res[0] << 6) | (res[1] >> 2); + if (acc > UINT14_MAX/2) + acc -= UINT14_MAX; + + return acc; +} + +void MMA8451Q::read_regs(int addr, uint8_t * data, int len) { + char t[1] = {addr}; + m_i2c.write(m_addr, t, 1, true); + m_i2c.read(m_addr, (char *)data, len); +} + +void MMA8451Q::write_regs(uint8_t * data, int len) { + m_i2c.write(m_addr, (char *)data, len); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MMA8451Q.h Thu Oct 11 10:54:16 2012 +0000 @@ -0,0 +1,70 @@ +#ifndef MMA8451Q_H +#define MMA8451Q_H + +#include "mbed.h" + +//!Library for the MMA8451Q motion sensor. +class MMA8451Q +{ +public: + //!Creates an instance of the class. + /* + * Connect module at I2C address addr using I2C port pins sda and scl. + * MMA8451Q + * \param sda SDA pin + * \param sdl SCL pin + * \param addr addr of the I2C peripheral + */ + MMA8451Q(PinName sda, PinName scl, int addr); + + /* + * Destroys instance. + */ + ~MMA8451Q(); + + /* + * Get the value of the WHO_AM_I register + * + * \returns WHO_AM_I value + */ + uint8_t getWhoAmI(); + + /* + * Get X axis acceleration + * + * \returns X axis acceleration + */ + int16_t getAccX(); + + /* + * Get Y axis acceleration + * + * \returns Y axis acceleration + */ + int16_t getAccY(); + + /* + * Get Z axis acceleration + * + * \returns Z axis acceleration + */ + int16_t getAccZ(); + + /* + * Get XYZ axis acceleration + * + * \param res array where acceleration data will be stored + */ + void getAccAllAxis(int16_t * res); + + I2C m_i2c; + +private: + int m_addr; + void read_regs(int addr, uint8_t * data, int len); + void write_regs(uint8_t * data, int len); + int16_t getAccAxis(uint8_t addr); + +}; + +#endif