Testsetup BMI088 (SEED), gyro ok, Acc Problem T:\T-IMS-IndNav\01_Technisches\70_Hardwareentwicklung\20190828_083342.jpg
Dependencies: mbed
BMI088.cpp@0:577a6606809f, 2019-08-28 (annotated)
- Committer:
- altb2
- Date:
- Wed Aug 28 08:32:22 2019 +0000
- Revision:
- 0:577a6606809f
First implement, ; acc does not work (it worked once!)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
altb2 | 0:577a6606809f | 1 | /* |
altb2 | 0:577a6606809f | 2 | * A library for Grove - 6-Axis Accelerometer&Gyroscope(BMI088) |
altb2 | 0:577a6606809f | 3 | * |
altb2 | 0:577a6606809f | 4 | * Copyright (c) 2018 seeed technology co., ltd. |
altb2 | 0:577a6606809f | 5 | * Author : Wayen Weng |
altb2 | 0:577a6606809f | 6 | * Create Time : June 2018 |
altb2 | 0:577a6606809f | 7 | * Change Log : |
altb2 | 0:577a6606809f | 8 | * |
altb2 | 0:577a6606809f | 9 | * The MIT License (MIT) |
altb2 | 0:577a6606809f | 10 | * |
altb2 | 0:577a6606809f | 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
altb2 | 0:577a6606809f | 12 | * of this software and associated documentation files (the "Software"), to deal |
altb2 | 0:577a6606809f | 13 | * in the Software without restriction, including without limitation the rights |
altb2 | 0:577a6606809f | 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
altb2 | 0:577a6606809f | 15 | * copies of the Software, and to permit persons to whom the Software is |
altb2 | 0:577a6606809f | 16 | * furnished to do so, subject to the following conditions: |
altb2 | 0:577a6606809f | 17 | * |
altb2 | 0:577a6606809f | 18 | * The above copyright notice and this permission notice shall be included in |
altb2 | 0:577a6606809f | 19 | * all copies or substantial portions of the Software. |
altb2 | 0:577a6606809f | 20 | * |
altb2 | 0:577a6606809f | 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
altb2 | 0:577a6606809f | 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
altb2 | 0:577a6606809f | 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
altb2 | 0:577a6606809f | 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
altb2 | 0:577a6606809f | 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
altb2 | 0:577a6606809f | 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
altb2 | 0:577a6606809f | 27 | * THE SOFTWARE. |
altb2 | 0:577a6606809f | 28 | */ |
altb2 | 0:577a6606809f | 29 | |
altb2 | 0:577a6606809f | 30 | #include "BMI088.h" |
altb2 | 0:577a6606809f | 31 | |
altb2 | 0:577a6606809f | 32 | BMI088::BMI088(void) : i2c(PA_10,PA_9)//L432KC |
altb2 | 0:577a6606809f | 33 | { |
altb2 | 0:577a6606809f | 34 | devAddrAcc = BMI088_ACC_ADDRESS; |
altb2 | 0:577a6606809f | 35 | devAddrGyro = BMI088_GYRO_ADDRESS; |
altb2 | 0:577a6606809f | 36 | i2c.frequency(100000); |
altb2 | 0:577a6606809f | 37 | |
altb2 | 0:577a6606809f | 38 | } |
altb2 | 0:577a6606809f | 39 | |
altb2 | 0:577a6606809f | 40 | void BMI088::initialize(void) |
altb2 | 0:577a6606809f | 41 | { |
altb2 | 0:577a6606809f | 42 | setAccPoweMode(ACC_ACTIVE); |
altb2 | 0:577a6606809f | 43 | wait_ms(150); |
altb2 | 0:577a6606809f | 44 | // setAccOutputDataRate(ODR_25); |
altb2 | 0:577a6606809f | 45 | wait_ms(50); |
altb2 | 0:577a6606809f | 46 | setAccScaleRange(RANGE_3G); |
altb2 | 0:577a6606809f | 47 | |
altb2 | 0:577a6606809f | 48 | setGyroScaleRange(RANGE_500); |
altb2 | 0:577a6606809f | 49 | setGyroOutputDataRate(ODR_200_BW_23); |
altb2 | 0:577a6606809f | 50 | setGyroPoweMode(GYRO_NORMAL); |
altb2 | 0:577a6606809f | 51 | } |
altb2 | 0:577a6606809f | 52 | |
altb2 | 0:577a6606809f | 53 | bool BMI088::isConnection(void) |
altb2 | 0:577a6606809f | 54 | { |
altb2 | 0:577a6606809f | 55 | uint8_t val1 = getGyroID(); |
altb2 | 0:577a6606809f | 56 | uint8_t val2 = getAccID(); |
altb2 | 0:577a6606809f | 57 | return ((val1 == 0x0F) && (val2 == 0x1E)); |
altb2 | 0:577a6606809f | 58 | } |
altb2 | 0:577a6606809f | 59 | |
altb2 | 0:577a6606809f | 60 | void BMI088::resetAcc(void) |
altb2 | 0:577a6606809f | 61 | { |
altb2 | 0:577a6606809f | 62 | write8(ACC, BMI088_ACC_SOFT_RESET, 0xB6); |
altb2 | 0:577a6606809f | 63 | } |
altb2 | 0:577a6606809f | 64 | |
altb2 | 0:577a6606809f | 65 | void BMI088::resetGyro(void) |
altb2 | 0:577a6606809f | 66 | { |
altb2 | 0:577a6606809f | 67 | write8(GYRO, BMI088_GYRO_SOFT_RESET, 0xB6); |
altb2 | 0:577a6606809f | 68 | } |
altb2 | 0:577a6606809f | 69 | |
altb2 | 0:577a6606809f | 70 | uint8_t BMI088::getAccID(void) |
altb2 | 0:577a6606809f | 71 | { |
altb2 | 0:577a6606809f | 72 | return read8(ACC, BMI088_ACC_CHIP_ID); |
altb2 | 0:577a6606809f | 73 | } |
altb2 | 0:577a6606809f | 74 | |
altb2 | 0:577a6606809f | 75 | uint8_t BMI088::getGyroID(void) |
altb2 | 0:577a6606809f | 76 | { |
altb2 | 0:577a6606809f | 77 | return read8(GYRO, BMI088_GYRO_CHIP_ID); |
altb2 | 0:577a6606809f | 78 | } |
altb2 | 0:577a6606809f | 79 | |
altb2 | 0:577a6606809f | 80 | void BMI088::setAccPoweMode(acc_power_type_t mode) |
altb2 | 0:577a6606809f | 81 | { |
altb2 | 0:577a6606809f | 82 | if(mode == ACC_ACTIVE) |
altb2 | 0:577a6606809f | 83 | { |
altb2 | 0:577a6606809f | 84 | write8(ACC, BMI088_ACC_PWR_CTRl, 0x04); |
altb2 | 0:577a6606809f | 85 | write8(ACC, BMI088_ACC_PWR_CONF, 0x00); |
altb2 | 0:577a6606809f | 86 | } |
altb2 | 0:577a6606809f | 87 | else if(mode == ACC_SUSPEND) |
altb2 | 0:577a6606809f | 88 | { |
altb2 | 0:577a6606809f | 89 | write8(ACC, BMI088_ACC_PWR_CONF, 0x03); |
altb2 | 0:577a6606809f | 90 | write8(ACC, BMI088_ACC_PWR_CTRl, 0x00); |
altb2 | 0:577a6606809f | 91 | } |
altb2 | 0:577a6606809f | 92 | } |
altb2 | 0:577a6606809f | 93 | |
altb2 | 0:577a6606809f | 94 | void BMI088::setGyroPoweMode(gyro_power_type_t mode) |
altb2 | 0:577a6606809f | 95 | { |
altb2 | 0:577a6606809f | 96 | if(mode == GYRO_NORMAL) |
altb2 | 0:577a6606809f | 97 | { |
altb2 | 0:577a6606809f | 98 | write8(GYRO, BMI088_GYRO_LPM_1, (uint8_t)GYRO_NORMAL); |
altb2 | 0:577a6606809f | 99 | } |
altb2 | 0:577a6606809f | 100 | else if(mode == GYRO_SUSPEND) |
altb2 | 0:577a6606809f | 101 | { |
altb2 | 0:577a6606809f | 102 | write8(GYRO, BMI088_GYRO_LPM_1, (uint8_t)GYRO_SUSPEND); |
altb2 | 0:577a6606809f | 103 | } |
altb2 | 0:577a6606809f | 104 | else if(mode == GYRO_DEEP_SUSPEND) |
altb2 | 0:577a6606809f | 105 | { |
altb2 | 0:577a6606809f | 106 | write8(GYRO, BMI088_GYRO_LPM_1, (uint8_t)GYRO_DEEP_SUSPEND); |
altb2 | 0:577a6606809f | 107 | } |
altb2 | 0:577a6606809f | 108 | } |
altb2 | 0:577a6606809f | 109 | |
altb2 | 0:577a6606809f | 110 | void BMI088::setAccScaleRange(acc_scale_type_t range) |
altb2 | 0:577a6606809f | 111 | { |
altb2 | 0:577a6606809f | 112 | if(range == RANGE_3G) accRange = 3000; |
altb2 | 0:577a6606809f | 113 | else if(range == RANGE_6G) accRange = 6000; |
altb2 | 0:577a6606809f | 114 | else if(range == RANGE_12G) accRange = 12000; |
altb2 | 0:577a6606809f | 115 | else if(range == RANGE_24G) accRange = 24000; |
altb2 | 0:577a6606809f | 116 | |
altb2 | 0:577a6606809f | 117 | write8(ACC, BMI088_ACC_RANGE, (uint8_t)range); |
altb2 | 0:577a6606809f | 118 | } |
altb2 | 0:577a6606809f | 119 | |
altb2 | 0:577a6606809f | 120 | void BMI088::setAccOutputDataRate(acc_odr_type_t odr) |
altb2 | 0:577a6606809f | 121 | { |
altb2 | 0:577a6606809f | 122 | uint8_t data = 0; |
altb2 | 0:577a6606809f | 123 | |
altb2 | 0:577a6606809f | 124 | data = read8(ACC, BMI088_ACC_CONF); |
altb2 | 0:577a6606809f | 125 | data = data & 0xf0; // get higher 4 bits |
altb2 | 0:577a6606809f | 126 | data = data | (uint8_t)odr; |
altb2 | 0:577a6606809f | 127 | wait_ms(10); |
altb2 | 0:577a6606809f | 128 | write8(ACC, BMI088_ACC_CONF, data); |
altb2 | 0:577a6606809f | 129 | } |
altb2 | 0:577a6606809f | 130 | |
altb2 | 0:577a6606809f | 131 | void BMI088::setGyroScaleRange(gyro_scale_type_t range) |
altb2 | 0:577a6606809f | 132 | { |
altb2 | 0:577a6606809f | 133 | if(range == RANGE_2000) gyroRange = 2000; |
altb2 | 0:577a6606809f | 134 | else if(range == RANGE_1000) gyroRange = 1000; |
altb2 | 0:577a6606809f | 135 | else if(range == RANGE_500) gyroRange = 500; |
altb2 | 0:577a6606809f | 136 | else if(range == RANGE_250) gyroRange = 250; |
altb2 | 0:577a6606809f | 137 | else if(range == RANGE_125) gyroRange = 125; |
altb2 | 0:577a6606809f | 138 | |
altb2 | 0:577a6606809f | 139 | write8(GYRO, BMI088_GYRO_RANGE, (uint8_t)range); |
altb2 | 0:577a6606809f | 140 | } |
altb2 | 0:577a6606809f | 141 | |
altb2 | 0:577a6606809f | 142 | void BMI088::setGyroOutputDataRate(gyro_odr_type_t odr) |
altb2 | 0:577a6606809f | 143 | { |
altb2 | 0:577a6606809f | 144 | write8(GYRO, BMI088_GYRO_BAND_WIDTH, (uint8_t)odr); |
altb2 | 0:577a6606809f | 145 | } |
altb2 | 0:577a6606809f | 146 | |
altb2 | 0:577a6606809f | 147 | void BMI088::getAcceleration(float* x, float* y, float* z) |
altb2 | 0:577a6606809f | 148 | { |
altb2 | 0:577a6606809f | 149 | char buf[6] = {0}; |
altb2 | 0:577a6606809f | 150 | uint16_t ax = 0, ay = 0, az = 0; |
altb2 | 0:577a6606809f | 151 | int16_t value = 0; |
altb2 | 0:577a6606809f | 152 | |
altb2 | 0:577a6606809f | 153 | read(ACC, BMI088_ACC_X_LSB, buf, 6); |
altb2 | 0:577a6606809f | 154 | |
altb2 | 0:577a6606809f | 155 | //printf("ACCBUFF: %02X %02X %02X %02X %02X %02X\r\n",buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]); |
altb2 | 0:577a6606809f | 156 | ax = buf[0] | (buf[1] << 8); |
altb2 | 0:577a6606809f | 157 | ay = buf[2] | (buf[3] << 8); |
altb2 | 0:577a6606809f | 158 | az = buf[4] | (buf[5] << 8); |
altb2 | 0:577a6606809f | 159 | |
altb2 | 0:577a6606809f | 160 | value = (int16_t)ax; |
altb2 | 0:577a6606809f | 161 | *x = accRange * value / 32768000 * 9.81f; // units: m/s^2 |
altb2 | 0:577a6606809f | 162 | |
altb2 | 0:577a6606809f | 163 | value = (int16_t)ay; |
altb2 | 0:577a6606809f | 164 | *y = accRange * value / 32768000 * 9.81f; // units: m/s^2 |
altb2 | 0:577a6606809f | 165 | |
altb2 | 0:577a6606809f | 166 | value = (int16_t)az; |
altb2 | 0:577a6606809f | 167 | *z = accRange * value / 32768000 * 9.81f; // units: m/s^2 |
altb2 | 0:577a6606809f | 168 | } |
altb2 | 0:577a6606809f | 169 | |
altb2 | 0:577a6606809f | 170 | float BMI088::getAccelerationX(void) |
altb2 | 0:577a6606809f | 171 | { |
altb2 | 0:577a6606809f | 172 | uint16_t ax = 0; |
altb2 | 0:577a6606809f | 173 | float value = 0; |
altb2 | 0:577a6606809f | 174 | |
altb2 | 0:577a6606809f | 175 | ax = read16(ACC, BMI088_ACC_X_LSB); |
altb2 | 0:577a6606809f | 176 | |
altb2 | 0:577a6606809f | 177 | value = (int16_t)ax; |
altb2 | 0:577a6606809f | 178 | value = accRange * value / 32768000 * 9.81f; // units: m/s^2 |
altb2 | 0:577a6606809f | 179 | |
altb2 | 0:577a6606809f | 180 | return value; |
altb2 | 0:577a6606809f | 181 | } |
altb2 | 0:577a6606809f | 182 | |
altb2 | 0:577a6606809f | 183 | float BMI088::getAccelerationY(void) |
altb2 | 0:577a6606809f | 184 | { |
altb2 | 0:577a6606809f | 185 | uint16_t ay = 0; |
altb2 | 0:577a6606809f | 186 | float value = 0; |
altb2 | 0:577a6606809f | 187 | |
altb2 | 0:577a6606809f | 188 | ay = read16(ACC, BMI088_ACC_Y_LSB); |
altb2 | 0:577a6606809f | 189 | |
altb2 | 0:577a6606809f | 190 | value = (int16_t)ay; |
altb2 | 0:577a6606809f | 191 | value = accRange * value / 32768000 * 9.81f; // units: m/s^2 |
altb2 | 0:577a6606809f | 192 | |
altb2 | 0:577a6606809f | 193 | return value; |
altb2 | 0:577a6606809f | 194 | } |
altb2 | 0:577a6606809f | 195 | |
altb2 | 0:577a6606809f | 196 | float BMI088::getAccelerationZ(void) |
altb2 | 0:577a6606809f | 197 | { |
altb2 | 0:577a6606809f | 198 | uint16_t az = 0; |
altb2 | 0:577a6606809f | 199 | float value = 0; |
altb2 | 0:577a6606809f | 200 | |
altb2 | 0:577a6606809f | 201 | az = read16(ACC, BMI088_ACC_Z_LSB); |
altb2 | 0:577a6606809f | 202 | |
altb2 | 0:577a6606809f | 203 | |
altb2 | 0:577a6606809f | 204 | value = (int16_t)az; |
altb2 | 0:577a6606809f | 205 | value = accRange * value / 32768000 * 9.81f; // units: m/s^2 |
altb2 | 0:577a6606809f | 206 | |
altb2 | 0:577a6606809f | 207 | return value; |
altb2 | 0:577a6606809f | 208 | } |
altb2 | 0:577a6606809f | 209 | |
altb2 | 0:577a6606809f | 210 | void BMI088::getGyroscope(float* x, float* y, float* z) |
altb2 | 0:577a6606809f | 211 | { |
altb2 | 0:577a6606809f | 212 | char buf[6] = {0}; |
altb2 | 0:577a6606809f | 213 | uint16_t gx = 0, gy = 0, gz = 0; |
altb2 | 0:577a6606809f | 214 | int16_t value = 0; |
altb2 | 0:577a6606809f | 215 | |
altb2 | 0:577a6606809f | 216 | read(GYRO, BMI088_GYRO_RATE_X_LSB, buf, 6); |
altb2 | 0:577a6606809f | 217 | |
altb2 | 0:577a6606809f | 218 | gx = buf[0] | (buf[1] << 8); |
altb2 | 0:577a6606809f | 219 | gy = buf[2] | (buf[3] << 8); |
altb2 | 0:577a6606809f | 220 | gz = buf[4] | (buf[5] << 8); |
altb2 | 0:577a6606809f | 221 | |
altb2 | 0:577a6606809f | 222 | value = (int16_t)gx; |
altb2 | 0:577a6606809f | 223 | *x = gyroRange * value / 32768 * 3.1415927f/180.0f; |
altb2 | 0:577a6606809f | 224 | |
altb2 | 0:577a6606809f | 225 | value = (int16_t)gy; |
altb2 | 0:577a6606809f | 226 | *y = gyroRange * value / 32768 * 3.1415927f/180.0f; |
altb2 | 0:577a6606809f | 227 | |
altb2 | 0:577a6606809f | 228 | value = (int16_t)gz; |
altb2 | 0:577a6606809f | 229 | *z = gyroRange * value / 32768 * 3.1415927f/180.0f; |
altb2 | 0:577a6606809f | 230 | } |
altb2 | 0:577a6606809f | 231 | |
altb2 | 0:577a6606809f | 232 | float BMI088::getGyroscopeX(void) |
altb2 | 0:577a6606809f | 233 | { |
altb2 | 0:577a6606809f | 234 | uint16_t gx = 0; |
altb2 | 0:577a6606809f | 235 | float value = 0; |
altb2 | 0:577a6606809f | 236 | |
altb2 | 0:577a6606809f | 237 | gx = read16(GYRO, BMI088_GYRO_RATE_X_LSB); |
altb2 | 0:577a6606809f | 238 | |
altb2 | 0:577a6606809f | 239 | value = (int16_t)gx; |
altb2 | 0:577a6606809f | 240 | value = gyroRange * value / 32768 * 3.1415927f/180.0f; |
altb2 | 0:577a6606809f | 241 | |
altb2 | 0:577a6606809f | 242 | return value; |
altb2 | 0:577a6606809f | 243 | } |
altb2 | 0:577a6606809f | 244 | |
altb2 | 0:577a6606809f | 245 | float BMI088::getGyroscopeY(void) |
altb2 | 0:577a6606809f | 246 | { |
altb2 | 0:577a6606809f | 247 | uint16_t gy = 0; |
altb2 | 0:577a6606809f | 248 | float value = 0; |
altb2 | 0:577a6606809f | 249 | |
altb2 | 0:577a6606809f | 250 | gy = read16(GYRO, BMI088_GYRO_RATE_Y_LSB); |
altb2 | 0:577a6606809f | 251 | |
altb2 | 0:577a6606809f | 252 | value = (int16_t)gy; |
altb2 | 0:577a6606809f | 253 | value = gyroRange * value / 32768 * 3.1415927f/180.0f; |
altb2 | 0:577a6606809f | 254 | |
altb2 | 0:577a6606809f | 255 | return value; |
altb2 | 0:577a6606809f | 256 | } |
altb2 | 0:577a6606809f | 257 | |
altb2 | 0:577a6606809f | 258 | float BMI088::getGyroscopeZ(void) |
altb2 | 0:577a6606809f | 259 | { |
altb2 | 0:577a6606809f | 260 | uint16_t gz = 0; |
altb2 | 0:577a6606809f | 261 | float value = 0; |
altb2 | 0:577a6606809f | 262 | |
altb2 | 0:577a6606809f | 263 | gz = read16(GYRO, BMI088_GYRO_RATE_Z_LSB); |
altb2 | 0:577a6606809f | 264 | |
altb2 | 0:577a6606809f | 265 | value = (int16_t)gz; |
altb2 | 0:577a6606809f | 266 | value = gyroRange * value / 32768 * 3.1415927f/180.0f; |
altb2 | 0:577a6606809f | 267 | |
altb2 | 0:577a6606809f | 268 | return value; |
altb2 | 0:577a6606809f | 269 | } |
altb2 | 0:577a6606809f | 270 | |
altb2 | 0:577a6606809f | 271 | uint16_t BMI088::getTemperature(void) |
altb2 | 0:577a6606809f | 272 | { |
altb2 | 0:577a6606809f | 273 | uint16_t data = 0; |
altb2 | 0:577a6606809f | 274 | |
altb2 | 0:577a6606809f | 275 | data = read16Be(ACC, BMI088_ACC_TEMP_MSB); |
altb2 | 0:577a6606809f | 276 | data = data >> 5; |
altb2 | 0:577a6606809f | 277 | |
altb2 | 0:577a6606809f | 278 | if(data > 1023) data = data - 2048; |
altb2 | 0:577a6606809f | 279 | |
altb2 | 0:577a6606809f | 280 | return (uint16_t)(data / 8 + 23); |
altb2 | 0:577a6606809f | 281 | } |
altb2 | 0:577a6606809f | 282 | |
altb2 | 0:577a6606809f | 283 | void BMI088::write8(device_type_t dev, char reg, uint8_t val) |
altb2 | 0:577a6606809f | 284 | { |
altb2 | 0:577a6606809f | 285 | int addr = 0; |
altb2 | 0:577a6606809f | 286 | |
altb2 | 0:577a6606809f | 287 | if(dev) addr = devAddrGyro; |
altb2 | 0:577a6606809f | 288 | else addr = devAddrAcc; |
altb2 | 0:577a6606809f | 289 | |
altb2 | 0:577a6606809f | 290 | int succw = i2c.write(addr, ®, val); |
altb2 | 0:577a6606809f | 291 | // printf("Write 8 succes: %d\r\n",succw); |
altb2 | 0:577a6606809f | 292 | |
altb2 | 0:577a6606809f | 293 | /*Wire.beginTransmission(addr); |
altb2 | 0:577a6606809f | 294 | Wire.write(reg); |
altb2 | 0:577a6606809f | 295 | Wire.write(val); |
altb2 | 0:577a6606809f | 296 | Wire.endTransmission();*/ |
altb2 | 0:577a6606809f | 297 | } |
altb2 | 0:577a6606809f | 298 | |
altb2 | 0:577a6606809f | 299 | char BMI088::read8(device_type_t dev, char reg) |
altb2 | 0:577a6606809f | 300 | { |
altb2 | 0:577a6606809f | 301 | int addr =0;; |
altb2 | 0:577a6606809f | 302 | char data = 0; |
altb2 | 0:577a6606809f | 303 | |
altb2 | 0:577a6606809f | 304 | if(dev) addr = devAddrGyro; |
altb2 | 0:577a6606809f | 305 | else addr = devAddrAcc; |
altb2 | 0:577a6606809f | 306 | |
altb2 | 0:577a6606809f | 307 | int succw = i2c.write(addr, ®, 0x01); |
altb2 | 0:577a6606809f | 308 | int succr = i2c.read( addr, &data, 0x01); |
altb2 | 0:577a6606809f | 309 | |
altb2 | 0:577a6606809f | 310 | /*Wire.beginTransmission(addr); |
altb2 | 0:577a6606809f | 311 | Wire.write(reg); |
altb2 | 0:577a6606809f | 312 | Wire.endTransmission(); |
altb2 | 0:577a6606809f | 313 | |
altb2 | 0:577a6606809f | 314 | Wire.requestFrom(addr, 1); |
altb2 | 0:577a6606809f | 315 | while(Wire.available()) |
altb2 | 0:577a6606809f | 316 | { |
altb2 | 0:577a6606809f | 317 | data = Wire.read(); |
altb2 | 0:577a6606809f | 318 | } |
altb2 | 0:577a6606809f | 319 | */ |
altb2 | 0:577a6606809f | 320 | return data; |
altb2 | 0:577a6606809f | 321 | } |
altb2 | 0:577a6606809f | 322 | |
altb2 | 0:577a6606809f | 323 | uint16_t BMI088::read16(device_type_t dev, char reg) |
altb2 | 0:577a6606809f | 324 | { |
altb2 | 0:577a6606809f | 325 | int addr = 0; |
altb2 | 0:577a6606809f | 326 | char buf[2]; |
altb2 | 0:577a6606809f | 327 | |
altb2 | 0:577a6606809f | 328 | if(dev) addr = devAddrGyro; |
altb2 | 0:577a6606809f | 329 | else addr = devAddrAcc; |
altb2 | 0:577a6606809f | 330 | |
altb2 | 0:577a6606809f | 331 | int succw = i2c.write(addr, ®, 0x01); |
altb2 | 0:577a6606809f | 332 | int succr = i2c.read( addr, buf, 0x02); |
altb2 | 0:577a6606809f | 333 | |
altb2 | 0:577a6606809f | 334 | |
altb2 | 0:577a6606809f | 335 | /*Wire.beginTransmission(addr); |
altb2 | 0:577a6606809f | 336 | Wire.write(reg); |
altb2 | 0:577a6606809f | 337 | Wire.endTransmission(); |
altb2 | 0:577a6606809f | 338 | |
altb2 | 0:577a6606809f | 339 | Wire.requestFrom(addr, 2); |
altb2 | 0:577a6606809f | 340 | while(Wire.available()) |
altb2 | 0:577a6606809f | 341 | { |
altb2 | 0:577a6606809f | 342 | lsb = Wire.read(); |
altb2 | 0:577a6606809f | 343 | msb = Wire.read(); |
altb2 | 0:577a6606809f | 344 | } |
altb2 | 0:577a6606809f | 345 | */ |
altb2 | 0:577a6606809f | 346 | return (buf[0] | (buf[1] << 8)); |
altb2 | 0:577a6606809f | 347 | } |
altb2 | 0:577a6606809f | 348 | |
altb2 | 0:577a6606809f | 349 | uint16_t BMI088::read16Be(device_type_t dev, char reg) |
altb2 | 0:577a6606809f | 350 | { |
altb2 | 0:577a6606809f | 351 | uint8_t addr = 0; |
altb2 | 0:577a6606809f | 352 | uint16_t msb = 0, lsb = 0; |
altb2 | 0:577a6606809f | 353 | |
altb2 | 0:577a6606809f | 354 | if(dev) addr = devAddrGyro; |
altb2 | 0:577a6606809f | 355 | else addr = devAddrAcc; |
altb2 | 0:577a6606809f | 356 | |
altb2 | 0:577a6606809f | 357 | /* Wire.beginTransmission(addr); |
altb2 | 0:577a6606809f | 358 | Wire.write(reg); |
altb2 | 0:577a6606809f | 359 | Wire.endTransmission(); |
altb2 | 0:577a6606809f | 360 | |
altb2 | 0:577a6606809f | 361 | Wire.requestFrom(addr, 2); |
altb2 | 0:577a6606809f | 362 | while(Wire.available()) |
altb2 | 0:577a6606809f | 363 | { |
altb2 | 0:577a6606809f | 364 | msb = Wire.read(); |
altb2 | 0:577a6606809f | 365 | lsb = Wire.read(); |
altb2 | 0:577a6606809f | 366 | } |
altb2 | 0:577a6606809f | 367 | */ |
altb2 | 0:577a6606809f | 368 | return (lsb | (msb << 8)); |
altb2 | 0:577a6606809f | 369 | } |
altb2 | 0:577a6606809f | 370 | |
altb2 | 0:577a6606809f | 371 | uint32_t BMI088::read24(device_type_t dev, char reg) |
altb2 | 0:577a6606809f | 372 | { |
altb2 | 0:577a6606809f | 373 | int addr; |
altb2 | 0:577a6606809f | 374 | char data = 0; |
altb2 | 0:577a6606809f | 375 | |
altb2 | 0:577a6606809f | 376 | if(dev) addr = devAddrGyro; |
altb2 | 0:577a6606809f | 377 | else addr = devAddrAcc; |
altb2 | 0:577a6606809f | 378 | |
altb2 | 0:577a6606809f | 379 | /* Wire.beginTransmission(addr); |
altb2 | 0:577a6606809f | 380 | Wire.write(reg); |
altb2 | 0:577a6606809f | 381 | Wire.endTransmission(); |
altb2 | 0:577a6606809f | 382 | |
altb2 | 0:577a6606809f | 383 | Wire.requestFrom(addr, 3); |
altb2 | 0:577a6606809f | 384 | while(Wire.available()) |
altb2 | 0:577a6606809f | 385 | { |
altb2 | 0:577a6606809f | 386 | lsb = Wire.read(); |
altb2 | 0:577a6606809f | 387 | msb = Wire.read(); |
altb2 | 0:577a6606809f | 388 | hsb = Wire.read(); |
altb2 | 0:577a6606809f | 389 | } |
altb2 | 0:577a6606809f | 390 | */ |
altb2 | 0:577a6606809f | 391 | return 0;//(lsb | (msb << 8) | (hsb << 16)); |
altb2 | 0:577a6606809f | 392 | } |
altb2 | 0:577a6606809f | 393 | |
altb2 | 0:577a6606809f | 394 | void BMI088::read(device_type_t dev, char reg, char *buf, uint16_t len) |
altb2 | 0:577a6606809f | 395 | { |
altb2 | 0:577a6606809f | 396 | int addr; |
altb2 | 0:577a6606809f | 397 | |
altb2 | 0:577a6606809f | 398 | if(dev) addr = devAddrGyro; |
altb2 | 0:577a6606809f | 399 | else addr = devAddrAcc; |
altb2 | 0:577a6606809f | 400 | int succw = i2c.write(addr, ®, 0x01); |
altb2 | 0:577a6606809f | 401 | int succr = i2c.read( addr, buf, len); |
altb2 | 0:577a6606809f | 402 | //printf("\r\nread: succes w: %d, succes r: %d, buf[1]:%d\r\n",succw,succr,buf[1]); |
altb2 | 0:577a6606809f | 403 | /* |
altb2 | 0:577a6606809f | 404 | Wire.beginTransmission(addr); |
altb2 | 0:577a6606809f | 405 | Wire.write(reg); |
altb2 | 0:577a6606809f | 406 | Wire.endTransmission(); |
altb2 | 0:577a6606809f | 407 | |
altb2 | 0:577a6606809f | 408 | Wire.requestFrom(addr, len); |
altb2 | 0:577a6606809f | 409 | while(Wire.available()) |
altb2 | 0:577a6606809f | 410 | { |
altb2 | 0:577a6606809f | 411 | for(uint16_t i = 0; i < len; i ++) buf[i] = Wire.read(); |
altb2 | 0:577a6606809f | 412 | } |
altb2 | 0:577a6606809f | 413 | */ |
altb2 | 0:577a6606809f | 414 | } |