first try tap on rig
Dependencies: BLE_API PinDetect mbed-src-bmd-200
MMA845x.cpp@0:e3f0057448f0, 2015-07-21 (annotated)
- Committer:
- vertinfo
- Date:
- Tue Jul 21 00:22:23 2015 +0000
- Revision:
- 0:e3f0057448f0
init;
Who changed what in which revision?
User | Revision | Line number | New 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 *)®, 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 |