Utilities for BORCH accelerometer BMA250E

Dependents:   MtConnect04S_Bike_Proximity Mt05_MtSense03

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?

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 *******************************/
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, &reg, 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 }