Utilities for BORCH accelerometer BMA250E

Dependents:   MtConnect04S_Bike_Proximity Mt05_MtSense03

Committer:
mtmkimi
Date:
Mon Dec 19 06:07:10 2016 +0000
Revision:
0:8273e9b80c39
Child:
1:b6bb47e17a9a
Initialize BMA250E library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mtmkimi 0:8273e9b80c39 1 /* Copyright (c) 2016 MtM Technology Corporation, MIT License
mtmkimi 0:8273e9b80c39 2 *
mtmkimi 0:8273e9b80c39 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
mtmkimi 0:8273e9b80c39 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
mtmkimi 0:8273e9b80c39 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
mtmkimi 0:8273e9b80c39 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
mtmkimi 0:8273e9b80c39 7 * furnished to do so, subject to the following conditions:
mtmkimi 0:8273e9b80c39 8 *
mtmkimi 0:8273e9b80c39 9 * The above copyright notice and this permission notice shall be included in all copies or
mtmkimi 0:8273e9b80c39 10 * substantial portions of the Software.
mtmkimi 0:8273e9b80c39 11 *
mtmkimi 0:8273e9b80c39 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
mtmkimi 0:8273e9b80c39 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
mtmkimi 0:8273e9b80c39 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
mtmkimi 0:8273e9b80c39 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mtmkimi 0:8273e9b80c39 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
mtmkimi 0:8273e9b80c39 17 */
mtmkimi 0:8273e9b80c39 18 #include "BMA250E.h"
mtmkimi 0:8273e9b80c39 19
mtmkimi 0:8273e9b80c39 20 /*******************************
mtmkimi 0:8273e9b80c39 21 * Public methods
mtmkimi 0:8273e9b80c39 22 *******************************/
mtmkimi 0:8273e9b80c39 23 BMA250E::BMA250E(PinName i2c_sda, PinName i2c_scl, PinName interrupt1_pinname, PinName interrupt2_pinname)
mtmkimi 0:8273e9b80c39 24 : i2c_(i2c_sda, i2c_scl),
mtmkimi 0:8273e9b80c39 25 interrupt1_pinname_(interrupt1_pinname),
mtmkimi 0:8273e9b80c39 26 interrupt1_(interrupt1_pinname),
mtmkimi 0:8273e9b80c39 27 interrupt2_pinname_(interrupt2_pinname),
mtmkimi 0:8273e9b80c39 28 interrupt2_(interrupt2_pinname) {
mtmkimi 0:8273e9b80c39 29 /* Basic */
mtmkimi 0:8273e9b80c39 30 RegWrite(0x14, 0xB6); // softreset
mtmkimi 0:8273e9b80c39 31 RegWrite(0x0F, 0x03); // range((+/-)2G)
mtmkimi 0:8273e9b80c39 32 RegWrite(0x10, 0x0C); // bandwidth(125Hz)
mtmkimi 0:8273e9b80c39 33
mtmkimi 0:8273e9b80c39 34 /* Interrupt */
mtmkimi 0:8273e9b80c39 35 RegWrite(0x16, 0x00); // Disable all interrupts
mtmkimi 0:8273e9b80c39 36 RegWrite(0x17, 0x00); //
mtmkimi 0:8273e9b80c39 37 RegWrite(0x20, 0x00); // int1_od(PP), int1_lvl(Low active), int2_od(PP), int2_lvl(Low active)
mtmkimi 0:8273e9b80c39 38 RegWrite(0x21, 0x80); // reset_int, latch_int(non_latched)
mtmkimi 0:8273e9b80c39 39 }
mtmkimi 0:8273e9b80c39 40
mtmkimi 0:8273e9b80c39 41 void BMA250E::ReadXYZ(int16_t *xyz) {
mtmkimi 0:8273e9b80c39 42 char val[6];
mtmkimi 0:8273e9b80c39 43
mtmkimi 0:8273e9b80c39 44 /* Read raw data */
mtmkimi 0:8273e9b80c39 45 RegRead(0x02, val, sizeof(val));
mtmkimi 0:8273e9b80c39 46 xyz[0] = ((int16_t)val[1] << 8) | (val[0] & 0xC0);
mtmkimi 0:8273e9b80c39 47 xyz[1] = ((int16_t)val[3] << 8) | (val[2] & 0xC0);
mtmkimi 0:8273e9b80c39 48 xyz[2] = ((int16_t)val[5] << 8) | (val[4] & 0xC0);
mtmkimi 0:8273e9b80c39 49
mtmkimi 0:8273e9b80c39 50 /* Align right */
mtmkimi 0:8273e9b80c39 51 xyz[0] >>= 6;
mtmkimi 0:8273e9b80c39 52 xyz[1] >>= 6;
mtmkimi 0:8273e9b80c39 53 xyz[2] >>= 6;
mtmkimi 0:8273e9b80c39 54 }
mtmkimi 0:8273e9b80c39 55
mtmkimi 0:8273e9b80c39 56 void BMA250E::NewData(void(*fptr)(void)) {
mtmkimi 0:8273e9b80c39 57 // TODO
mtmkimi 0:8273e9b80c39 58 }
mtmkimi 0:8273e9b80c39 59 void BMA250E::AnyMotion(void(*fptr)(void)) {
mtmkimi 0:8273e9b80c39 60 // TODO
mtmkimi 0:8273e9b80c39 61 }
mtmkimi 0:8273e9b80c39 62 void BMA250E::TapSening(void(*fptr)(void), bool double_tap) {
mtmkimi 0:8273e9b80c39 63 RegWrite(0x2A, 0x04); // tap_quiet(30ms), tap_shock(50ms), tap_dur(250ms)
mtmkimi 0:8273e9b80c39 64 RegWrite(0x2B, 0x0A); // tap_samp(2samples), tap_th(0x0A)
mtmkimi 0:8273e9b80c39 65
mtmkimi 0:8273e9b80c39 66 if (interrupt1_pinname_ != NC) {
mtmkimi 0:8273e9b80c39 67 /* Interrupt 1 */
mtmkimi 0:8273e9b80c39 68 if (double_tap) {
mtmkimi 0:8273e9b80c39 69 /* Double tap */
mtmkimi 0:8273e9b80c39 70 RegReadModifyWrite(0x19, 0x30, 0x10); // int1_d_tap
mtmkimi 0:8273e9b80c39 71 RegReadModifyWrite(0x16, 0x30, 0x10); // d_tap_en
mtmkimi 0:8273e9b80c39 72 } else {
mtmkimi 0:8273e9b80c39 73 /* Single tap */
mtmkimi 0:8273e9b80c39 74 RegReadModifyWrite(0x19, 0x30, 0x20); // int1_s_tap
mtmkimi 0:8273e9b80c39 75 RegReadModifyWrite(0x16, 0x30, 0x20); // s_tap_en
mtmkimi 0:8273e9b80c39 76 }
mtmkimi 0:8273e9b80c39 77 interrupt1_.mode(PullUp);
mtmkimi 0:8273e9b80c39 78 interrupt1_.fall(fptr);
mtmkimi 0:8273e9b80c39 79 }
mtmkimi 0:8273e9b80c39 80 if (interrupt2_pinname_ != NC) {
mtmkimi 0:8273e9b80c39 81 /* Interrupt 2 */
mtmkimi 0:8273e9b80c39 82 if (double_tap) {
mtmkimi 0:8273e9b80c39 83 /* Double tap */
mtmkimi 0:8273e9b80c39 84 RegReadModifyWrite(0x1B, 0x30, 0x10); // int2_d_tap
mtmkimi 0:8273e9b80c39 85 RegReadModifyWrite(0x16, 0x30, 0x10); // d_tap_en
mtmkimi 0:8273e9b80c39 86 } else {
mtmkimi 0:8273e9b80c39 87 /* Single tap */
mtmkimi 0:8273e9b80c39 88 RegReadModifyWrite(0x1B, 0x30, 0x20); // int2_s_tap
mtmkimi 0:8273e9b80c39 89 RegReadModifyWrite(0x16, 0x30, 0x20); // s_tap_en
mtmkimi 0:8273e9b80c39 90 }
mtmkimi 0:8273e9b80c39 91 interrupt2_.mode(PullUp);
mtmkimi 0:8273e9b80c39 92 interrupt2_.fall(fptr);
mtmkimi 0:8273e9b80c39 93 }
mtmkimi 0:8273e9b80c39 94 }
mtmkimi 0:8273e9b80c39 95 void BMA250E::OrientationRecognition(void(*fptr)(void)) {
mtmkimi 0:8273e9b80c39 96 // TODO
mtmkimi 0:8273e9b80c39 97 }
mtmkimi 0:8273e9b80c39 98 void BMA250E::FlatDetection(void(*fptr)(void)) {
mtmkimi 0:8273e9b80c39 99 // TODO
mtmkimi 0:8273e9b80c39 100 }
mtmkimi 0:8273e9b80c39 101 void BMA250E::LowHighGDetection(void(*fptr)(void), bool high_g) {
mtmkimi 0:8273e9b80c39 102 // TODO
mtmkimi 0:8273e9b80c39 103 }
mtmkimi 0:8273e9b80c39 104 void BMA250E::ShakeDetection(void(*fptr)(void)) {
mtmkimi 0:8273e9b80c39 105 RegWrite(0x28, 0x64); // slope_th(100)
mtmkimi 0:8273e9b80c39 106
mtmkimi 0:8273e9b80c39 107 if (interrupt1_pinname_ != NC) {
mtmkimi 0:8273e9b80c39 108 /* Interrupt 1 */
mtmkimi 0:8273e9b80c39 109 RegReadModifyWrite(0x19, 0x04, 0x04); // int1_slope
mtmkimi 0:8273e9b80c39 110 RegReadModifyWrite(0x16, 0x07, 0x07); // slope_en_z/y/x
mtmkimi 0:8273e9b80c39 111 interrupt1_.mode(PullUp);
mtmkimi 0:8273e9b80c39 112 interrupt1_.fall(fptr);
mtmkimi 0:8273e9b80c39 113 }
mtmkimi 0:8273e9b80c39 114 if (interrupt2_pinname_ != NC) {
mtmkimi 0:8273e9b80c39 115 /* Interrupt 2 */
mtmkimi 0:8273e9b80c39 116 RegReadModifyWrite(0x1B, 0x04, 0x04); // int2_slope
mtmkimi 0:8273e9b80c39 117 RegReadModifyWrite(0x16, 0x07, 0x07); // slope_en_z/y/x
mtmkimi 0:8273e9b80c39 118 interrupt2_.mode(PullUp);
mtmkimi 0:8273e9b80c39 119 interrupt2_.fall(fptr);
mtmkimi 0:8273e9b80c39 120 }
mtmkimi 0:8273e9b80c39 121 }
mtmkimi 0:8273e9b80c39 122
mtmkimi 0:8273e9b80c39 123 void BMA250E::EnterStandbyMode(void)
mtmkimi 0:8273e9b80c39 124 {
mtmkimi 0:8273e9b80c39 125 RegReadModifyWrite(0x12, 0x40, 0x40); // lowpower_mode(1)
mtmkimi 0:8273e9b80c39 126 RegReadModifyWrite(0x11, 0x80, 0x80); // suspend(1)
mtmkimi 0:8273e9b80c39 127 }
mtmkimi 0:8273e9b80c39 128
mtmkimi 0:8273e9b80c39 129 void BMA250E::LeaveStandbyMode(void)
mtmkimi 0:8273e9b80c39 130 {
mtmkimi 0:8273e9b80c39 131 RegReadModifyWrite(0x12, 0x40, 0x40); // lowpower_mode(1)
mtmkimi 0:8273e9b80c39 132 RegReadModifyWrite(0x11, 0x80, 0x00); // suspend(0)
mtmkimi 0:8273e9b80c39 133 }
mtmkimi 0:8273e9b80c39 134
mtmkimi 0:8273e9b80c39 135 /*******************************
mtmkimi 0:8273e9b80c39 136 * Private methods
mtmkimi 0:8273e9b80c39 137 *******************************/
mtmkimi 0:8273e9b80c39 138 void BMA250E::RegWrite(char reg, char val) {
mtmkimi 0:8273e9b80c39 139 char data[2];
mtmkimi 0:8273e9b80c39 140 data[0] = reg;
mtmkimi 0:8273e9b80c39 141 data[1] = val;
mtmkimi 0:8273e9b80c39 142 i2c_.write(BMA250E_SLAVE_ADDR, data, 2, 0);
mtmkimi 0:8273e9b80c39 143 }
mtmkimi 0:8273e9b80c39 144
mtmkimi 0:8273e9b80c39 145 void BMA250E::RegRead(char reg, char *val, int len) {
mtmkimi 0:8273e9b80c39 146 i2c_.write(BMA250E_SLAVE_ADDR, &reg, 1, 0);
mtmkimi 0:8273e9b80c39 147 i2c_.read (BMA250E_SLAVE_ADDR, val, len);
mtmkimi 0:8273e9b80c39 148 }
mtmkimi 0:8273e9b80c39 149
mtmkimi 0:8273e9b80c39 150 void BMA250E::RegReadModifyWrite(char reg, char clr_mask, char set_mask) {
mtmkimi 0:8273e9b80c39 151 char val;
mtmkimi 0:8273e9b80c39 152 RegRead (reg, &val, 1); // Read
mtmkimi 0:8273e9b80c39 153 val = (val & ~clr_mask) | set_mask; // Modify
mtmkimi 0:8273e9b80c39 154 RegWrite(reg, val); // Write
mtmkimi 0:8273e9b80c39 155 }