first try tap on rig

Dependencies:   BLE_API PinDetect mbed-src-bmd-200

Committer:
vertinfo
Date:
Tue Jul 21 00:22:23 2015 +0000
Revision:
0:e3f0057448f0
init;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vertinfo 0:e3f0057448f0 1 /**
vertinfo 0:e3f0057448f0 2 * @file MMA845x.cpp
vertinfo 0:e3f0057448f0 3 * @brief Device driver - MMA845X 3-axis accelerometer IC
vertinfo 0:e3f0057448f0 4 * @author sam grove
vertinfo 0:e3f0057448f0 5 * @version 1.0
vertinfo 0:e3f0057448f0 6 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8451Q.pdf
vertinfo 0:e3f0057448f0 7 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8452Q.pdf
vertinfo 0:e3f0057448f0 8 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8453Q.pdf
vertinfo 0:e3f0057448f0 9 *
vertinfo 0:e3f0057448f0 10 * Copyright (c) 2013
vertinfo 0:e3f0057448f0 11 *
vertinfo 0:e3f0057448f0 12 * Licensed under the Apache License, Version 2.0 (the "License");
vertinfo 0:e3f0057448f0 13 * you may not use this file except in compliance with the License.
vertinfo 0:e3f0057448f0 14 * You may obtain a copy of the License at
vertinfo 0:e3f0057448f0 15 *
vertinfo 0:e3f0057448f0 16 * http://www.apache.org/licenses/LICENSE-2.0
vertinfo 0:e3f0057448f0 17 *
vertinfo 0:e3f0057448f0 18 * Unless required by applicable law or agreed to in writing, software
vertinfo 0:e3f0057448f0 19 * distributed under the License is distributed on an "AS IS" BASIS,
vertinfo 0:e3f0057448f0 20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vertinfo 0:e3f0057448f0 21 * See the License for the specific language governing permissions and
vertinfo 0:e3f0057448f0 22 * limitations under the License.
vertinfo 0:e3f0057448f0 23 */
vertinfo 0:e3f0057448f0 24
vertinfo 0:e3f0057448f0 25 #include "MMA845x.h"
vertinfo 0:e3f0057448f0 26 #include "mbed.h"
vertinfo 0:e3f0057448f0 27
vertinfo 0:e3f0057448f0 28
vertinfo 0:e3f0057448f0 29 void MMA845x::disable(void)
vertinfo 0:e3f0057448f0 30 {
vertinfo 0:e3f0057448f0 31 uint8_t reg_val = 0;
vertinfo 0:e3f0057448f0 32 // Reset all registers to POR values
vertinfo 0:e3f0057448f0 33 MMA845x::writeRegister(CTRL_REG2, 0xF0); //REG 0x2B
vertinfo 0:e3f0057448f0 34 wait(0.05);
vertinfo 0:e3f0057448f0 35 do{
vertinfo 0:e3f0057448f0 36 // wait for the reset bit to clear
vertinfo 0:e3f0057448f0 37 reg_val = MMA845x::readRegister(CTRL_REG2) & 0x40;
vertinfo 0:e3f0057448f0 38 }while(reg_val);
vertinfo 0:e3f0057448f0 39 MMA845x::writeRegister(CTRL_REG1, 0x00); //REG 0x2A 0x98 = ASLP_RATE: 6.25hz Data Rate: 50hz
vertinfo 0:e3f0057448f0 40 }
vertinfo 0:e3f0057448f0 41
vertinfo 0:e3f0057448f0 42 void MMA845x::setIntMode(int intMode)
vertinfo 0:e3f0057448f0 43 {
vertinfo 0:e3f0057448f0 44 _intMode = intMode;
vertinfo 0:e3f0057448f0 45 }
vertinfo 0:e3f0057448f0 46
vertinfo 0:e3f0057448f0 47 void MMA845x::interrupt_1(void)
vertinfo 0:e3f0057448f0 48 {
vertinfo 0:e3f0057448f0 49 //_int1_waiting = true;
vertinfo 0:e3f0057448f0 50
vertinfo 0:e3f0057448f0 51 uint8_t reg_int_sts;
vertinfo 0:e3f0057448f0 52 uint8_t reg_sts;
vertinfo 0:e3f0057448f0 53 uint8_t reg_pulse_sts;
vertinfo 0:e3f0057448f0 54 uint8_t reg_motion_sts;
vertinfo 0:e3f0057448f0 55 char reg_data[3][2] = { 0 };
vertinfo 0:e3f0057448f0 56 int16_t values[3] = { 0 };
vertinfo 0:e3f0057448f0 57 float g_values[3] = { 0 };
vertinfo 0:e3f0057448f0 58 reg_int_sts = MMA845x::readRegister(INT_SOURCE); //REG 0x0C
vertinfo 0:e3f0057448f0 59 if((reg_int_sts & 0x01)) //Mask register read with SRC_DRDY bit
vertinfo 0:e3f0057448f0 60 {
vertinfo 0:e3f0057448f0 61 printf("Int1:");
vertinfo 0:e3f0057448f0 62 printf(" Data Ready");
vertinfo 0:e3f0057448f0 63 reg_sts = MMA845x::readRegister(STATUS); //REG 0x00
vertinfo 0:e3f0057448f0 64
vertinfo 0:e3f0057448f0 65 reg_pulse_sts = MMA845x::readRegister(PULSE_SRC); //REG 0x22
vertinfo 0:e3f0057448f0 66
vertinfo 0:e3f0057448f0 67 reg_data[0][0] = MMA845x::readRegister(OUT_X_MSB); //REG 0x01
vertinfo 0:e3f0057448f0 68 reg_data[0][1] = MMA845x::readRegister(OUT_X_LSB); //REG 0x02
vertinfo 0:e3f0057448f0 69 reg_data[1][0] = MMA845x::readRegister(OUT_Y_MSB); //REG 0x03
vertinfo 0:e3f0057448f0 70 reg_data[1][1] = MMA845x::readRegister(OUT_Y_LSB); //REG 0x04
vertinfo 0:e3f0057448f0 71 reg_data[2][0] = MMA845x::readRegister(OUT_Z_MSB); //REG 0x05
vertinfo 0:e3f0057448f0 72 reg_data[2][1] = MMA845x::readRegister(OUT_Z_LSB); //REG 0x06
vertinfo 0:e3f0057448f0 73 //printf(" STATUS: 0x%02X X: %d %d Y: %d %d Z: %d %d\n\r", reg_sts, reg_data[0][0], reg_data[0][1], reg_data[1][0], reg_data[1][1], reg_data[2][0], reg_data[2][1]);
vertinfo 0:e3f0057448f0 74
vertinfo 0:e3f0057448f0 75 values[0] = ((reg_data[0][0] * 256) + ((unsigned short) reg_data[0][1]));
vertinfo 0:e3f0057448f0 76 values[1] = ((reg_data[1][0] * 256) + ((unsigned short) reg_data[1][1]));
vertinfo 0:e3f0057448f0 77 values[2] = ((reg_data[2][0] * 256) + ((unsigned short) reg_data[2][1]));
vertinfo 0:e3f0057448f0 78
vertinfo 0:e3f0057448f0 79 g_values[0] = ((float) values[0]) / 16384.0;
vertinfo 0:e3f0057448f0 80 g_values[1] = ((float) values[1]) / 16384.0;
vertinfo 0:e3f0057448f0 81 g_values[2] = ((float) values[2]) / 16384.0;
vertinfo 0:e3f0057448f0 82
vertinfo 0:e3f0057448f0 83 //printf(" STATUS: 0x%02X X: %d Y: %d Z: %d\n\r", reg_sts, values[0], values[1], values[2]);
vertinfo 0:e3f0057448f0 84
vertinfo 0:e3f0057448f0 85 if (_intMode == 1)
vertinfo 0:e3f0057448f0 86 {
vertinfo 0:e3f0057448f0 87 printf(" STATUS: 0x%02X X: %.3f Y: %.3f Z: %.3f", reg_sts, g_values[0], g_values[1], g_values[2]);
vertinfo 0:e3f0057448f0 88 }
vertinfo 0:e3f0057448f0 89 else
vertinfo 0:e3f0057448f0 90 {
vertinfo 0:e3f0057448f0 91 int bars = abs( values[0] / 512 );
vertinfo 0:e3f0057448f0 92 printf(" X: ");
vertinfo 0:e3f0057448f0 93 for( int i = 0; i < bars; i++ )
vertinfo 0:e3f0057448f0 94 {
vertinfo 0:e3f0057448f0 95 printf(">");
vertinfo 0:e3f0057448f0 96 }
vertinfo 0:e3f0057448f0 97 }
vertinfo 0:e3f0057448f0 98
vertinfo 0:e3f0057448f0 99 if (reg_pulse_sts & 0x10)
vertinfo 0:e3f0057448f0 100 {
vertinfo 0:e3f0057448f0 101 printf(" ***********************************************");
vertinfo 0:e3f0057448f0 102 _callbackZAxisPulse.call();
vertinfo 0:e3f0057448f0 103 if (reg_pulse_sts & 0x01)
vertinfo 0:e3f0057448f0 104 {
vertinfo 0:e3f0057448f0 105 printf("--------------");
vertinfo 0:e3f0057448f0 106 }
vertinfo 0:e3f0057448f0 107 }
vertinfo 0:e3f0057448f0 108 printf("\n\r");
vertinfo 0:e3f0057448f0 109 }
vertinfo 0:e3f0057448f0 110 if (reg_int_sts & 0x08) //Pulse interrupt
vertinfo 0:e3f0057448f0 111 {
vertinfo 0:e3f0057448f0 112
vertinfo 0:e3f0057448f0 113 reg_pulse_sts = MMA845x::readRegister(PULSE_SRC); //REG 0x22
vertinfo 0:e3f0057448f0 114 if (reg_pulse_sts & 0x40) //Z-axis event
vertinfo 0:e3f0057448f0 115 {
vertinfo 0:e3f0057448f0 116
vertinfo 0:e3f0057448f0 117 if (reg_pulse_sts & 0x08) //Pulse event was double pulse
vertinfo 0:e3f0057448f0 118 {
vertinfo 0:e3f0057448f0 119
vertinfo 0:e3f0057448f0 120
vertinfo 0:e3f0057448f0 121 }
vertinfo 0:e3f0057448f0 122 if (reg_pulse_sts & 0x04)//Z-axis pulse direction
vertinfo 0:e3f0057448f0 123 {
vertinfo 0:e3f0057448f0 124
vertinfo 0:e3f0057448f0 125 }
vertinfo 0:e3f0057448f0 126 _callbackZAxisPulse.call();
vertinfo 0:e3f0057448f0 127
vertinfo 0:e3f0057448f0 128 }
vertinfo 0:e3f0057448f0 129 }
vertinfo 0:e3f0057448f0 130 if (reg_int_sts & 0x04) //Motion interrupt
vertinfo 0:e3f0057448f0 131 {
vertinfo 0:e3f0057448f0 132
vertinfo 0:e3f0057448f0 133 reg_motion_sts = MMA845x::readRegister(FF_MT_SRC); //REG 0x16
vertinfo 0:e3f0057448f0 134 if (reg_motion_sts & 0x02) //
vertinfo 0:e3f0057448f0 135 {
vertinfo 0:e3f0057448f0 136 /*
vertinfo 0:e3f0057448f0 137 if (reg_motion_sts & 0x08) //
vertinfo 0:e3f0057448f0 138 {
vertinfo 0:e3f0057448f0 139
vertinfo 0:e3f0057448f0 140
vertinfo 0:e3f0057448f0 141 }
vertinfo 0:e3f0057448f0 142 if (reg_motion_sts & 0x04)//
vertinfo 0:e3f0057448f0 143 {
vertinfo 0:e3f0057448f0 144
vertinfo 0:e3f0057448f0 145 }
vertinfo 0:e3f0057448f0 146 */
vertinfo 0:e3f0057448f0 147 _callbackZAxisPulse.call();
vertinfo 0:e3f0057448f0 148
vertinfo 0:e3f0057448f0 149 }
vertinfo 0:e3f0057448f0 150 }
vertinfo 0:e3f0057448f0 151 }
vertinfo 0:e3f0057448f0 152
vertinfo 0:e3f0057448f0 153 /* Call this function when a Z-axis pulse detected
vertinfo 0:e3f0057448f0 154 * @param function A C function pointer
vertinfo 0:e3f0057448f0 155 */
vertinfo 0:e3f0057448f0 156 void MMA845x::attachZAxisPulse( void (*function)(void) )
vertinfo 0:e3f0057448f0 157 {
vertinfo 0:e3f0057448f0 158 _callbackZAxisPulse.attach( function );
vertinfo 0:e3f0057448f0 159 }
vertinfo 0:e3f0057448f0 160
vertinfo 0:e3f0057448f0 161 void MMA845x::interrupt_handler(void)
vertinfo 0:e3f0057448f0 162 {
vertinfo 0:e3f0057448f0 163
vertinfo 0:e3f0057448f0 164 uint8_t reg_int_sts;
vertinfo 0:e3f0057448f0 165 uint8_t reg_sts;
vertinfo 0:e3f0057448f0 166 int reg_data[3] = { 0x00, 0x00, 0x00 };
vertinfo 0:e3f0057448f0 167 printf("Int1:");
vertinfo 0:e3f0057448f0 168 reg_int_sts = MMA845x::readRegister(INT_SOURCE); //REG 0x0C
vertinfo 0:e3f0057448f0 169 if((reg_int_sts & 0x01)) //Mask register read with SRC_DRDY bit
vertinfo 0:e3f0057448f0 170 {
vertinfo 0:e3f0057448f0 171 printf(" Data Ready");
vertinfo 0:e3f0057448f0 172 reg_sts = MMA845x::readRegister(STATUS); //REG 0x00
vertinfo 0:e3f0057448f0 173 reg_data[0] = MMA845x::readRegister(OUT_X_MSB); //REG 0x01
vertinfo 0:e3f0057448f0 174 reg_data[1] = MMA845x::readRegister(OUT_Y_MSB); //REG 0x03
vertinfo 0:e3f0057448f0 175 reg_data[2] = MMA845x::readRegister(OUT_Z_MSB); //REG 0x05
vertinfo 0:e3f0057448f0 176 printf(" STATUS: 0x%02X X: %d Y: %d Z: %d\n\r", reg_sts, reg_data[0], reg_data[1], reg_data[2]);
vertinfo 0:e3f0057448f0 177 }
vertinfo 0:e3f0057448f0 178 }
vertinfo 0:e3f0057448f0 179
vertinfo 0:e3f0057448f0 180 void MMA845x::init(void) const
vertinfo 0:e3f0057448f0 181 {
vertinfo 0:e3f0057448f0 182 uint8_t reg_val = 0;
vertinfo 0:e3f0057448f0 183
vertinfo 0:e3f0057448f0 184 _i2c->frequency(400000);
vertinfo 0:e3f0057448f0 185
vertinfo 0:e3f0057448f0 186 // Reset all registers to POR values
vertinfo 0:e3f0057448f0 187 MMA845x::writeRegister(CTRL_REG2, 0x40); //REG 0x2B
vertinfo 0:e3f0057448f0 188 do{
vertinfo 0:e3f0057448f0 189 // wait for the reset bit to clear
vertinfo 0:e3f0057448f0 190 reg_val = MMA845x::readRegister(CTRL_REG2) & 0x40;
vertinfo 0:e3f0057448f0 191 }while(reg_val);
vertinfo 0:e3f0057448f0 192
vertinfo 0:e3f0057448f0 193 // setup the registers that are common among modes
vertinfo 0:e3f0057448f0 194 MMA845x::writeRegister(CTRL_REG1, 0xA0); //REG 0x2A 0x98 = ASLP_RATE: 6.25hz Data Rate: 50hz
vertinfo 0:e3f0057448f0 195 MMA845x::writeRegister(CTRL_REG2, 0x18); //REG 0x2B Setup for low-power, no auto-sleep
vertinfo 0:e3f0057448f0 196 MMA845x::writeRegister(CTRL_REG3, 0x00); //REG 0x2C No interrupts wake device, active low int, push-pull
vertinfo 0:e3f0057448f0 197 MMA845x::writeRegister(CTRL_REG4, 0x00); //REG 0x2D
vertinfo 0:e3f0057448f0 198 MMA845x::writeRegister(CTRL_REG5, 0xFD); //REG 0x2E All interrupt sources to INT1
vertinfo 0:e3f0057448f0 199
vertinfo 0:e3f0057448f0 200 MMA845x::writeRegister(XYZ_DATA_CFG, 0x11); //REG 0x0E HPF / scale +/-2,4,8g
vertinfo 0:e3f0057448f0 201 MMA845x::writeRegister(HP_FILTER_CUTOFF, 0x00); //REG 0x0F HPF settings
vertinfo 0:e3f0057448f0 202
vertinfo 0:e3f0057448f0 203 return;
vertinfo 0:e3f0057448f0 204 }
vertinfo 0:e3f0057448f0 205
vertinfo 0:e3f0057448f0 206 void MMA845x::enableDataReadyMode(void) const
vertinfo 0:e3f0057448f0 207 {
vertinfo 0:e3f0057448f0 208 MMA845x::init();
vertinfo 0:e3f0057448f0 209 //MMA845x::writeRegister(SYSMOD, 0x01); //REG 0x0B This register is read only
vertinfo 0:e3f0057448f0 210 //MMA845x::writeRegister(INT_SOURCE, 0x01); //REG 0x0C This register is read only
vertinfo 0:e3f0057448f0 211 MMA845x::writeRegister(CTRL_REG4, 0x09); //REG 0x2D Enable data ready interrupt
vertinfo 0:e3f0057448f0 212
vertinfo 0:e3f0057448f0 213
vertinfo 0:e3f0057448f0 214
vertinfo 0:e3f0057448f0 215 //MMA845x::writeRegister(CTRL_REG1, 0xA3); //REG 0x2A 0xA3 = ASLP_RATE: 6.25hz Data Rate: 50hz, Fast Read, Active mode
vertinfo 0:e3f0057448f0 216
vertinfo 0:e3f0057448f0 217 MMA845x::writeRegister(XYZ_DATA_CFG, 0x11); //REG 0x0E HPF / scale +/-2,4,8g - Enable HPF
vertinfo 0:e3f0057448f0 218 MMA845x::writeRegister(HP_FILTER_CUTOFF, 0x10); //REG 0x0F HPF settings - HPF for pulse on, 0.25Hz cutoff for 12.5rate
vertinfo 0:e3f0057448f0 219
vertinfo 0:e3f0057448f0 220
vertinfo 0:e3f0057448f0 221 MMA845x::writeRegister(PULSE_CFG, 0x41); //REG 0x21 Setup single pulse in x axis
vertinfo 0:e3f0057448f0 222 MMA845x::writeRegister(PULSE_THSX, 0x09); //REG 0x21 Setup pulse threshold in x axis
vertinfo 0:e3f0057448f0 223 MMA845x::writeRegister(PULSE_TMLT, 0x14); //REG 0x21 Setup single pulse in x axis
vertinfo 0:e3f0057448f0 224 MMA845x::writeRegister(PULSE_LTCY, 0x04); //REG 0x21 Setup single latency in x axis
vertinfo 0:e3f0057448f0 225
vertinfo 0:e3f0057448f0 226
vertinfo 0:e3f0057448f0 227 MMA845x::writeRegister(CTRL_REG1, 0xA1); //REG 0x2A 0x98 = ASLP_RATE: 6.25hz Data Rate: 12.5hz, Normal Read, Active mode
vertinfo 0:e3f0057448f0 228
vertinfo 0:e3f0057448f0 229 }
vertinfo 0:e3f0057448f0 230
vertinfo 0:e3f0057448f0 231 void MMA845x::enableMotionMode(void) const
vertinfo 0:e3f0057448f0 232 {
vertinfo 0:e3f0057448f0 233 MMA845x::init();
vertinfo 0:e3f0057448f0 234
vertinfo 0:e3f0057448f0 235 MMA845x::writeRegister(CTRL_REG4, 0x04); //REG 0x2D Enable pulse interrupt
vertinfo 0:e3f0057448f0 236
vertinfo 0:e3f0057448f0 237 MMA845x::writeRegister(XYZ_DATA_CFG, 0xF1); //REG 0x0E HPF / scale +/-4g, Enable HPF for output data
vertinfo 0:e3f0057448f0 238 MMA845x::writeRegister(HP_FILTER_CUTOFF, 0x00); //REG 0x0F HPF settings - HPF for pulse on, 4Hz cutoff for 100Hz rate
vertinfo 0:e3f0057448f0 239
vertinfo 0:e3f0057448f0 240 MMA845x::writeRegister(FF_MT_CFG, 0xC8); //REG 0x21 Setup
vertinfo 0:e3f0057448f0 241 MMA845x::writeRegister(FF_MT_THS, 0x01); //REG 0x21 Setup
vertinfo 0:e3f0057448f0 242 MMA845x::writeRegister(FF_MT_COUNT, 0x5); //REG 0x21 Setup
vertinfo 0:e3f0057448f0 243
vertinfo 0:e3f0057448f0 244 MMA845x::writeRegister(CTRL_REG2, 0x03); //REG 0x2B Setup for low power mode, no auto-sleep
vertinfo 0:e3f0057448f0 245 MMA845x::writeRegister(CTRL_REG1, 0xA1); //REG 0x2A 0x98 = ASLP_RATE: 6.25hz Data Rate: 12.5Hz, Normal Read, Active mode
vertinfo 0:e3f0057448f0 246
vertinfo 0:e3f0057448f0 247 }
vertinfo 0:e3f0057448f0 248
vertinfo 0:e3f0057448f0 249 void MMA845x::enablePulseMode(void) const
vertinfo 0:e3f0057448f0 250 {
vertinfo 0:e3f0057448f0 251 MMA845x::init();
vertinfo 0:e3f0057448f0 252
vertinfo 0:e3f0057448f0 253 MMA845x::writeRegister(CTRL_REG4, 0x08); //REG 0x2D Enable pulse interrupt
vertinfo 0:e3f0057448f0 254
vertinfo 0:e3f0057448f0 255 MMA845x::writeRegister(XYZ_DATA_CFG, 0xF1); //REG 0x0E HPF / scale +/-2,4,8g - Enable HPF
vertinfo 0:e3f0057448f0 256 MMA845x::writeRegister(HP_FILTER_CUTOFF, 0x00); //REG 0x0F HPF settings - HPF for pulse on, 4Hz cutoff for 100Hz rate
vertinfo 0:e3f0057448f0 257
vertinfo 0:e3f0057448f0 258 MMA845x::writeRegister(PULSE_CFG, 0x50); //REG 0x21 Setup single pulse in z axis
vertinfo 0:e3f0057448f0 259 MMA845x::writeRegister(PULSE_THSX, 0x06); //REG 0x21 Setup pulse threshold in x axis
vertinfo 0:e3f0057448f0 260 MMA845x::writeRegister(PULSE_THSZ, 0x2F); //REG 0x21 Setup pulse threshold in z axis
vertinfo 0:e3f0057448f0 261 MMA845x::writeRegister(PULSE_TMLT, 0x28); //REG 0x21 Setup single pulse
vertinfo 0:e3f0057448f0 262 MMA845x::writeRegister(PULSE_LTCY, 0x0D); //REG 0x21 Setup single latency
vertinfo 0:e3f0057448f0 263 MMA845x::writeRegister(PULSE_WIND, 0x2D); //REG 0x21 Setup double pulse window
vertinfo 0:e3f0057448f0 264
vertinfo 0:e3f0057448f0 265 MMA845x::writeRegister(CTRL_REG2, 0x00); //REG 0x2B Setup for normal power mode, no auto-sleep
vertinfo 0:e3f0057448f0 266 MMA845x::writeRegister(CTRL_REG1, 0x99); //REG 0x2A 0x98 = ASLP_RATE: 6.25hz Data Rate: 100Hz, Normal Read, Active mode
vertinfo 0:e3f0057448f0 267
vertinfo 0:e3f0057448f0 268 }
vertinfo 0:e3f0057448f0 269
vertinfo 0:e3f0057448f0 270 void MMA845x::enableOrientationMode(void) const
vertinfo 0:e3f0057448f0 271 {
vertinfo 0:e3f0057448f0 272 uint16_t who_am_i = MMA845x::readRegister(WHO_AM_I);
vertinfo 0:e3f0057448f0 273 if(who_am_i != MMA8451)
vertinfo 0:e3f0057448f0 274 {
vertinfo 0:e3f0057448f0 275 error("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
vertinfo 0:e3f0057448f0 276 }
vertinfo 0:e3f0057448f0 277
vertinfo 0:e3f0057448f0 278 return;
vertinfo 0:e3f0057448f0 279 }
vertinfo 0:e3f0057448f0 280
vertinfo 0:e3f0057448f0 281 void MMA845x::enableTransitMode(void) const{}
vertinfo 0:e3f0057448f0 282 void MMA845x::enableAutoSleepMode(void) const{}
vertinfo 0:e3f0057448f0 283
vertinfo 0:e3f0057448f0 284 void MMA845x::enableFIFOMode(void) const
vertinfo 0:e3f0057448f0 285 {
vertinfo 0:e3f0057448f0 286 uint16_t who_am_i = MMA845x::readRegister(WHO_AM_I);
vertinfo 0:e3f0057448f0 287 if(who_am_i != MMA8451)
vertinfo 0:e3f0057448f0 288 {
vertinfo 0:e3f0057448f0 289 error("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
vertinfo 0:e3f0057448f0 290 }
vertinfo 0:e3f0057448f0 291
vertinfo 0:e3f0057448f0 292 //MMA845x::writeRegister(
vertinfo 0:e3f0057448f0 293
vertinfo 0:e3f0057448f0 294 return;
vertinfo 0:e3f0057448f0 295 }
vertinfo 0:e3f0057448f0 296
vertinfo 0:e3f0057448f0 297 uint16_t MMA845x::getX(void) const
vertinfo 0:e3f0057448f0 298 {
vertinfo 0:e3f0057448f0 299 return _data._x;
vertinfo 0:e3f0057448f0 300 }
vertinfo 0:e3f0057448f0 301
vertinfo 0:e3f0057448f0 302 uint16_t MMA845x::getY(void) const
vertinfo 0:e3f0057448f0 303 {
vertinfo 0:e3f0057448f0 304 return _data._y;
vertinfo 0:e3f0057448f0 305 }
vertinfo 0:e3f0057448f0 306
vertinfo 0:e3f0057448f0 307 uint16_t MMA845x::getZ(void) const
vertinfo 0:e3f0057448f0 308 {
vertinfo 0:e3f0057448f0 309 return _data._z;
vertinfo 0:e3f0057448f0 310 }
vertinfo 0:e3f0057448f0 311
vertinfo 0:e3f0057448f0 312 MMA845x_DATA MMA845x::getXYZ(void) const
vertinfo 0:e3f0057448f0 313 {
vertinfo 0:e3f0057448f0 314 return _data;
vertinfo 0:e3f0057448f0 315 }
vertinfo 0:e3f0057448f0 316
vertinfo 0:e3f0057448f0 317 void MMA845x::writeRegister(uint8_t const reg, uint8_t const data) const
vertinfo 0:e3f0057448f0 318 {
vertinfo 0:e3f0057448f0 319 char buf[2] = {reg, data};
vertinfo 0:e3f0057448f0 320 uint8_t result = 0;
vertinfo 0:e3f0057448f0 321
vertinfo 0:e3f0057448f0 322 /*
vertinfo 0:e3f0057448f0 323 __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices
vertinfo 0:e3f0057448f0 324 result = _i2c->write(_i2c_addr, buf, 2);
vertinfo 0:e3f0057448f0 325 __enable_irq(); // Just need to block during the transaction
vertinfo 0:e3f0057448f0 326 */
vertinfo 0:e3f0057448f0 327
vertinfo 0:e3f0057448f0 328 result = _i2c->write(_i2c_addr, (const char *)&buf, 2, false);
vertinfo 0:e3f0057448f0 329
vertinfo 0:e3f0057448f0 330 if(0 != result)
vertinfo 0:e3f0057448f0 331 {
vertinfo 0:e3f0057448f0 332 error("%s %d: I2c write failed\n", __FILE__, __LINE__);
vertinfo 0:e3f0057448f0 333 }
vertinfo 0:e3f0057448f0 334
vertinfo 0:e3f0057448f0 335 return;
vertinfo 0:e3f0057448f0 336 }
vertinfo 0:e3f0057448f0 337
vertinfo 0:e3f0057448f0 338 uint8_t MMA845x::readRegister(uint8_t const reg) const
vertinfo 0:e3f0057448f0 339 {
vertinfo 0:e3f0057448f0 340 uint8_t result = 1, data = 0;
vertinfo 0:e3f0057448f0 341 /*
vertinfo 0:e3f0057448f0 342 __disable_irq(); // Tickers and other timebase events can jack up the I2C bus
vertinfo 0:e3f0057448f0 343 _i2c->start();
vertinfo 0:e3f0057448f0 344 result &= _i2c->write(_i2c_addr);
vertinfo 0:e3f0057448f0 345 result &= _i2c->write(reg);
vertinfo 0:e3f0057448f0 346 // issue a repeated start...
vertinfo 0:e3f0057448f0 347 _i2c->start();
vertinfo 0:e3f0057448f0 348 result &= _i2c->write(_i2c_addr | 0x01);
vertinfo 0:e3f0057448f0 349 // read with nak
vertinfo 0:e3f0057448f0 350 data = _i2c->read(0);
vertinfo 0:e3f0057448f0 351 _i2c->stop();
vertinfo 0:e3f0057448f0 352 __enable_irq(); // Just need to block during the transaction
vertinfo 0:e3f0057448f0 353 */
vertinfo 0:e3f0057448f0 354
vertinfo 0:e3f0057448f0 355 result &= _i2c->write(_i2c_addr, (const char *)&reg, 1, true);
vertinfo 0:e3f0057448f0 356 result &= _i2c->read(_i2c_addr, (char *)&data, 1);
vertinfo 0:e3f0057448f0 357
vertinfo 0:e3f0057448f0 358 if(1 != result)
vertinfo 0:e3f0057448f0 359 {
vertinfo 0:e3f0057448f0 360 //error("%s %d: I2C read failed\n", __FILE__, __LINE__);
vertinfo 0:e3f0057448f0 361 }
vertinfo 0:e3f0057448f0 362
vertinfo 0:e3f0057448f0 363 return data;
vertinfo 0:e3f0057448f0 364 }
vertinfo 0:e3f0057448f0 365
vertinfo 0:e3f0057448f0 366 void MMA845x::registerDump(void) const
vertinfo 0:e3f0057448f0 367 {
vertinfo 0:e3f0057448f0 368 uint8_t reg_val = 0;
vertinfo 0:e3f0057448f0 369 printf("Starting register dump...\n\r");
vertinfo 0:e3f0057448f0 370
vertinfo 0:e3f0057448f0 371 for(int i=0; i<0x31; i++)
vertinfo 0:e3f0057448f0 372 {
vertinfo 0:e3f0057448f0 373 reg_val = MMA845x::readRegister(i);
vertinfo 0:e3f0057448f0 374 printf("Reg 0x%02x: 0x%02x \n\r", i, reg_val);
vertinfo 0:e3f0057448f0 375 }
vertinfo 0:e3f0057448f0 376
vertinfo 0:e3f0057448f0 377 return;
vertinfo 0:e3f0057448f0 378 }
vertinfo 0:e3f0057448f0 379