has freefall register definitions

Fork of MMA8452Q by Stephen Licht

Committer:
jakebonney10
Date:
Thu Dec 07 14:49:13 2017 +0000
Revision:
1:2b812ae875eb
Parent:
0:b3305e3c9e73
freefall

Who changed what in which revision?

UserRevisionLine numberNew contents of line
slicht 0:b3305e3c9e73 1 // Library for our MMA8452Q 3-axis accelerometer
slicht 0:b3305e3c9e73 2 // Based on the MMA8452Q Arduino Library by Jim Lindblom (SparkFun Electronics)
slicht 0:b3305e3c9e73 3
slicht 0:b3305e3c9e73 4 #include "mbed.h"
slicht 0:b3305e3c9e73 5 #include "MMA8452Q.h"
slicht 0:b3305e3c9e73 6
slicht 0:b3305e3c9e73 7 // Constructor
slicht 0:b3305e3c9e73 8 MMA8452Q::MMA8452Q(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr)
slicht 0:b3305e3c9e73 9 {
slicht 0:b3305e3c9e73 10 // Initialize members
slicht 0:b3305e3c9e73 11 scale = DEFAULT_FSR;
slicht 0:b3305e3c9e73 12 }
slicht 0:b3305e3c9e73 13
slicht 0:b3305e3c9e73 14 // Destructor
slicht 0:b3305e3c9e73 15 MMA8452Q::~MMA8452Q()
slicht 0:b3305e3c9e73 16 {
slicht 0:b3305e3c9e73 17
slicht 0:b3305e3c9e73 18 }
slicht 0:b3305e3c9e73 19
slicht 0:b3305e3c9e73 20 // Initialization
slicht 0:b3305e3c9e73 21 bool MMA8452Q::init()
slicht 0:b3305e3c9e73 22 {
slicht 0:b3305e3c9e73 23 // Check to make sure the chip's ID matches the factory ID
slicht 0:b3305e3c9e73 24 uint8_t c = readRegister(REG_WHO_AM_I);
slicht 0:b3305e3c9e73 25 if( c != FACTORY_ID ) {
slicht 0:b3305e3c9e73 26 return false;
slicht 0:b3305e3c9e73 27 }
slicht 0:b3305e3c9e73 28
slicht 0:b3305e3c9e73 29 // Set default scale and data rate
slicht 0:b3305e3c9e73 30 standby();
slicht 0:b3305e3c9e73 31 setScale(DEFAULT_FSR);
slicht 0:b3305e3c9e73 32 setODR(DEFAULT_ODR);
slicht 0:b3305e3c9e73 33 active();
slicht 0:b3305e3c9e73 34
slicht 0:b3305e3c9e73 35 return true;
slicht 0:b3305e3c9e73 36 }
slicht 0:b3305e3c9e73 37
slicht 0:b3305e3c9e73 38 // Set the full-scale range for x, y, and z data
slicht 0:b3305e3c9e73 39 void MMA8452Q::setScale(uint8_t fsr)
slicht 0:b3305e3c9e73 40 {
slicht 0:b3305e3c9e73 41 uint8_t config = readRegister(REG_XYZ_DATA_CFG);
slicht 0:b3305e3c9e73 42 scale = fsr;
slicht 0:b3305e3c9e73 43 config &= 0xFC; // Mask out FSR bits
slicht 0:b3305e3c9e73 44 fsr = fsr >> 2; // Trick to translate scale to FSR bits
slicht 0:b3305e3c9e73 45 fsr &= 0x03; // Mask out acceptable FSRs
slicht 0:b3305e3c9e73 46 config |= fsr; // Write FSR bits to config byte
slicht 0:b3305e3c9e73 47 writeRegister(REG_XYZ_DATA_CFG, config); // Write config back to register
slicht 0:b3305e3c9e73 48 }
slicht 0:b3305e3c9e73 49
slicht 0:b3305e3c9e73 50 // Set the Output Data Rate
slicht 0:b3305e3c9e73 51 void MMA8452Q::setODR(uint8_t odr)
slicht 0:b3305e3c9e73 52 {
slicht 0:b3305e3c9e73 53 uint8_t ctrl = readRegister(REG_CTRL_REG1);
slicht 0:b3305e3c9e73 54 ctrl &= 0xCF; // Mask out data rate bits
slicht 0:b3305e3c9e73 55 odr &= 0x07; // Mask out acceptable ODRs
slicht 0:b3305e3c9e73 56 ctrl |= (odr << 3); // Write ODR bits to control byte
slicht 0:b3305e3c9e73 57 writeRegister(REG_CTRL_REG1, ctrl); // Write control back to register
slicht 0:b3305e3c9e73 58 }
slicht 0:b3305e3c9e73 59
slicht 0:b3305e3c9e73 60 // Set accelerometer into standby mode
slicht 0:b3305e3c9e73 61 void MMA8452Q::standby()
slicht 0:b3305e3c9e73 62 {
slicht 0:b3305e3c9e73 63 uint8_t c = readRegister(REG_CTRL_REG1);
slicht 0:b3305e3c9e73 64 c &= ~(0x01); // Clear bit 0 to go into standby
slicht 0:b3305e3c9e73 65 writeRegister(REG_CTRL_REG1, c); // Write back to CONTROL register
slicht 0:b3305e3c9e73 66 }
slicht 0:b3305e3c9e73 67
slicht 0:b3305e3c9e73 68 // Set accelerometer into active mode
slicht 0:b3305e3c9e73 69 void MMA8452Q::active()
slicht 0:b3305e3c9e73 70 {
slicht 0:b3305e3c9e73 71 uint8_t c = readRegister(REG_CTRL_REG1);
slicht 0:b3305e3c9e73 72 c |= 0x01; // Set bit 0 to go into active mode
slicht 0:b3305e3c9e73 73 writeRegister(REG_CTRL_REG1, c); // Write back to CONTROL register
slicht 0:b3305e3c9e73 74 }
slicht 0:b3305e3c9e73 75
slicht 0:b3305e3c9e73 76 // Read X registers
slicht 0:b3305e3c9e73 77 float MMA8452Q::readX()
slicht 0:b3305e3c9e73 78 {
slicht 0:b3305e3c9e73 79 int16_t x = 0;
slicht 0:b3305e3c9e73 80 float cx = 0;
slicht 0:b3305e3c9e73 81
slicht 0:b3305e3c9e73 82 // Read MSB and LSB from X registers
slicht 0:b3305e3c9e73 83 x = readRegister(OUT_X_MSB);
slicht 0:b3305e3c9e73 84 x = x << 8;
slicht 0:b3305e3c9e73 85 x |= readRegister(OUT_X_LSB);
slicht 0:b3305e3c9e73 86 x = x >> 4;
slicht 0:b3305e3c9e73 87
slicht 0:b3305e3c9e73 88 // Calculate human readable X
slicht 0:b3305e3c9e73 89 cx = (float)x / (float)2048 * (float)(scale);
slicht 0:b3305e3c9e73 90
slicht 0:b3305e3c9e73 91 return cx;
slicht 0:b3305e3c9e73 92 }
slicht 0:b3305e3c9e73 93
slicht 0:b3305e3c9e73 94 // Read Y registers
slicht 0:b3305e3c9e73 95 float MMA8452Q::readY()
slicht 0:b3305e3c9e73 96 {
slicht 0:b3305e3c9e73 97 int16_t y = 0;
slicht 0:b3305e3c9e73 98 float cy = 0;
slicht 0:b3305e3c9e73 99
slicht 0:b3305e3c9e73 100 // Read MSB and LSB from Y registers
slicht 0:b3305e3c9e73 101 y = readRegister(OUT_Y_MSB);
slicht 0:b3305e3c9e73 102 y = y << 8;
slicht 0:b3305e3c9e73 103 y |= readRegister(OUT_Y_LSB);
slicht 0:b3305e3c9e73 104 y = y >> 4;
slicht 0:b3305e3c9e73 105
slicht 0:b3305e3c9e73 106 // Calculate human readable Y
slicht 0:b3305e3c9e73 107 cy = (float)y / (float)2048 * (float)(scale);
slicht 0:b3305e3c9e73 108
slicht 0:b3305e3c9e73 109 return cy;
slicht 0:b3305e3c9e73 110 }
slicht 0:b3305e3c9e73 111
slicht 0:b3305e3c9e73 112 // Read Z registers
slicht 0:b3305e3c9e73 113 float MMA8452Q::readZ()
slicht 0:b3305e3c9e73 114 {
slicht 0:b3305e3c9e73 115 int16_t z = 0;
slicht 0:b3305e3c9e73 116 float cz = 0;
slicht 0:b3305e3c9e73 117
slicht 0:b3305e3c9e73 118 // Read MSB and LSB from Z registers
slicht 0:b3305e3c9e73 119 z = readRegister(OUT_Z_MSB);
slicht 0:b3305e3c9e73 120 z = z << 8;
slicht 0:b3305e3c9e73 121 z |= readRegister(OUT_Z_LSB);
slicht 0:b3305e3c9e73 122 z = z >> 4;
slicht 0:b3305e3c9e73 123
slicht 0:b3305e3c9e73 124 // Calculate human readable Z
slicht 0:b3305e3c9e73 125 cz = (float)z / (float)2048 * (float)(scale);
slicht 0:b3305e3c9e73 126
slicht 0:b3305e3c9e73 127 return cz;
slicht 0:b3305e3c9e73 128 }
slicht 0:b3305e3c9e73 129
slicht 0:b3305e3c9e73 130 // Raw read register over I2C
slicht 0:b3305e3c9e73 131 uint8_t MMA8452Q::readRegister(uint8_t reg)
slicht 0:b3305e3c9e73 132 {
slicht 0:b3305e3c9e73 133 uint8_t dev_addr;
slicht 0:b3305e3c9e73 134 uint8_t data;
slicht 0:b3305e3c9e73 135
slicht 0:b3305e3c9e73 136 // I2C address are bits [6..1] in the transmitted byte, so we shift by 1
slicht 0:b3305e3c9e73 137 dev_addr = m_addr << 1;
slicht 0:b3305e3c9e73 138
slicht 0:b3305e3c9e73 139 // Write device address with a trailing 'write' bit
slicht 0:b3305e3c9e73 140 m_i2c.start();
slicht 0:b3305e3c9e73 141 m_i2c.write(dev_addr & 0xFE);
slicht 0:b3305e3c9e73 142
slicht 0:b3305e3c9e73 143 // Write register address
slicht 0:b3305e3c9e73 144 m_i2c.write(reg);
slicht 0:b3305e3c9e73 145
slicht 0:b3305e3c9e73 146 // Write a start bit and device address with a trailing 'read' bit
slicht 0:b3305e3c9e73 147 m_i2c.start();
slicht 0:b3305e3c9e73 148 m_i2c.write(dev_addr | 0x01);
slicht 0:b3305e3c9e73 149
slicht 0:b3305e3c9e73 150 // Read single byte from I2C device
slicht 0:b3305e3c9e73 151 data = m_i2c.read(0);
slicht 0:b3305e3c9e73 152 m_i2c.stop();
slicht 0:b3305e3c9e73 153
slicht 0:b3305e3c9e73 154 return data;
slicht 0:b3305e3c9e73 155 }
slicht 0:b3305e3c9e73 156
slicht 0:b3305e3c9e73 157 // Raw write data to a register over I2C
slicht 0:b3305e3c9e73 158 void MMA8452Q::writeRegister(uint8_t reg, uint8_t data)
slicht 0:b3305e3c9e73 159 {
slicht 0:b3305e3c9e73 160 uint8_t dev_addr;
slicht 0:b3305e3c9e73 161
slicht 0:b3305e3c9e73 162 // I2C address are bits [6..1] in the transmitted byte, so we shift by 1
slicht 0:b3305e3c9e73 163 dev_addr = m_addr << 1;
slicht 0:b3305e3c9e73 164
slicht 0:b3305e3c9e73 165 // Write device address with a trailing 'write' bit
slicht 0:b3305e3c9e73 166 m_i2c.start();
slicht 0:b3305e3c9e73 167 m_i2c.write(dev_addr & 0xFE);
slicht 0:b3305e3c9e73 168
slicht 0:b3305e3c9e73 169 // Write register address
slicht 0:b3305e3c9e73 170 m_i2c.write(reg);
slicht 0:b3305e3c9e73 171
slicht 0:b3305e3c9e73 172 // Write the data to the register
slicht 0:b3305e3c9e73 173 m_i2c.write(data);
slicht 0:b3305e3c9e73 174 m_i2c.stop();
slicht 0:b3305e3c9e73 175 }