enhancing Multitech's library for some accelerometer

Fork of MMA845x by Multi-Hackers

Committer:
amateusz
Date:
Mon Jul 02 23:55:31 2018 +0000
Revision:
12:92294b5ca1c1
Parent:
10:89dd748f9211
Child:
13:77a8994b3bb2
added interrupt bitmasks. they happen to be shared among CTRL_REG4, CTRL_REG5 and INT_SOURCE; added INT_PINs; modified proto for enableOrientation to include some parameters

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);
falingtrea 1:41af2b3eefb5 111 dataout = (datain[0] & 0xB1) | resolution | lo_noise | data_rate;
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
falingtrea 1:41af2b3eefb5 139 uint8_t MMA845x::enablePulseDetect(void) const
falingtrea 1:41af2b3eefb5 140 {
falingtrea 1:41af2b3eefb5 141 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 142 return result;
mfiore 2:70df6adad015 143 }
falingtrea 1:41af2b3eefb5 144
amateusz 12:92294b5ca1c1 145 uint8_t MMA845x::enableOrientationDetect(uint8_t debounce_steps, INTERRUPT_PIN pin) const
falingtrea 1:41af2b3eefb5 146 {
falingtrea 1:41af2b3eefb5 147 uint8_t result = 0;
amateusz 10:89dd748f9211 148 // if(_who_am_i != MMA8451) {
amateusz 10:89dd748f9211 149 // debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
amateusz 10:89dd748f9211 150 // result = 1;
amateusz 10:89dd748f9211 151 // }
amateusz 10:89dd748f9211 152 // ↑ not true. MMA8451 is the only one supporting variable trip-angle values
amateusz 12:92294b5ca1c1 153 char datain[1];
amateusz 12:92294b5ca1c1 154 uint8_t dataout;
amateusz 12:92294b5ca1c1 155
amateusz 12:92294b5ca1c1 156 MMA845x::writeRegister(PL_COUNT, debounce_steps);
amateusz 12:92294b5ca1c1 157 MMA845x::writeRegister(PL_CFG, 0b11000000); // enable and set debounce counter to clear out of {clear, decrement}
amateusz 12:92294b5ca1c1 158
amateusz 12:92294b5ca1c1 159 if (pin != INT_NONE) {
amateusz 12:92294b5ca1c1 160 // enable interrupt
amateusz 12:92294b5ca1c1 161 result |= MMA845x::readRegister(CTRL_REG4, 1, datain);
amateusz 12:92294b5ca1c1 162 dataout = (datain[0] | INT_LNDPRT);
amateusz 12:92294b5ca1c1 163 result |= MMA845x::writeRegister(CTRL_REG4, dataout);
amateusz 12:92294b5ca1c1 164
amateusz 12:92294b5ca1c1 165 //set pin for the interrupt
amateusz 12:92294b5ca1c1 166 result |= MMA845x::readRegister(CTRL_REG5, 1, datain);
amateusz 12:92294b5ca1c1 167 if (pin == 0) dataout = (datain[0] & ~INT_LNDPRT); // clearing bit
amateusz 12:92294b5ca1c1 168 else dataout = (datain[0] | INT_LNDPRT); // setting bit
amateusz 12:92294b5ca1c1 169 } else {
amateusz 12:92294b5ca1c1 170 // disable interrupt
amateusz 12:92294b5ca1c1 171 result |= MMA845x::readRegister(CTRL_REG4, 1, datain);
amateusz 12:92294b5ca1c1 172 dataout = (datain[0] & ~INT_LNDPRT);
amateusz 12:92294b5ca1c1 173 result |= MMA845x::writeRegister(CTRL_REG4, dataout);
amateusz 12:92294b5ca1c1 174 }
mfiore 2:70df6adad015 175
falingtrea 1:41af2b3eefb5 176 return result;
falingtrea 1:41af2b3eefb5 177 }
falingtrea 1:41af2b3eefb5 178
falingtrea 1:41af2b3eefb5 179 uint8_t MMA845x::enableTransientDetect(void) const
falingtrea 1:41af2b3eefb5 180 {
falingtrea 1:41af2b3eefb5 181 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 182 return result;
mfiore 2:70df6adad015 183 }
mfiore 2:70df6adad015 184
falingtrea 1:41af2b3eefb5 185 uint8_t MMA845x::enableAutoSleep(void) const
falingtrea 1:41af2b3eefb5 186 {
falingtrea 1:41af2b3eefb5 187 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 188 return result;
mfiore 2:70df6adad015 189 }
falingtrea 1:41af2b3eefb5 190
falingtrea 1:41af2b3eefb5 191 uint8_t MMA845x::enableFIFO(void) const
falingtrea 1:41af2b3eefb5 192 {
falingtrea 1:41af2b3eefb5 193 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 194
mfiore 2:70df6adad015 195 if(_who_am_i != MMA8451) {
falingtrea 1:41af2b3eefb5 196 debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
falingtrea 1:41af2b3eefb5 197 result = 1;
falingtrea 1:41af2b3eefb5 198 }
mfiore 2:70df6adad015 199
falingtrea 1:41af2b3eefb5 200 return result;
sam_grove 0:9d1e3a344e4f 201 }
sam_grove 0:9d1e3a344e4f 202
falingtrea 1:41af2b3eefb5 203 uint8_t MMA845x::activeMode(void) const
falingtrea 1:41af2b3eefb5 204 {
falingtrea 1:41af2b3eefb5 205 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 206 char datain[1];
falingtrea 1:41af2b3eefb5 207 uint8_t dataout;
falingtrea 1:41af2b3eefb5 208
falingtrea 1:41af2b3eefb5 209 result |= MMA845x::readRegister(CTRL_REG1,1, datain);
falingtrea 1:41af2b3eefb5 210 dataout = (datain[0] & 0xFE) | 0x01 ;
falingtrea 1:41af2b3eefb5 211 result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set to active mode
falingtrea 1:41af2b3eefb5 212
falingtrea 1:41af2b3eefb5 213 return result;
mfiore 2:70df6adad015 214 }
falingtrea 1:41af2b3eefb5 215 uint8_t MMA845x::standbyMode(void) const
falingtrea 1:41af2b3eefb5 216 {
falingtrea 1:41af2b3eefb5 217 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 218 char datain[1];
falingtrea 1:41af2b3eefb5 219 uint8_t dataout;
falingtrea 1:41af2b3eefb5 220
falingtrea 1:41af2b3eefb5 221 result |= MMA845x::readRegister(CTRL_REG1,1, datain);
falingtrea 1:41af2b3eefb5 222 dataout = (datain[0] & 0xFE);
falingtrea 1:41af2b3eefb5 223 result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set to standby mode
falingtrea 1:41af2b3eefb5 224
falingtrea 1:41af2b3eefb5 225 return result;
mfiore 2:70df6adad015 226 }
falingtrea 1:41af2b3eefb5 227
falingtrea 1:41af2b3eefb5 228 uint8_t MMA845x::getStatus(void) const
sam_grove 0:9d1e3a344e4f 229 {
falingtrea 1:41af2b3eefb5 230 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 231 char datain[1];
falingtrea 1:41af2b3eefb5 232 uint8_t dataout;
falingtrea 1:41af2b3eefb5 233
falingtrea 1:41af2b3eefb5 234 result = MMA845x::readRegister(STATUS,1, datain);
falingtrea 1:41af2b3eefb5 235
falingtrea 1:41af2b3eefb5 236 if (result != 0)
mfiore 2:70df6adad015 237 dataout = result;
falingtrea 1:41af2b3eefb5 238 else
mfiore 2:70df6adad015 239 dataout = datain[0];
falingtrea 1:41af2b3eefb5 240
falingtrea 1:41af2b3eefb5 241 return dataout;
mfiore 2:70df6adad015 242 }
falingtrea 1:41af2b3eefb5 243
falingtrea 1:41af2b3eefb5 244 int16_t MMA845x::getX(void)
falingtrea 1:41af2b3eefb5 245 {
falingtrea 1:41af2b3eefb5 246 char datain[2];
falingtrea 1:41af2b3eefb5 247
mfiore 2:70df6adad015 248 if (_polling_mode) {
falingtrea 1:41af2b3eefb5 249 MMA845x::readRegister(OUT_X_MSB,2, datain);
falingtrea 1:41af2b3eefb5 250 _data._x = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 251 _data._x /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 252 }
mfiore 2:70df6adad015 253 return _data._x;
falingtrea 1:41af2b3eefb5 254
sam_grove 0:9d1e3a344e4f 255 }
mfiore 2:70df6adad015 256
falingtrea 1:41af2b3eefb5 257 int16_t MMA845x::getY(void)
sam_grove 0:9d1e3a344e4f 258 {
falingtrea 1:41af2b3eefb5 259 char datain[2];
falingtrea 1:41af2b3eefb5 260
mfiore 2:70df6adad015 261 if (_polling_mode) {
falingtrea 1:41af2b3eefb5 262 MMA845x::readRegister(OUT_Y_MSB,2, datain);
falingtrea 1:41af2b3eefb5 263 _data._y = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 264 _data._y /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 265 }
mfiore 2:70df6adad015 266 return _data._y;
sam_grove 0:9d1e3a344e4f 267 }
sam_grove 0:9d1e3a344e4f 268
falingtrea 1:41af2b3eefb5 269 int16_t MMA845x::getZ(void)
sam_grove 0:9d1e3a344e4f 270 {
falingtrea 1:41af2b3eefb5 271 char datain[2];
falingtrea 1:41af2b3eefb5 272
mfiore 2:70df6adad015 273 if (_polling_mode) {
falingtrea 1:41af2b3eefb5 274 MMA845x::readRegister(OUT_Z_MSB,2, datain);
falingtrea 1:41af2b3eefb5 275 _data._z = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 276 _data._z /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 277 }
falingtrea 1:41af2b3eefb5 278
sam_grove 0:9d1e3a344e4f 279 return _data._z;
sam_grove 0:9d1e3a344e4f 280 }
mfiore 2:70df6adad015 281
falingtrea 1:41af2b3eefb5 282 MMA845x_DATA MMA845x::getXYZ(void)
sam_grove 0:9d1e3a344e4f 283 {
falingtrea 1:41af2b3eefb5 284 char datain[6];
falingtrea 1:41af2b3eefb5 285
mfiore 2:70df6adad015 286 if (_polling_mode) {
falingtrea 1:41af2b3eefb5 287 MMA845x::readRegister(OUT_X_MSB,6, datain); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 288 _data._x = ((datain[0] << 8) | datain[1]); /* need to shift first to preserve sign */
falingtrea 1:41af2b3eefb5 289 _data._x /= 4; /* then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 290 _data._y = ((datain[2] << 8) | datain[3]);
falingtrea 1:41af2b3eefb5 291 _data._y /= 4;
falingtrea 1:41af2b3eefb5 292 _data._z = ((datain[4] << 8) | datain[5]);
falingtrea 1:41af2b3eefb5 293 _data._z /= 4;
falingtrea 1:41af2b3eefb5 294 }
falingtrea 1:41af2b3eefb5 295
sam_grove 0:9d1e3a344e4f 296 return _data;
sam_grove 0:9d1e3a344e4f 297 }
sam_grove 0:9d1e3a344e4f 298
falingtrea 1:41af2b3eefb5 299 char MMA845x::getWhoAmI(void) const
falingtrea 1:41af2b3eefb5 300 {
falingtrea 1:41af2b3eefb5 301 return _who_am_i;
falingtrea 1:41af2b3eefb5 302 }
falingtrea 1:41af2b3eefb5 303
falingtrea 1:41af2b3eefb5 304 uint8_t MMA845x::writeRegister(uint8_t const reg, uint8_t const data) const
sam_grove 0:9d1e3a344e4f 305 {
sam_grove 0:9d1e3a344e4f 306 char buf[2] = {reg, data};
sam_grove 0:9d1e3a344e4f 307 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 308
falingtrea 1:41af2b3eefb5 309 buf[0] = reg;
falingtrea 1:41af2b3eefb5 310 buf[1] = data;
mfiore 2:70df6adad015 311
falingtrea 1:41af2b3eefb5 312 result |= _i2c->write(_i2c_addr, buf, 2);
mfiore 2:70df6adad015 313
Evan Hosseini 5:d662a7003b6f 314 if (result != 0) {
Evan Hosseini 5:d662a7003b6f 315 debug("MMA845x::writeRegister failed r-%d\n\r",result);
sam_grove 0:9d1e3a344e4f 316 }
mfiore 2:70df6adad015 317
falingtrea 1:41af2b3eefb5 318 return result;
sam_grove 0:9d1e3a344e4f 319 }
sam_grove 0:9d1e3a344e4f 320
falingtrea 1:41af2b3eefb5 321 uint8_t MMA845x::readRegister(uint8_t const reg, uint8_t count, char* data) const
sam_grove 0:9d1e3a344e4f 322 {
falingtrea 1:41af2b3eefb5 323 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 324 char reg_out[1];
mfiore 2:70df6adad015 325
falingtrea 1:41af2b3eefb5 326 reg_out[0] = reg;
Evan Hosseini 5:d662a7003b6f 327 _i2c->lock();
Evan Hosseini 5:d662a7003b6f 328
Evan Hosseini 5:d662a7003b6f 329 // MMA8451Q expects a repeated start from the master
mfiore 2:70df6adad015 330 result |= _i2c->write(_i2c_addr,reg_out,1,true);
falingtrea 1:41af2b3eefb5 331
Evan Hosseini 5:d662a7003b6f 332 if (result != 0) {
falingtrea 1:41af2b3eefb5 333 debug("MMA845x::readRegister failed write r- %d\n\r", result);
Evan Hosseini 5:d662a7003b6f 334 goto exit;
sam_grove 0:9d1e3a344e4f 335 }
mfiore 2:70df6adad015 336
mfiore 2:70df6adad015 337 result |= _i2c->read(_i2c_addr,data,count,false);
mfiore 2:70df6adad015 338
Evan Hosseini 5:d662a7003b6f 339 if (result != 0) {
falingtrea 1:41af2b3eefb5 340 debug("MMA845x::readRegister failed read r-%d\n\r",result);
sam_grove 0:9d1e3a344e4f 341 }
mfiore 2:70df6adad015 342
Evan Hosseini 5:d662a7003b6f 343 exit:
Evan Hosseini 5:d662a7003b6f 344 _i2c->unlock();
falingtrea 1:41af2b3eefb5 345 return result;
sam_grove 0:9d1e3a344e4f 346 }