dfsd

Committer:
lukeamlicke
Date:
Wed Apr 01 15:03:43 2020 +0000
Revision:
0:6285eaac7766
ssss

Who changed what in which revision?

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