Guide
1/12/2018 mbed Starter Kit Experiment Guide - learn.sparkfun.com
https://learn.sparkfun.com/tutorials/mbed-starter-kit-experiment-guide/all 26/65
// Library for our MMA8452Q 3-axis accelerometer
// Based on the MMA8452Q Arduino Library by Jim Lindblom (SparkFun Electronics)
#include "mbed.h"
#include "MMA8452Q.h"
// Constructor
MMA8452Q::MMA8452Q(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr)
{
// Initialize members
scale = DEFAULT_FSR;
}
// Destructor
MMA8452Q::~MMA8452Q()
{
}
// Initialization
bool MMA8452Q::init()
{
// Check to make sure the chip's ID matches the factory ID
uint8_t c = readRegister(REG_WHO_AM_I);
if( c != FACTORY_ID ) {
return false;
}
// Set default scale and data rate
standby();
setScale(DEFAULT_FSR);
setODR(DEFAULT_ODR);
active();
return true;
}
// Set the full-scale range for x, y, and z data
void MMA8452Q::setScale(uint8_t fsr)
{
uint8_t config = readRegister(REG_XYZ_DATA_CFG);
scale = fsr;
config &= 0xFC; // Mask out FSR bits
fsr = fsr >> 2; // Trick to translate scale to FSR bits
fsr &= 0x03; // Mask out acceptable FSRs
config |= fsr; // Write FSR bits to config byte
writeRegister(REG_XYZ_DATA_CFG, config); // Write config back to register
}
// Set the Output Data Rate
void MMA8452Q::setODR(uint8_t odr)
{
uint8_t ctrl = readRegister(REG_CTRL_REG1);
ctrl &= 0xCF; // Mask out data rate bits
odr &= 0x07; // Mask out acceptable ODRs
ctrl |= (odr << 3); // Write ODR bits to control byte
writeRegister(REG_CTRL_REG1, ctrl); // Write control back to register
}
// Set accelerometer into standby mode
void MMA8452Q::standby()
{
uint8_t c = readRegister(REG_CTRL_REG1);
c &= ~(0x01); // Clear bit 0 to go into standby
writeRegister(REG_CTRL_REG1, c); // Write back to CONTROL register
}
// Set accelerometer into active mode
void MMA8452Q::active()
{
uint8_t c = readRegister(REG_CTRL_REG1);
c |= 0x01; // Set bit 0 to go into active mode
writeRegister(REG_CTRL_REG1, c); // Write back to CONTROL register
}
// Read X registers
float MMA8452Q::readX()
{
int16_t x = 0;
float cx = 0;