Utilities for BORCH accelerometer BMA250E
Dependents: MtConnect04S_Bike_Proximity Mt05_MtSense03
BMA250E.cpp@1:b6bb47e17a9a, 2018-04-27 (annotated)
- Committer:
- johnathanlyu
- Date:
- Fri Apr 27 09:54:54 2018 +0000
- Revision:
- 1:b6bb47e17a9a
- Parent:
- 0:8273e9b80c39
update library flow
Who changed what in which revision?
User | Revision | Line number | New 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 | *******************************/ |
johnathanlyu | 1:b6bb47e17a9a | 23 | BMA250E::BMA250E(PinName i2c_sda, PinName i2c_scl, PinName interrupt1_pinname, PinName interrupt2_pinname,uint8_t range, uint8_t bandwith) |
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), |
johnathanlyu | 1:b6bb47e17a9a | 28 | interrupt2_(interrupt2_pinname), |
johnathanlyu | 1:b6bb47e17a9a | 29 | range_(range), bandwith_(bandwith) { |
johnathanlyu | 1:b6bb47e17a9a | 30 | |
mtmkimi | 0:8273e9b80c39 | 31 | /* Basic */ |
johnathanlyu | 1:b6bb47e17a9a | 32 | RegWrite(0x14, 0xB6); // softreset |
johnathanlyu | 1:b6bb47e17a9a | 33 | RegWrite(0x0F, range_); // range |
johnathanlyu | 1:b6bb47e17a9a | 34 | RegWrite(0x10, bandwith_); // bandwidth |
mtmkimi | 0:8273e9b80c39 | 35 | |
mtmkimi | 0:8273e9b80c39 | 36 | /* Interrupt */ |
mtmkimi | 0:8273e9b80c39 | 37 | RegWrite(0x16, 0x00); // Disable all interrupts |
mtmkimi | 0:8273e9b80c39 | 38 | RegWrite(0x17, 0x00); // |
johnathanlyu | 1:b6bb47e17a9a | 39 | RegWrite(0x20, 0x00); // int1_od(PP), int1_lvl(Low active), int2_od(PP), int2a_lvl(Low active) |
mtmkimi | 0:8273e9b80c39 | 40 | RegWrite(0x21, 0x80); // reset_int, latch_int(non_latched) |
mtmkimi | 0:8273e9b80c39 | 41 | } |
mtmkimi | 0:8273e9b80c39 | 42 | |
mtmkimi | 0:8273e9b80c39 | 43 | void BMA250E::ReadXYZ(int16_t *xyz) { |
mtmkimi | 0:8273e9b80c39 | 44 | char val[6]; |
mtmkimi | 0:8273e9b80c39 | 45 | |
mtmkimi | 0:8273e9b80c39 | 46 | /* Read raw data */ |
mtmkimi | 0:8273e9b80c39 | 47 | RegRead(0x02, val, sizeof(val)); |
mtmkimi | 0:8273e9b80c39 | 48 | xyz[0] = ((int16_t)val[1] << 8) | (val[0] & 0xC0); |
mtmkimi | 0:8273e9b80c39 | 49 | xyz[1] = ((int16_t)val[3] << 8) | (val[2] & 0xC0); |
mtmkimi | 0:8273e9b80c39 | 50 | xyz[2] = ((int16_t)val[5] << 8) | (val[4] & 0xC0); |
mtmkimi | 0:8273e9b80c39 | 51 | |
mtmkimi | 0:8273e9b80c39 | 52 | /* Align right */ |
mtmkimi | 0:8273e9b80c39 | 53 | xyz[0] >>= 6; |
mtmkimi | 0:8273e9b80c39 | 54 | xyz[1] >>= 6; |
mtmkimi | 0:8273e9b80c39 | 55 | xyz[2] >>= 6; |
johnathanlyu | 1:b6bb47e17a9a | 56 | |
mtmkimi | 0:8273e9b80c39 | 57 | } |
mtmkimi | 0:8273e9b80c39 | 58 | |
mtmkimi | 0:8273e9b80c39 | 59 | void BMA250E::NewData(void(*fptr)(void)) { |
mtmkimi | 0:8273e9b80c39 | 60 | // TODO |
mtmkimi | 0:8273e9b80c39 | 61 | } |
mtmkimi | 0:8273e9b80c39 | 62 | void BMA250E::AnyMotion(void(*fptr)(void)) { |
mtmkimi | 0:8273e9b80c39 | 63 | // TODO |
mtmkimi | 0:8273e9b80c39 | 64 | } |
mtmkimi | 0:8273e9b80c39 | 65 | void BMA250E::TapSening(void(*fptr)(void), bool double_tap) { |
mtmkimi | 0:8273e9b80c39 | 66 | RegWrite(0x2A, 0x04); // tap_quiet(30ms), tap_shock(50ms), tap_dur(250ms) |
mtmkimi | 0:8273e9b80c39 | 67 | RegWrite(0x2B, 0x0A); // tap_samp(2samples), tap_th(0x0A) |
mtmkimi | 0:8273e9b80c39 | 68 | |
mtmkimi | 0:8273e9b80c39 | 69 | if (interrupt1_pinname_ != NC) { |
mtmkimi | 0:8273e9b80c39 | 70 | /* Interrupt 1 */ |
mtmkimi | 0:8273e9b80c39 | 71 | if (double_tap) { |
mtmkimi | 0:8273e9b80c39 | 72 | /* Double tap */ |
mtmkimi | 0:8273e9b80c39 | 73 | RegReadModifyWrite(0x19, 0x30, 0x10); // int1_d_tap |
mtmkimi | 0:8273e9b80c39 | 74 | RegReadModifyWrite(0x16, 0x30, 0x10); // d_tap_en |
mtmkimi | 0:8273e9b80c39 | 75 | } else { |
mtmkimi | 0:8273e9b80c39 | 76 | /* Single tap */ |
mtmkimi | 0:8273e9b80c39 | 77 | RegReadModifyWrite(0x19, 0x30, 0x20); // int1_s_tap |
mtmkimi | 0:8273e9b80c39 | 78 | RegReadModifyWrite(0x16, 0x30, 0x20); // s_tap_en |
mtmkimi | 0:8273e9b80c39 | 79 | } |
mtmkimi | 0:8273e9b80c39 | 80 | interrupt1_.mode(PullUp); |
mtmkimi | 0:8273e9b80c39 | 81 | interrupt1_.fall(fptr); |
mtmkimi | 0:8273e9b80c39 | 82 | } |
mtmkimi | 0:8273e9b80c39 | 83 | if (interrupt2_pinname_ != NC) { |
mtmkimi | 0:8273e9b80c39 | 84 | /* Interrupt 2 */ |
mtmkimi | 0:8273e9b80c39 | 85 | if (double_tap) { |
mtmkimi | 0:8273e9b80c39 | 86 | /* Double tap */ |
mtmkimi | 0:8273e9b80c39 | 87 | RegReadModifyWrite(0x1B, 0x30, 0x10); // int2_d_tap |
mtmkimi | 0:8273e9b80c39 | 88 | RegReadModifyWrite(0x16, 0x30, 0x10); // d_tap_en |
mtmkimi | 0:8273e9b80c39 | 89 | } else { |
mtmkimi | 0:8273e9b80c39 | 90 | /* Single tap */ |
mtmkimi | 0:8273e9b80c39 | 91 | RegReadModifyWrite(0x1B, 0x30, 0x20); // int2_s_tap |
mtmkimi | 0:8273e9b80c39 | 92 | RegReadModifyWrite(0x16, 0x30, 0x20); // s_tap_en |
mtmkimi | 0:8273e9b80c39 | 93 | } |
mtmkimi | 0:8273e9b80c39 | 94 | interrupt2_.mode(PullUp); |
mtmkimi | 0:8273e9b80c39 | 95 | interrupt2_.fall(fptr); |
mtmkimi | 0:8273e9b80c39 | 96 | } |
mtmkimi | 0:8273e9b80c39 | 97 | } |
mtmkimi | 0:8273e9b80c39 | 98 | void BMA250E::OrientationRecognition(void(*fptr)(void)) { |
mtmkimi | 0:8273e9b80c39 | 99 | // TODO |
mtmkimi | 0:8273e9b80c39 | 100 | } |
mtmkimi | 0:8273e9b80c39 | 101 | void BMA250E::FlatDetection(void(*fptr)(void)) { |
mtmkimi | 0:8273e9b80c39 | 102 | // TODO |
mtmkimi | 0:8273e9b80c39 | 103 | } |
mtmkimi | 0:8273e9b80c39 | 104 | void BMA250E::LowHighGDetection(void(*fptr)(void), bool high_g) { |
mtmkimi | 0:8273e9b80c39 | 105 | // TODO |
mtmkimi | 0:8273e9b80c39 | 106 | } |
mtmkimi | 0:8273e9b80c39 | 107 | void BMA250E::ShakeDetection(void(*fptr)(void)) { |
mtmkimi | 0:8273e9b80c39 | 108 | RegWrite(0x28, 0x64); // slope_th(100) |
mtmkimi | 0:8273e9b80c39 | 109 | |
mtmkimi | 0:8273e9b80c39 | 110 | if (interrupt1_pinname_ != NC) { |
mtmkimi | 0:8273e9b80c39 | 111 | /* Interrupt 1 */ |
mtmkimi | 0:8273e9b80c39 | 112 | RegReadModifyWrite(0x19, 0x04, 0x04); // int1_slope |
mtmkimi | 0:8273e9b80c39 | 113 | RegReadModifyWrite(0x16, 0x07, 0x07); // slope_en_z/y/x |
mtmkimi | 0:8273e9b80c39 | 114 | interrupt1_.mode(PullUp); |
mtmkimi | 0:8273e9b80c39 | 115 | interrupt1_.fall(fptr); |
mtmkimi | 0:8273e9b80c39 | 116 | } |
mtmkimi | 0:8273e9b80c39 | 117 | if (interrupt2_pinname_ != NC) { |
mtmkimi | 0:8273e9b80c39 | 118 | /* Interrupt 2 */ |
mtmkimi | 0:8273e9b80c39 | 119 | RegReadModifyWrite(0x1B, 0x04, 0x04); // int2_slope |
mtmkimi | 0:8273e9b80c39 | 120 | RegReadModifyWrite(0x16, 0x07, 0x07); // slope_en_z/y/x |
mtmkimi | 0:8273e9b80c39 | 121 | interrupt2_.mode(PullUp); |
mtmkimi | 0:8273e9b80c39 | 122 | interrupt2_.fall(fptr); |
mtmkimi | 0:8273e9b80c39 | 123 | } |
mtmkimi | 0:8273e9b80c39 | 124 | } |
mtmkimi | 0:8273e9b80c39 | 125 | |
mtmkimi | 0:8273e9b80c39 | 126 | void BMA250E::EnterStandbyMode(void) |
mtmkimi | 0:8273e9b80c39 | 127 | { |
mtmkimi | 0:8273e9b80c39 | 128 | RegReadModifyWrite(0x12, 0x40, 0x40); // lowpower_mode(1) |
mtmkimi | 0:8273e9b80c39 | 129 | RegReadModifyWrite(0x11, 0x80, 0x80); // suspend(1) |
mtmkimi | 0:8273e9b80c39 | 130 | } |
mtmkimi | 0:8273e9b80c39 | 131 | |
mtmkimi | 0:8273e9b80c39 | 132 | void BMA250E::LeaveStandbyMode(void) |
mtmkimi | 0:8273e9b80c39 | 133 | { |
mtmkimi | 0:8273e9b80c39 | 134 | RegReadModifyWrite(0x12, 0x40, 0x40); // lowpower_mode(1) |
mtmkimi | 0:8273e9b80c39 | 135 | RegReadModifyWrite(0x11, 0x80, 0x00); // suspend(0) |
mtmkimi | 0:8273e9b80c39 | 136 | } |
mtmkimi | 0:8273e9b80c39 | 137 | |
mtmkimi | 0:8273e9b80c39 | 138 | /******************************* |
mtmkimi | 0:8273e9b80c39 | 139 | * Private methods |
mtmkimi | 0:8273e9b80c39 | 140 | *******************************/ |
mtmkimi | 0:8273e9b80c39 | 141 | void BMA250E::RegWrite(char reg, char val) { |
mtmkimi | 0:8273e9b80c39 | 142 | char data[2]; |
mtmkimi | 0:8273e9b80c39 | 143 | data[0] = reg; |
mtmkimi | 0:8273e9b80c39 | 144 | data[1] = val; |
mtmkimi | 0:8273e9b80c39 | 145 | i2c_.write(BMA250E_SLAVE_ADDR, data, 2, 0); |
mtmkimi | 0:8273e9b80c39 | 146 | } |
mtmkimi | 0:8273e9b80c39 | 147 | |
mtmkimi | 0:8273e9b80c39 | 148 | void BMA250E::RegRead(char reg, char *val, int len) { |
mtmkimi | 0:8273e9b80c39 | 149 | i2c_.write(BMA250E_SLAVE_ADDR, ®, 1, 0); |
mtmkimi | 0:8273e9b80c39 | 150 | i2c_.read (BMA250E_SLAVE_ADDR, val, len); |
mtmkimi | 0:8273e9b80c39 | 151 | } |
mtmkimi | 0:8273e9b80c39 | 152 | |
mtmkimi | 0:8273e9b80c39 | 153 | void BMA250E::RegReadModifyWrite(char reg, char clr_mask, char set_mask) { |
mtmkimi | 0:8273e9b80c39 | 154 | char val; |
mtmkimi | 0:8273e9b80c39 | 155 | RegRead (reg, &val, 1); // Read |
mtmkimi | 0:8273e9b80c39 | 156 | val = (val & ~clr_mask) | set_mask; // Modify |
mtmkimi | 0:8273e9b80c39 | 157 | RegWrite(reg, val); // Write |
johnathanlyu | 1:b6bb47e17a9a | 158 | } |