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