Class Module for MMA845x I2C Accelerometer.

Dependents:   mDotEVBM2X MTDOT-EVBDemo-DRH MTDOT-BOX-EVB-Factory-Firmware-LIB-108 MTDOT-UDKDemo_Senet ... more

Fork of MMA845x by Sam Grove

Committer:
falingtrea
Date:
Mon Jul 06 19:53:27 2015 +0000
Revision:
1:41af2b3eefb5
Parent:
0:9d1e3a344e4f
Child:
2:70df6adad015
Added basic setup functions and added RTOS calls. Set data get to poll if interrupt pointers are set to NULL.

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 */
sam_grove 0:9d1e3a344e4f 29
sam_grove 0:9d1e3a344e4f 30 #include "MMA845x.h"
falingtrea 1:41af2b3eefb5 31 #include "mbed_debug.h"
falingtrea 1:41af2b3eefb5 32 #include "rtos.h"
sam_grove 0:9d1e3a344e4f 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;
sam_grove 0:9d1e3a344e4f 39
falingtrea 1:41af2b3eefb5 40 _i2c_addr = (0x1c | i2c_addr) << 1;
falingtrea 1:41af2b3eefb5 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];
falingtrea 1:41af2b3eefb5 52
falingtrea 1:41af2b3eefb5 53 _i2c->frequency(100000);
falingtrea 1:41af2b3eefb5 54 _who_am_i = 0x00;
falingtrea 1:41af2b3eefb5 55
falingtrea 1:41af2b3eefb5 56 // Reset all registers to POR values
falingtrea 1:41af2b3eefb5 57 result = MMA845x::writeRegister(CTRL_REG2, 0xFF); //REG 0x2B
falingtrea 1:41af2b3eefb5 58 if (result == 0){
falingtrea 1:41af2b3eefb5 59
falingtrea 1:41af2b3eefb5 60 do{
falingtrea 1:41af2b3eefb5 61 // wait for the reset bit to clear. readRegister may error out so we re-try 10 times
falingtrea 1:41af2b3eefb5 62 osDelay(200);
falingtrea 1:41af2b3eefb5 63 reg_val[0] = 0x40;
falingtrea 1:41af2b3eefb5 64 result = MMA845x::readRegister(CTRL_REG2,1,reg_val);
falingtrea 1:41af2b3eefb5 65 reg_val[0] = reg_val[0] & 0x40;
falingtrea 1:41af2b3eefb5 66 i++;
falingtrea 1:41af2b3eefb5 67 }while(((reg_val[0] != 0)||( result != 0)) && (i<=10));
falingtrea 1:41af2b3eefb5 68 }
falingtrea 1:41af2b3eefb5 69
falingtrea 1:41af2b3eefb5 70 if (result == 0){
falingtrea 1:41af2b3eefb5 71 result = MMA845x::readRegister(WHO_AM_I,1,reg_val);
falingtrea 1:41af2b3eefb5 72 }
falingtrea 1:41af2b3eefb5 73
falingtrea 1:41af2b3eefb5 74 switch (reg_val[0]){
falingtrea 1:41af2b3eefb5 75 case MMA8451:
falingtrea 1:41af2b3eefb5 76 case MMA8452:
falingtrea 1:41af2b3eefb5 77 case MMA8453:
falingtrea 1:41af2b3eefb5 78 _who_am_i= reg_val[0];
falingtrea 1:41af2b3eefb5 79 if ((_int1 == NULL) && (_int2 == NULL))
falingtrea 1:41af2b3eefb5 80 _polling_mode = true;
falingtrea 1:41af2b3eefb5 81 else _polling_mode = false;
falingtrea 1:41af2b3eefb5 82 break;
falingtrea 1:41af2b3eefb5 83 default:
falingtrea 1:41af2b3eefb5 84 debug ("Device not supported by this library!\n\r");
falingtrea 1:41af2b3eefb5 85 result = 1;
falingtrea 1:41af2b3eefb5 86 }
falingtrea 1:41af2b3eefb5 87
falingtrea 1:41af2b3eefb5 88 if(result != 0)
sam_grove 0:9d1e3a344e4f 89 {
falingtrea 1:41af2b3eefb5 90 debug("MMA845x:init failed\n\r");
falingtrea 1:41af2b3eefb5 91 }
falingtrea 1:41af2b3eefb5 92
falingtrea 1:41af2b3eefb5 93
falingtrea 1:41af2b3eefb5 94 return result;
falingtrea 1:41af2b3eefb5 95 }
falingtrea 1:41af2b3eefb5 96
falingtrea 1:41af2b3eefb5 97 uint8_t MMA845x::setCommonParameters(RANGE range, RESOLUTION resolution, LOW_NOISE lo_noise,
falingtrea 1:41af2b3eefb5 98 DATA_RATE data_rate, OVERSAMPLE_MODE os_mode, HPF_MODE hpf_mode) const
falingtrea 1:41af2b3eefb5 99 {
falingtrea 1:41af2b3eefb5 100 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 101 char datain[1];
falingtrea 1:41af2b3eefb5 102 uint8_t dataout = 0;
falingtrea 1:41af2b3eefb5 103
falingtrea 1:41af2b3eefb5 104 result |= MMA845x::readRegister(SYSMOD,1,datain); // Make sure MMA845x is in Stand-By mode
falingtrea 1:41af2b3eefb5 105 if ((datain[0] & 0x03) != 0 ){
falingtrea 1:41af2b3eefb5 106 debug ("MMA845x not in STAND BY mode\n\f");
falingtrea 1:41af2b3eefb5 107 debug("MMA845x:setCommonParameters failed\n\r");
falingtrea 1:41af2b3eefb5 108 result = 1;
falingtrea 1:41af2b3eefb5 109 return result;
falingtrea 1:41af2b3eefb5 110 }
falingtrea 1:41af2b3eefb5 111
falingtrea 1:41af2b3eefb5 112 result |= MMA845x::readRegister(CTRL_REG1, 1, datain);
falingtrea 1:41af2b3eefb5 113 dataout = (datain[0] & 0xB1) | resolution | lo_noise | data_rate;
falingtrea 1:41af2b3eefb5 114 result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set resolution, Low Noise mode, and data rate
falingtrea 1:41af2b3eefb5 115
falingtrea 1:41af2b3eefb5 116 result |= MMA845x::readRegister(CTRL_REG2,1, datain);
falingtrea 1:41af2b3eefb5 117 dataout = (datain[0] & 0xFB) | os_mode;
falingtrea 1:41af2b3eefb5 118 result |= MMA845x::writeRegister(CTRL_REG2, dataout); // Set Oversample mode
falingtrea 1:41af2b3eefb5 119
falingtrea 1:41af2b3eefb5 120 result |= MMA845x::readRegister(XYZ_DATA_CFG,1, datain);
falingtrea 1:41af2b3eefb5 121 dataout = range | hpf_mode;
falingtrea 1:41af2b3eefb5 122 result |= MMA845x::writeRegister(XYZ_DATA_CFG, dataout); //Set HPF mode and range
falingtrea 1:41af2b3eefb5 123
falingtrea 1:41af2b3eefb5 124 // result |= MMA845x::readRegister(HP_FILTER_CUTOFF,1, datain);
falingtrea 1:41af2b3eefb5 125 // result |= MMA845x::writeRegister(HP_FILTER_CUTOFF, dataout); //REG 0xF HPF settings
falingtrea 1:41af2b3eefb5 126
falingtrea 1:41af2b3eefb5 127 if(result != 0)
falingtrea 1:41af2b3eefb5 128 {
falingtrea 1:41af2b3eefb5 129 debug("MMA845x:setParameters failed\n\r");
falingtrea 1:41af2b3eefb5 130 }
falingtrea 1:41af2b3eefb5 131
falingtrea 1:41af2b3eefb5 132 return result;
falingtrea 1:41af2b3eefb5 133
falingtrea 1:41af2b3eefb5 134 }
falingtrea 1:41af2b3eefb5 135
falingtrea 1:41af2b3eefb5 136 uint8_t MMA845x::enableMotionDetect(void) const
falingtrea 1:41af2b3eefb5 137 {
falingtrea 1:41af2b3eefb5 138 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 139 return result;
sam_grove 0:9d1e3a344e4f 140 }
sam_grove 0:9d1e3a344e4f 141
falingtrea 1:41af2b3eefb5 142 uint8_t MMA845x::enablePulseDetect(void) const
falingtrea 1:41af2b3eefb5 143 {
falingtrea 1:41af2b3eefb5 144 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 145 return result;
falingtrea 1:41af2b3eefb5 146 }
falingtrea 1:41af2b3eefb5 147
falingtrea 1:41af2b3eefb5 148 uint8_t MMA845x::enableOrientationDetect(void) const
falingtrea 1:41af2b3eefb5 149 {
falingtrea 1:41af2b3eefb5 150 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 151
falingtrea 1:41af2b3eefb5 152 if(_who_am_i != MMA8451)
falingtrea 1:41af2b3eefb5 153 {
falingtrea 1:41af2b3eefb5 154 debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
falingtrea 1:41af2b3eefb5 155 result = 1;
falingtrea 1:41af2b3eefb5 156 }
sam_grove 0:9d1e3a344e4f 157
falingtrea 1:41af2b3eefb5 158 return result;
falingtrea 1:41af2b3eefb5 159 }
falingtrea 1:41af2b3eefb5 160
falingtrea 1:41af2b3eefb5 161 uint8_t MMA845x::enableTransientDetect(void) const
falingtrea 1:41af2b3eefb5 162 {
falingtrea 1:41af2b3eefb5 163 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 164 return result;
falingtrea 1:41af2b3eefb5 165 }
falingtrea 1:41af2b3eefb5 166
falingtrea 1:41af2b3eefb5 167 uint8_t MMA845x::enableAutoSleep(void) const
falingtrea 1:41af2b3eefb5 168 {
falingtrea 1:41af2b3eefb5 169 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 170 return result;
falingtrea 1:41af2b3eefb5 171 }
falingtrea 1:41af2b3eefb5 172
falingtrea 1:41af2b3eefb5 173 uint8_t MMA845x::enableFIFO(void) const
falingtrea 1:41af2b3eefb5 174 {
falingtrea 1:41af2b3eefb5 175 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 176
falingtrea 1:41af2b3eefb5 177 if(_who_am_i != MMA8451)
falingtrea 1:41af2b3eefb5 178 {
falingtrea 1:41af2b3eefb5 179 debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
falingtrea 1:41af2b3eefb5 180 result = 1;
falingtrea 1:41af2b3eefb5 181 }
falingtrea 1:41af2b3eefb5 182
falingtrea 1:41af2b3eefb5 183 return result;
sam_grove 0:9d1e3a344e4f 184 }
sam_grove 0:9d1e3a344e4f 185
falingtrea 1:41af2b3eefb5 186 uint8_t MMA845x::activeMode(void) const
falingtrea 1:41af2b3eefb5 187 {
falingtrea 1:41af2b3eefb5 188 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 189 char datain[1];
falingtrea 1:41af2b3eefb5 190 uint8_t dataout;
falingtrea 1:41af2b3eefb5 191
falingtrea 1:41af2b3eefb5 192 result |= MMA845x::readRegister(CTRL_REG1,1, datain);
falingtrea 1:41af2b3eefb5 193 dataout = (datain[0] & 0xFE) | 0x01 ;
falingtrea 1:41af2b3eefb5 194 result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set to active mode
falingtrea 1:41af2b3eefb5 195
falingtrea 1:41af2b3eefb5 196 return result;
falingtrea 1:41af2b3eefb5 197 }
falingtrea 1:41af2b3eefb5 198 uint8_t MMA845x::standbyMode(void) const
falingtrea 1:41af2b3eefb5 199 {
falingtrea 1:41af2b3eefb5 200 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 201 char datain[1];
falingtrea 1:41af2b3eefb5 202 uint8_t dataout;
falingtrea 1:41af2b3eefb5 203
falingtrea 1:41af2b3eefb5 204 result |= MMA845x::readRegister(CTRL_REG1,1, datain);
falingtrea 1:41af2b3eefb5 205 dataout = (datain[0] & 0xFE);
falingtrea 1:41af2b3eefb5 206 result |= MMA845x::writeRegister(CTRL_REG1, dataout); // Set to standby mode
falingtrea 1:41af2b3eefb5 207
falingtrea 1:41af2b3eefb5 208 return result;
falingtrea 1:41af2b3eefb5 209 }
falingtrea 1:41af2b3eefb5 210
falingtrea 1:41af2b3eefb5 211 uint8_t MMA845x::getStatus(void) const
sam_grove 0:9d1e3a344e4f 212 {
falingtrea 1:41af2b3eefb5 213 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 214 char datain[1];
falingtrea 1:41af2b3eefb5 215 uint8_t dataout;
falingtrea 1:41af2b3eefb5 216
falingtrea 1:41af2b3eefb5 217 result = MMA845x::readRegister(STATUS,1, datain);
falingtrea 1:41af2b3eefb5 218
falingtrea 1:41af2b3eefb5 219 if (result != 0)
falingtrea 1:41af2b3eefb5 220 dataout = result;
falingtrea 1:41af2b3eefb5 221 else
falingtrea 1:41af2b3eefb5 222 dataout = datain[0];
falingtrea 1:41af2b3eefb5 223
falingtrea 1:41af2b3eefb5 224 return dataout;
falingtrea 1:41af2b3eefb5 225 }
falingtrea 1:41af2b3eefb5 226
falingtrea 1:41af2b3eefb5 227 int16_t MMA845x::getX(void)
falingtrea 1:41af2b3eefb5 228 {
falingtrea 1:41af2b3eefb5 229 char datain[2];
falingtrea 1:41af2b3eefb5 230
falingtrea 1:41af2b3eefb5 231 if (_polling_mode)
falingtrea 1:41af2b3eefb5 232 {
falingtrea 1:41af2b3eefb5 233 MMA845x::readRegister(OUT_X_MSB,2, datain);
falingtrea 1:41af2b3eefb5 234 _data._x = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 235 _data._x /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 236 }
falingtrea 1:41af2b3eefb5 237 return _data._x;
falingtrea 1:41af2b3eefb5 238
sam_grove 0:9d1e3a344e4f 239 }
sam_grove 0:9d1e3a344e4f 240
falingtrea 1:41af2b3eefb5 241 int16_t MMA845x::getY(void)
sam_grove 0:9d1e3a344e4f 242 {
falingtrea 1:41af2b3eefb5 243 char datain[2];
falingtrea 1:41af2b3eefb5 244
falingtrea 1:41af2b3eefb5 245 if (_polling_mode)
falingtrea 1:41af2b3eefb5 246 {
falingtrea 1:41af2b3eefb5 247 MMA845x::readRegister(OUT_Y_MSB,2, datain);
falingtrea 1:41af2b3eefb5 248 _data._y = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 249 _data._y /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 250 }
falingtrea 1:41af2b3eefb5 251 return _data._y;
sam_grove 0:9d1e3a344e4f 252 }
sam_grove 0:9d1e3a344e4f 253
falingtrea 1:41af2b3eefb5 254 int16_t MMA845x::getZ(void)
sam_grove 0:9d1e3a344e4f 255 {
falingtrea 1:41af2b3eefb5 256 char datain[2];
falingtrea 1:41af2b3eefb5 257
falingtrea 1:41af2b3eefb5 258 if (_polling_mode)
falingtrea 1:41af2b3eefb5 259 {
falingtrea 1:41af2b3eefb5 260 MMA845x::readRegister(OUT_Z_MSB,2, datain);
falingtrea 1:41af2b3eefb5 261 _data._z = ((datain[0] << 8) | datain[1]); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 262 _data._z /= 4; /* need to shift first to preserve sign then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 263 }
falingtrea 1:41af2b3eefb5 264
sam_grove 0:9d1e3a344e4f 265 return _data._z;
sam_grove 0:9d1e3a344e4f 266 }
sam_grove 0:9d1e3a344e4f 267
falingtrea 1:41af2b3eefb5 268 MMA845x_DATA MMA845x::getXYZ(void)
sam_grove 0:9d1e3a344e4f 269 {
falingtrea 1:41af2b3eefb5 270 char datain[6];
falingtrea 1:41af2b3eefb5 271
falingtrea 1:41af2b3eefb5 272 if (_polling_mode)
falingtrea 1:41af2b3eefb5 273 {
falingtrea 1:41af2b3eefb5 274 MMA845x::readRegister(OUT_X_MSB,6, datain); /* data is 14 bit signed with 2 LSB = 0 */
falingtrea 1:41af2b3eefb5 275 _data._x = ((datain[0] << 8) | datain[1]); /* need to shift first to preserve sign */
falingtrea 1:41af2b3eefb5 276 _data._x /= 4; /* then /4 to remove LSBs */
falingtrea 1:41af2b3eefb5 277 _data._y = ((datain[2] << 8) | datain[3]);
falingtrea 1:41af2b3eefb5 278 _data._y /= 4;
falingtrea 1:41af2b3eefb5 279 _data._z = ((datain[4] << 8) | datain[5]);
falingtrea 1:41af2b3eefb5 280 _data._z /= 4;
falingtrea 1:41af2b3eefb5 281 }
falingtrea 1:41af2b3eefb5 282
sam_grove 0:9d1e3a344e4f 283 return _data;
sam_grove 0:9d1e3a344e4f 284 }
sam_grove 0:9d1e3a344e4f 285
falingtrea 1:41af2b3eefb5 286 char MMA845x::getWhoAmI(void) const
falingtrea 1:41af2b3eefb5 287 {
falingtrea 1:41af2b3eefb5 288 return _who_am_i;
falingtrea 1:41af2b3eefb5 289 }
falingtrea 1:41af2b3eefb5 290
falingtrea 1:41af2b3eefb5 291 uint8_t MMA845x::writeRegister(uint8_t const reg, uint8_t const data) const
sam_grove 0:9d1e3a344e4f 292 {
sam_grove 0:9d1e3a344e4f 293 char buf[2] = {reg, data};
sam_grove 0:9d1e3a344e4f 294 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 295
falingtrea 1:41af2b3eefb5 296 buf[0] = reg;
falingtrea 1:41af2b3eefb5 297 buf[1] = data;
sam_grove 0:9d1e3a344e4f 298
falingtrea 1:41af2b3eefb5 299 // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices
falingtrea 1:41af2b3eefb5 300 result |= _i2c->write(_i2c_addr, buf, 2);
falingtrea 1:41af2b3eefb5 301 // __enable_irq(); // Just need to block during the transaction
sam_grove 0:9d1e3a344e4f 302
falingtrea 1:41af2b3eefb5 303 if(result != 0)
sam_grove 0:9d1e3a344e4f 304 {
falingtrea 1:41af2b3eefb5 305 debug("MMA845x:writeRegister failed r-%d\n\r",result);
sam_grove 0:9d1e3a344e4f 306 }
sam_grove 0:9d1e3a344e4f 307
falingtrea 1:41af2b3eefb5 308 return result;
sam_grove 0:9d1e3a344e4f 309 }
sam_grove 0:9d1e3a344e4f 310
falingtrea 1:41af2b3eefb5 311 uint8_t MMA845x::readRegister(uint8_t const reg, uint8_t count, char* data) const
sam_grove 0:9d1e3a344e4f 312 {
falingtrea 1:41af2b3eefb5 313 uint8_t result = 0;
falingtrea 1:41af2b3eefb5 314 char reg_out[1];
sam_grove 0:9d1e3a344e4f 315
falingtrea 1:41af2b3eefb5 316 reg_out[0] = reg;
falingtrea 1:41af2b3eefb5 317 // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices
falingtrea 1:41af2b3eefb5 318 result |= _i2c->write(_i2c_addr,reg_out,1,true);
falingtrea 1:41af2b3eefb5 319 // __enable_irq(); // Just need to block during the transaction
falingtrea 1:41af2b3eefb5 320
falingtrea 1:41af2b3eefb5 321 if(result != 0)
sam_grove 0:9d1e3a344e4f 322 {
falingtrea 1:41af2b3eefb5 323 debug("MMA845x::readRegister failed write r- %d\n\r", result);
falingtrea 1:41af2b3eefb5 324 return result;
sam_grove 0:9d1e3a344e4f 325 }
sam_grove 0:9d1e3a344e4f 326
falingtrea 1:41af2b3eefb5 327 // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices
falingtrea 1:41af2b3eefb5 328 result |= _i2c->read(_i2c_addr,data,count,false);
falingtrea 1:41af2b3eefb5 329 // __enable_irq(); // Just need to block during the transaction
sam_grove 0:9d1e3a344e4f 330
falingtrea 1:41af2b3eefb5 331 if(result != 0)
sam_grove 0:9d1e3a344e4f 332 {
falingtrea 1:41af2b3eefb5 333 debug("MMA845x::readRegister failed read r-%d\n\r",result);
sam_grove 0:9d1e3a344e4f 334 }
sam_grove 0:9d1e3a344e4f 335
falingtrea 1:41af2b3eefb5 336 return result;
sam_grove 0:9d1e3a344e4f 337 }