test publish

Dependencies:   BLE_API nRF51822 mbed

Fork of KS7 by masaaki makabe

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?

UserRevisionLine numberNew 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 *)&reg, 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