Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MMA845x by
MMA845x.cpp@14:683234dfe179, 2018-07-04 (annotated)
- Committer:
- amateusz
- Date:
- Wed Jul 04 23:07:03 2018 +0000
- Revision:
- 14:683234dfe179
- Parent:
- 13:77a8994b3bb2
- Child:
- 16:eefd7fc1b19f
implemented single tap setup
Who changed what in which revision?
| User | Revision | Line number | New 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 | |
| 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 | 14:683234dfe179 | 150 | 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 | 13:77a8994b3bb2 | 167 | 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 | } |
