enhancing Multitech's library for some accelerometer

Fork of MMA845x by Multi-Hackers

Committer:
amateusz
Date:
Thu Jul 05 15:05:20 2018 +0000
Revision:
18:2316ca98e599
Parent:
16:eefd7fc1b19f
FIX setting LowPower mode <- wrong bitmask was setting Fast mode instead, SIC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:9d1e3a344e4f 1 /**
sam_grove 0:9d1e3a344e4f 2 * @file MMA845x.cpp
falingtrea 1:41af2b3eefb5 3 * @brief Device driver - MMA845X 3-axis accelerometer IC W/RTOS support
falingtrea 1:41af2b3eefb5 4 * @author Tim Barr
sam_grove 0:9d1e3a344e4f 5 * @version 1.0
sam_grove 0:9d1e3a344e4f 6 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8451Q.pdf
sam_grove 0:9d1e3a344e4f 7 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8452Q.pdf
sam_grove 0:9d1e3a344e4f 8 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8453Q.pdf
sam_grove 0:9d1e3a344e4f 9 *
falingtrea 1:41af2b3eefb5 10 * Copyright (c) 2015
sam_grove 0:9d1e3a344e4f 11 *
sam_grove 0:9d1e3a344e4f 12 * Licensed under the Apache License, Version 2.0 (the "License");
sam_grove 0:9d1e3a344e4f 13 * you may not use this file except in compliance with the License.
sam_grove 0:9d1e3a344e4f 14 * You may obtain a copy of the License at
sam_grove 0:9d1e3a344e4f 15 *
sam_grove 0:9d1e3a344e4f 16 * http://www.apache.org/licenses/LICENSE-2.0
sam_grove 0:9d1e3a344e4f 17 *
sam_grove 0:9d1e3a344e4f 18 * Unless required by applicable law or agreed to in writing, software
sam_grove 0:9d1e3a344e4f 19 * distributed under the License is distributed on an "AS IS" BASIS,
sam_grove 0:9d1e3a344e4f 20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sam_grove 0:9d1e3a344e4f 21 * See the License for the specific language governing permissions and
sam_grove 0:9d1e3a344e4f 22 * limitations under the License.
falingtrea 1:41af2b3eefb5 23 *
falingtrea 1:41af2b3eefb5 24 * 5/5/2015 Forked from https://developer.mbed.org/users/sam_grove/code/MMA845x/
falingtrea 1:41af2b3eefb5 25 *
falingtrea 1:41af2b3eefb5 26 * 6/20/2015 TAB Added setup functions and polling data capability. Also added RTOS calls
falingtrea 1:41af2b3eefb5 27 * TODO Still need to add interrupt support for other Accelerometer mode support
sam_grove 0:9d1e3a344e4f 28 */
mfiore 2:70df6adad015 29
sam_grove 0:9d1e3a344e4f 30 #include "MMA845x.h"
falingtrea 1:41af2b3eefb5 31 #include "mbed_debug.h"
falingtrea 1:41af2b3eefb5 32 #include "rtos.h"
mfiore 2:70df6adad015 33
falingtrea 1:41af2b3eefb5 34 MMA845x::MMA845x(I2C &i2c, SA0 const i2c_addr, InterruptIn* int1, InterruptIn* int2)
sam_grove 0:9d1e3a344e4f 35 {
sam_grove 0:9d1e3a344e4f 36 _i2c = &i2c;
falingtrea 1:41af2b3eefb5 37 _int1 = int1;
falingtrea 1:41af2b3eefb5 38 _int2 = int2;
mfiore 2:70df6adad015 39
falingtrea 1:41af2b3eefb5 40 _i2c_addr = (0x1c | i2c_addr) << 1;
mfiore 2:70df6adad015 41
sam_grove 0:9d1e3a344e4f 42 MMA845x::init();
sam_grove 0:9d1e3a344e4f 43
sam_grove 0:9d1e3a344e4f 44 return;
sam_grove 0:9d1e3a344e4f 45 }
sam_grove 0:9d1e3a344e4f 46
falingtrea 1:41af2b3eefb5 47 uint8_t MMA845x::init(void)
sam_grove 0:9d1e3a344e4f 48 {
falingtrea 1:41af2b3eefb5 49 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 50 uint8_t i = 0;
falingtrea 1:41af2b3eefb5 51 char reg_val[1];
mfiore 2:70df6adad015 52
falingtrea 1:41af2b3eefb5 53 _who_am_i = 0x00;
mfiore 2:70df6adad015 54
falingtrea 1:41af2b3eefb5 55 // Reset all registers to POR values
falingtrea 1:41af2b3eefb5 56 result = MMA845x::writeRegister(CTRL_REG2, 0xFF); //REG 0x2B
mfiore 2:70df6adad015 57 if (result == 0) {
falingtrea 1:41af2b3eefb5 58
mfiore 2:70df6adad015 59 do {
mfiore 2:70df6adad015 60 // wait for the reset bit to clear. readRegister may error out so we re-try 10 times
mfiore 2:70df6adad015 61 osDelay(200);
mfiore 2:70df6adad015 62 reg_val[0] = 0x40;
mfiore 2:70df6adad015 63 result = MMA845x::readRegister(CTRL_REG2,1,reg_val);
mfiore 2:70df6adad015 64 reg_val[0] = reg_val[0] & 0x40;
mfiore 2:70df6adad015 65 i++;
mfiore 2:70df6adad015 66 } while(((reg_val[0] != 0)||( result != 0)) && (i<=10));
falingtrea 1:41af2b3eefb5 67 }
falingtrea 1:41af2b3eefb5 68
mfiore 2:70df6adad015 69 if (result == 0) {
falingtrea 1:41af2b3eefb5 70 result = MMA845x::readRegister(WHO_AM_I,1,reg_val);
falingtrea 1:41af2b3eefb5 71 }
falingtrea 1:41af2b3eefb5 72
mfiore 2:70df6adad015 73 switch (reg_val[0]) {
mfiore 2:70df6adad015 74 case MMA8451:
mfiore 2:70df6adad015 75 case MMA8452:
mfiore 2:70df6adad015 76 case MMA8453:
mfiore 2:70df6adad015 77 _who_am_i= reg_val[0];
mfiore 2:70df6adad015 78 if ((_int1 == NULL) && (_int2 == NULL))
mfiore 2:70df6adad015 79 _polling_mode = true;
mfiore 2:70df6adad015 80 else _polling_mode = false;
mfiore 2:70df6adad015 81 break;
mfiore 2:70df6adad015 82 default:
mfiore 2:70df6adad015 83 debug ("Device not supported by this library!\n\r");
mfiore 2:70df6adad015 84 result = 1;
falingtrea 1:41af2b3eefb5 85 }
falingtrea 1:41af2b3eefb5 86
mfiore 2:70df6adad015 87 if(result != 0) {
falingtrea 1:41af2b3eefb5 88 debug("MMA845x:init failed\n\r");
falingtrea 1:41af2b3eefb5 89 }
mfiore 2:70df6adad015 90
falingtrea 1:41af2b3eefb5 91
mfiore 2:70df6adad015 92 return result;
falingtrea 1:41af2b3eefb5 93 }
falingtrea 1:41af2b3eefb5 94
falingtrea 1:41af2b3eefb5 95 uint8_t MMA845x::setCommonParameters(RANGE range, RESOLUTION resolution, LOW_NOISE lo_noise,
mfiore 2:70df6adad015 96 DATA_RATE data_rate, OVERSAMPLE_MODE os_mode, HPF_MODE hpf_mode) const
falingtrea 1:41af2b3eefb5 97 {
falingtrea 1:41af2b3eefb5 98 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 99 char datain[1];
falingtrea 1:41af2b3eefb5 100 uint8_t dataout = 0;
falingtrea 1:41af2b3eefb5 101
falingtrea 1:41af2b3eefb5 102 result |= MMA845x::readRegister(SYSMOD,1,datain); // Make sure MMA845x is in Stand-By mode
mfiore 2:70df6adad015 103 if ((datain[0] & 0x03) != 0 ) {
mfiore 2:70df6adad015 104 debug ("MMA845x not in STAND BY mode\n\f");
falingtrea 1:41af2b3eefb5 105 debug("MMA845x:setCommonParameters failed\n\r");
falingtrea 1:41af2b3eefb5 106 result = 1;
falingtrea 1:41af2b3eefb5 107 return result;
falingtrea 1:41af2b3eefb5 108 }
falingtrea 1:41af2b3eefb5 109
falingtrea 1:41af2b3eefb5 110 result |= MMA845x::readRegister(CTRL_REG1, 1, datain);
amateusz 18:2316ca98e599 111 dataout = (datain[0] & 0xC1) | resolution | lo_noise | data_rate; // 0b ‭0010 1010
falingtrea 1:41af2b3eefb5 112 result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set resolution, Low Noise mode, and data rate
falingtrea 1:41af2b3eefb5 113
falingtrea 1:41af2b3eefb5 114 result |= MMA845x::readRegister(CTRL_REG2,1, datain);
amateusz 9:645f94e7e1d5 115 dataout = (datain[0] & 0xFC) | os_mode;
amateusz 9:645f94e7e1d5 116 result |= MMA845x::writeRegister(CTRL_REG2, dataout); // Set Oversample mode for Active State
falingtrea 1:41af2b3eefb5 117
falingtrea 1:41af2b3eefb5 118 result |= MMA845x::readRegister(XYZ_DATA_CFG,1, datain);
falingtrea 1:41af2b3eefb5 119 dataout = range | hpf_mode;
falingtrea 1:41af2b3eefb5 120 result |= MMA845x::writeRegister(XYZ_DATA_CFG, dataout); //Set HPF mode and range
falingtrea 1:41af2b3eefb5 121
falingtrea 1:41af2b3eefb5 122 // result |= MMA845x::readRegister(HP_FILTER_CUTOFF,1, datain);
falingtrea 1:41af2b3eefb5 123 // result |= MMA845x::writeRegister(HP_FILTER_CUTOFF, dataout); //REG 0xF HPF settings
falingtrea 1:41af2b3eefb5 124
mfiore 2:70df6adad015 125 if(result != 0) {
falingtrea 1:41af2b3eefb5 126 debug("MMA845x:setParameters failed\n\r");
falingtrea 1:41af2b3eefb5 127 }
mfiore 2:70df6adad015 128
mfiore 2:70df6adad015 129 return result;
mfiore 2:70df6adad015 130
falingtrea 1:41af2b3eefb5 131 }
falingtrea 1:41af2b3eefb5 132
falingtrea 1:41af2b3eefb5 133 uint8_t MMA845x::enableMotionDetect(void) const
falingtrea 1:41af2b3eefb5 134 {
falingtrea 1:41af2b3eefb5 135 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 136 return result;
mfiore 2:70df6adad015 137 }
mfiore 2:70df6adad015 138
amateusz 14:683234dfe179 139 uint8_t MMA845x::enablePulseDetect(char x_threshold , char y_threshold, char z_threshold, char window, char latency, INTERRUPT_PIN pin) const
falingtrea 1:41af2b3eefb5 140 {
falingtrea 1:41af2b3eefb5 141 uint8_t result = 0;
amateusz 14:683234dfe179 142 result |= MMA845x::writeRegister(MMA845x::PULSE_CFG, (0b01000000 | (x_threshold?0b1:0) | (y_threshold?0b100:0) | (z_threshold?0b10000:0))); // enable tap latch & single taps on every axis
amateusz 14:683234dfe179 143 MMA845x::writeRegister(MMA845x::PULSE_THSX, x_threshold & 127); // some thresholds
amateusz 14:683234dfe179 144 MMA845x::writeRegister(MMA845x::PULSE_THSY, y_threshold & 127);
amateusz 14:683234dfe179 145 MMA845x::writeRegister(MMA845x::PULSE_THSZ, z_threshold & 127);
amateusz 14:683234dfe179 146 MMA845x::writeRegister(MMA845x::PULSE_TMLT, window); // time window. unit of 5ms
amateusz 14:683234dfe179 147 MMA845x::writeRegister(MMA845x::PULSE_LTCY, latency); // set latency to 300..ms ?..?
amateusz 14:683234dfe179 148 MMA845x::writeRegister(MMA845x::HP_FILTER_CUTOFF, 0b00110000); // by-pass High pass filter for pulse processing // for good meausure (??)
amateusz 14:683234dfe179 149
amateusz 16:eefd7fc1b19f 150 result |= configInterrupt(INT_PULSE, pin);
amateusz 14:683234dfe179 151
falingtrea 1:41af2b3eefb5 152 return result;
mfiore 2:70df6adad015 153 }
falingtrea 1:41af2b3eefb5 154
amateusz 12:92294b5ca1c1 155 uint8_t MMA845x::enableOrientationDetect(uint8_t debounce_steps, INTERRUPT_PIN pin) const
falingtrea 1:41af2b3eefb5 156 {
falingtrea 1:41af2b3eefb5 157 uint8_t result = 0;
amateusz 10:89dd748f9211 158 // if(_who_am_i != MMA8451) {
amateusz 10:89dd748f9211 159 // debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
amateusz 10:89dd748f9211 160 // result = 1;
amateusz 10:89dd748f9211 161 // }
amateusz 10:89dd748f9211 162 // ↑ not true. MMA8451 is the only one supporting variable trip-angle values
amateusz 12:92294b5ca1c1 163
amateusz 12:92294b5ca1c1 164 MMA845x::writeRegister(PL_COUNT, debounce_steps);
amateusz 12:92294b5ca1c1 165 MMA845x::writeRegister(PL_CFG, 0b11000000); // enable and set debounce counter to clear out of {clear, decrement}
amateusz 12:92294b5ca1c1 166
amateusz 16:eefd7fc1b19f 167 result |= configInterrupt(INT_LNDPRT, pin);
mfiore 2:70df6adad015 168
falingtrea 1:41af2b3eefb5 169 return result;
falingtrea 1:41af2b3eefb5 170 }
falingtrea 1:41af2b3eefb5 171
falingtrea 1:41af2b3eefb5 172 uint8_t MMA845x::enableTransientDetect(void) const
falingtrea 1:41af2b3eefb5 173 {
falingtrea 1:41af2b3eefb5 174 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 175 return result;
mfiore 2:70df6adad015 176 }
mfiore 2:70df6adad015 177
falingtrea 1:41af2b3eefb5 178 uint8_t MMA845x::enableAutoSleep(void) const
falingtrea 1:41af2b3eefb5 179 {
falingtrea 1:41af2b3eefb5 180 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 181 return result;
mfiore 2:70df6adad015 182 }
falingtrea 1:41af2b3eefb5 183
falingtrea 1:41af2b3eefb5 184 uint8_t MMA845x::enableFIFO(void) const
falingtrea 1:41af2b3eefb5 185 {
falingtrea 1:41af2b3eefb5 186 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 187
mfiore 2:70df6adad015 188 if(_who_am_i != MMA8451) {
falingtrea 1:41af2b3eefb5 189 debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
falingtrea 1:41af2b3eefb5 190 result = 1;
falingtrea 1:41af2b3eefb5 191 }
mfiore 2:70df6adad015 192
falingtrea 1:41af2b3eefb5 193 return result;
sam_grove 0:9d1e3a344e4f 194 }
sam_grove 0:9d1e3a344e4f 195
amateusz 13:77a8994b3bb2 196 uint8_t MMA845x::configInterrupt(INTERRUPT_CFG_EN_SOURCE function, INTERRUPT_PIN pin) const
amateusz 13:77a8994b3bb2 197 {
amateusz 13:77a8994b3bb2 198 uint8_t result = 0;
amateusz 13:77a8994b3bb2 199 char datain[1];
amateusz 13:77a8994b3bb2 200 uint8_t dataout;
amateusz 13:77a8994b3bb2 201
amateusz 13:77a8994b3bb2 202 if (pin != INT_NONE) {
amateusz 13:77a8994b3bb2 203 // enable interrupt
amateusz 13:77a8994b3bb2 204 result |= MMA845x::readRegister(CTRL_REG4, 1, datain);
amateusz 13:77a8994b3bb2 205 dataout = (datain[0] | function);
amateusz 13:77a8994b3bb2 206 result |= MMA845x::writeRegister(CTRL_REG4, dataout);
amateusz 13:77a8994b3bb2 207
amateusz 13:77a8994b3bb2 208 //set pin for the interrupt
amateusz 13:77a8994b3bb2 209 result |= MMA845x::readRegister(CTRL_REG5, 1, datain);
amateusz 13:77a8994b3bb2 210 if (pin == 0) dataout = (datain[0] & ~function); // clearing bit
amateusz 13:77a8994b3bb2 211 else dataout = (datain[0] | function); // setting bit
amateusz 13:77a8994b3bb2 212 } else {
amateusz 13:77a8994b3bb2 213 // disable interrupt
amateusz 13:77a8994b3bb2 214 result |= MMA845x::readRegister(CTRL_REG4, 1, datain);
amateusz 13:77a8994b3bb2 215 dataout = (datain[0] & ~function);
amateusz 13:77a8994b3bb2 216 result |= MMA845x::writeRegister(CTRL_REG4, dataout);
amateusz 13:77a8994b3bb2 217 }
amateusz 13:77a8994b3bb2 218 return result;
amateusz 13:77a8994b3bb2 219 }
amateusz 13:77a8994b3bb2 220
falingtrea 1:41af2b3eefb5 221 uint8_t MMA845x::activeMode(void) const
falingtrea 1:41af2b3eefb5 222 {
falingtrea 1:41af2b3eefb5 223 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 224 char datain[1];
falingtrea 1:41af2b3eefb5 225 uint8_t dataout;
falingtrea 1:41af2b3eefb5 226
falingtrea 1:41af2b3eefb5 227 result |= MMA845x::readRegister(CTRL_REG1,1, datain);
falingtrea 1:41af2b3eefb5 228 dataout = (datain[0] & 0xFE) | 0x01 ;
falingtrea 1:41af2b3eefb5 229 result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set to active mode
falingtrea 1:41af2b3eefb5 230
falingtrea 1:41af2b3eefb5 231 return result;
mfiore 2:70df6adad015 232 }
falingtrea 1:41af2b3eefb5 233 uint8_t MMA845x::standbyMode(void) const
falingtrea 1:41af2b3eefb5 234 {
falingtrea 1:41af2b3eefb5 235 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 236 char datain[1];
falingtrea 1:41af2b3eefb5 237 uint8_t dataout;
falingtrea 1:41af2b3eefb5 238
falingtrea 1:41af2b3eefb5 239 result |= MMA845x::readRegister(CTRL_REG1,1, datain);
falingtrea 1:41af2b3eefb5 240 dataout = (datain[0] & 0xFE);
falingtrea 1:41af2b3eefb5 241 result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set to standby mode
falingtrea 1:41af2b3eefb5 242
falingtrea 1:41af2b3eefb5 243 return result;
mfiore 2:70df6adad015 244 }
falingtrea 1:41af2b3eefb5 245
falingtrea 1:41af2b3eefb5 246 uint8_t MMA845x::getStatus(void) const
sam_grove 0:9d1e3a344e4f 247 {
falingtrea 1:41af2b3eefb5 248 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 249 char datain[1];
falingtrea 1:41af2b3eefb5 250 uint8_t dataout;
falingtrea 1:41af2b3eefb5 251
falingtrea 1:41af2b3eefb5 252 result = MMA845x::readRegister(STATUS,1, datain);
falingtrea 1:41af2b3eefb5 253
falingtrea 1:41af2b3eefb5 254 if (result != 0)
mfiore 2:70df6adad015 255 dataout = result;
falingtrea 1:41af2b3eefb5 256 else
mfiore 2:70df6adad015 257 dataout = datain[0];
falingtrea 1:41af2b3eefb5 258
falingtrea 1:41af2b3eefb5 259 return dataout;
mfiore 2:70df6adad015 260 }
falingtrea 1:41af2b3eefb5 261
falingtrea 1:41af2b3eefb5 262 int16_t MMA845x::getX(void)
falingtrea 1:41af2b3eefb5 263 {
falingtrea 1:41af2b3eefb5 264 char datain[2];
falingtrea 1:41af2b3eefb5 265
mfiore 2:70df6adad015 266 if (_polling_mode) {
falingtrea 1:41af2b3eefb5 267 MMA845x::readRegister(OUT_X_MSB,2, datain);
falingtrea 1:41af2b3eefb5 268 _data._x = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 269 _data._x /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 270 }
mfiore 2:70df6adad015 271 return _data._x;
falingtrea 1:41af2b3eefb5 272
sam_grove 0:9d1e3a344e4f 273 }
mfiore 2:70df6adad015 274
falingtrea 1:41af2b3eefb5 275 int16_t MMA845x::getY(void)
sam_grove 0:9d1e3a344e4f 276 {
falingtrea 1:41af2b3eefb5 277 char datain[2];
falingtrea 1:41af2b3eefb5 278
mfiore 2:70df6adad015 279 if (_polling_mode) {
falingtrea 1:41af2b3eefb5 280 MMA845x::readRegister(OUT_Y_MSB,2, datain);
falingtrea 1:41af2b3eefb5 281 _data._y = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 282 _data._y /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 283 }
mfiore 2:70df6adad015 284 return _data._y;
sam_grove 0:9d1e3a344e4f 285 }
sam_grove 0:9d1e3a344e4f 286
falingtrea 1:41af2b3eefb5 287 int16_t MMA845x::getZ(void)
sam_grove 0:9d1e3a344e4f 288 {
falingtrea 1:41af2b3eefb5 289 char datain[2];
falingtrea 1:41af2b3eefb5 290
mfiore 2:70df6adad015 291 if (_polling_mode) {
falingtrea 1:41af2b3eefb5 292 MMA845x::readRegister(OUT_Z_MSB,2, datain);
falingtrea 1:41af2b3eefb5 293 _data._z = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 294 _data._z /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 295 }
falingtrea 1:41af2b3eefb5 296
sam_grove 0:9d1e3a344e4f 297 return _data._z;
sam_grove 0:9d1e3a344e4f 298 }
mfiore 2:70df6adad015 299
falingtrea 1:41af2b3eefb5 300 MMA845x_DATA MMA845x::getXYZ(void)
sam_grove 0:9d1e3a344e4f 301 {
falingtrea 1:41af2b3eefb5 302 char datain[6];
falingtrea 1:41af2b3eefb5 303
mfiore 2:70df6adad015 304 if (_polling_mode) {
falingtrea 1:41af2b3eefb5 305 MMA845x::readRegister(OUT_X_MSB,6, datain); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 306 _data._x = ((datain[0] << 8) | datain[1]); /* need to shift first to preserve sign */
falingtrea 1:41af2b3eefb5 307 _data._x /= 4; /* then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 308 _data._y = ((datain[2] << 8) | datain[3]);
falingtrea 1:41af2b3eefb5 309 _data._y /= 4;
falingtrea 1:41af2b3eefb5 310 _data._z = ((datain[4] << 8) | datain[5]);
falingtrea 1:41af2b3eefb5 311 _data._z /= 4;
falingtrea 1:41af2b3eefb5 312 }
falingtrea 1:41af2b3eefb5 313
sam_grove 0:9d1e3a344e4f 314 return _data;
sam_grove 0:9d1e3a344e4f 315 }
sam_grove 0:9d1e3a344e4f 316
falingtrea 1:41af2b3eefb5 317 char MMA845x::getWhoAmI(void) const
falingtrea 1:41af2b3eefb5 318 {
falingtrea 1:41af2b3eefb5 319 return _who_am_i;
falingtrea 1:41af2b3eefb5 320 }
falingtrea 1:41af2b3eefb5 321
falingtrea 1:41af2b3eefb5 322 uint8_t MMA845x::writeRegister(uint8_t const reg, uint8_t const data) const
sam_grove 0:9d1e3a344e4f 323 {
sam_grove 0:9d1e3a344e4f 324 char buf[2] = {reg, data};
sam_grove 0:9d1e3a344e4f 325 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 326
falingtrea 1:41af2b3eefb5 327 buf[0] = reg;
falingtrea 1:41af2b3eefb5 328 buf[1] = data;
mfiore 2:70df6adad015 329
falingtrea 1:41af2b3eefb5 330 result |= _i2c->write(_i2c_addr, buf, 2);
mfiore 2:70df6adad015 331
Evan Hosseini 5:d662a7003b6f 332 if (result != 0) {
Evan Hosseini 5:d662a7003b6f 333 debug("MMA845x::writeRegister failed r-%d\n\r",result);
sam_grove 0:9d1e3a344e4f 334 }
mfiore 2:70df6adad015 335
falingtrea 1:41af2b3eefb5 336 return result;
sam_grove 0:9d1e3a344e4f 337 }
sam_grove 0:9d1e3a344e4f 338
falingtrea 1:41af2b3eefb5 339 uint8_t MMA845x::readRegister(uint8_t const reg, uint8_t count, char* data) const
sam_grove 0:9d1e3a344e4f 340 {
falingtrea 1:41af2b3eefb5 341 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 342 char reg_out[1];
mfiore 2:70df6adad015 343
falingtrea 1:41af2b3eefb5 344 reg_out[0] = reg;
Evan Hosseini 5:d662a7003b6f 345 _i2c->lock();
Evan Hosseini 5:d662a7003b6f 346
Evan Hosseini 5:d662a7003b6f 347 // MMA8451Q expects a repeated start from the master
mfiore 2:70df6adad015 348 result |= _i2c->write(_i2c_addr,reg_out,1,true);
falingtrea 1:41af2b3eefb5 349
Evan Hosseini 5:d662a7003b6f 350 if (result != 0) {
falingtrea 1:41af2b3eefb5 351 debug("MMA845x::readRegister failed write r- %d\n\r", result);
Evan Hosseini 5:d662a7003b6f 352 goto exit;
sam_grove 0:9d1e3a344e4f 353 }
mfiore 2:70df6adad015 354
mfiore 2:70df6adad015 355 result |= _i2c->read(_i2c_addr,data,count,false);
mfiore 2:70df6adad015 356
Evan Hosseini 5:d662a7003b6f 357 if (result != 0) {
falingtrea 1:41af2b3eefb5 358 debug("MMA845x::readRegister failed read r-%d\n\r",result);
sam_grove 0:9d1e3a344e4f 359 }
mfiore 2:70df6adad015 360
Evan Hosseini 5:d662a7003b6f 361 exit:
Evan Hosseini 5:d662a7003b6f 362 _i2c->unlock();
falingtrea 1:41af2b3eefb5 363 return result;
sam_grove 0:9d1e3a344e4f 364 }