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