eCompass (6-axes electronic compass) / Electronic Compass with Three-axis Magnetic Field Sensor and Three-axis Accelerometer by Bosch Sensortech
Dependents: BLE_EddystoneBeacon_w_ACC_TY51822
BMC050.cpp@0:8de5e2fd5c48, 2014-07-20 (annotated)
- Committer:
- kenjiArai
- Date:
- Sun Jul 20 13:16:25 2014 +0000
- Revision:
- 0:8de5e2fd5c48
- Child:
- 1:b022f8d7884d
1st release for Bosch Sensortec BMC050
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:8de5e2fd5c48 | 1 | /* |
kenjiArai | 0:8de5e2fd5c48 | 2 | * mbed library program |
kenjiArai | 0:8de5e2fd5c48 | 3 | * BMC050 COMPASS 6 AXIS, made by Bosch Sensortec |
kenjiArai | 0:8de5e2fd5c48 | 4 | * http://jp.bosch-sensortec.com/content/language1/html/5033.htm |
kenjiArai | 0:8de5e2fd5c48 | 5 | * |
kenjiArai | 0:8de5e2fd5c48 | 6 | * Copyright (c) 2014 Kenji Arai / JH1PJL |
kenjiArai | 0:8de5e2fd5c48 | 7 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:8de5e2fd5c48 | 8 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 0:8de5e2fd5c48 | 9 | * Created: July 19th, 2014 |
kenjiArai | 0:8de5e2fd5c48 | 10 | * Revised: July 20th, 2014 |
kenjiArai | 0:8de5e2fd5c48 | 11 | * |
kenjiArai | 0:8de5e2fd5c48 | 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
kenjiArai | 0:8de5e2fd5c48 | 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE |
kenjiArai | 0:8de5e2fd5c48 | 14 | * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
kenjiArai | 0:8de5e2fd5c48 | 15 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
kenjiArai | 0:8de5e2fd5c48 | 16 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
kenjiArai | 0:8de5e2fd5c48 | 17 | */ |
kenjiArai | 0:8de5e2fd5c48 | 18 | |
kenjiArai | 0:8de5e2fd5c48 | 19 | #include "BMC050.h" |
kenjiArai | 0:8de5e2fd5c48 | 20 | |
kenjiArai | 0:8de5e2fd5c48 | 21 | BMC050::BMC050 (PinName p_sda, PinName p_scl, |
kenjiArai | 0:8de5e2fd5c48 | 22 | const BMC050ACC_TypeDef *acc_parameter, const BMC050MAG_TypeDef *mag_parameter) : |
kenjiArai | 0:8de5e2fd5c48 | 23 | i2c(p_sda, p_scl) { |
kenjiArai | 0:8de5e2fd5c48 | 24 | initialize (acc_parameter, mag_parameter); |
kenjiArai | 0:8de5e2fd5c48 | 25 | } |
kenjiArai | 0:8de5e2fd5c48 | 26 | |
kenjiArai | 0:8de5e2fd5c48 | 27 | BMC050::BMC050 (I2C& p_i2c, |
kenjiArai | 0:8de5e2fd5c48 | 28 | const BMC050ACC_TypeDef *acc_parameter, const BMC050MAG_TypeDef *mag_parameter) : i2c(p_i2c) { |
kenjiArai | 0:8de5e2fd5c48 | 29 | initialize (acc_parameter, mag_parameter); |
kenjiArai | 0:8de5e2fd5c48 | 30 | } |
kenjiArai | 0:8de5e2fd5c48 | 31 | |
kenjiArai | 0:8de5e2fd5c48 | 32 | void BMC050::initialize (const BMC050ACC_TypeDef *acc_parameter, |
kenjiArai | 0:8de5e2fd5c48 | 33 | const BMC050MAG_TypeDef *mag_parameter) { |
kenjiArai | 0:8de5e2fd5c48 | 34 | /////////////// Magnetometer Configuration ///////////////// |
kenjiArai | 0:8de5e2fd5c48 | 35 | // after power-on, mag chip is keeping "Suspend mode"!! |
kenjiArai | 0:8de5e2fd5c48 | 36 | // -> Need to go "Normal mode" via "Sleep mode" |
kenjiArai | 0:8de5e2fd5c48 | 37 | // step 1/start |
kenjiArai | 0:8de5e2fd5c48 | 38 | mag_addr = mag_parameter->addr; |
kenjiArai | 0:8de5e2fd5c48 | 39 | dbf[0] = BMC050_M_POWER_MODE; |
kenjiArai | 0:8de5e2fd5c48 | 40 | dbf[1] = 0x01; // Power control bit on |
kenjiArai | 0:8de5e2fd5c48 | 41 | i2c_write_n_bytes(mag_addr, dbf, 2); |
kenjiArai | 0:8de5e2fd5c48 | 42 | dbf[0] = BMC050_M_OPERATION; |
kenjiArai | 0:8de5e2fd5c48 | 43 | dbf[1] = 0; |
kenjiArai | 0:8de5e2fd5c48 | 44 | i2c_write_n_bytes(mag_addr, dbf, 2); |
kenjiArai | 0:8de5e2fd5c48 | 45 | /////////////// Accelerometer configuration //////////////// |
kenjiArai | 0:8de5e2fd5c48 | 46 | // Check acc chip is available of not |
kenjiArai | 0:8de5e2fd5c48 | 47 | // step 1/start |
kenjiArai | 0:8de5e2fd5c48 | 48 | acc_addr = acc_parameter->addr; |
kenjiArai | 0:8de5e2fd5c48 | 49 | dbf[0] = BMC050_A_WHO_AM_I; |
kenjiArai | 0:8de5e2fd5c48 | 50 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 51 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 52 | if (dbf[0] == I_AM_BMC050_ACC){ acc_ready = 1; |
kenjiArai | 0:8de5e2fd5c48 | 53 | } else { acc_ready = 0; } |
kenjiArai | 0:8de5e2fd5c48 | 54 | /////////////// Magnetometer Configuration ///////////////// |
kenjiArai | 0:8de5e2fd5c48 | 55 | // after power-on, mag chip is keeping "Suspend mode"!! |
kenjiArai | 0:8de5e2fd5c48 | 56 | // -> Need to go "Normal mode" via "Sleep mode" |
kenjiArai | 0:8de5e2fd5c48 | 57 | // step 2 |
kenjiArai | 0:8de5e2fd5c48 | 58 | i2c_write_n_bytes(mag_addr, dbf, 2); |
kenjiArai | 0:8de5e2fd5c48 | 59 | dbf[0] = BMC050_M_OPERATION; |
kenjiArai | 0:8de5e2fd5c48 | 60 | dbf[1] = 0; |
kenjiArai | 0:8de5e2fd5c48 | 61 | i2c_write_n_bytes(mag_addr, dbf, 2); |
kenjiArai | 0:8de5e2fd5c48 | 62 | /////////////// Accelerometer configuration //////////////// |
kenjiArai | 0:8de5e2fd5c48 | 63 | // step 2/last |
kenjiArai | 0:8de5e2fd5c48 | 64 | if ( acc_ready == 1){ |
kenjiArai | 0:8de5e2fd5c48 | 65 | // set g-range |
kenjiArai | 0:8de5e2fd5c48 | 66 | dbf[0] = BMC050_A_G_RANGE; |
kenjiArai | 0:8de5e2fd5c48 | 67 | dbf[1] = acc_parameter->g_range; |
kenjiArai | 0:8de5e2fd5c48 | 68 | switch (dbf[1]){ |
kenjiArai | 0:8de5e2fd5c48 | 69 | case BMC050_FS_2G: |
kenjiArai | 0:8de5e2fd5c48 | 70 | fs_factor_acc = 256; |
kenjiArai | 0:8de5e2fd5c48 | 71 | break; |
kenjiArai | 0:8de5e2fd5c48 | 72 | case BMC050_FS_4G: |
kenjiArai | 0:8de5e2fd5c48 | 73 | fs_factor_acc = 128; |
kenjiArai | 0:8de5e2fd5c48 | 74 | break; |
kenjiArai | 0:8de5e2fd5c48 | 75 | case BMC050_FS_8G: |
kenjiArai | 0:8de5e2fd5c48 | 76 | fs_factor_acc = 64; |
kenjiArai | 0:8de5e2fd5c48 | 77 | break; |
kenjiArai | 0:8de5e2fd5c48 | 78 | case BMC050_FS_16G: |
kenjiArai | 0:8de5e2fd5c48 | 79 | fs_factor_acc = 32; |
kenjiArai | 0:8de5e2fd5c48 | 80 | break; |
kenjiArai | 0:8de5e2fd5c48 | 81 | default: |
kenjiArai | 0:8de5e2fd5c48 | 82 | fs_factor_acc = 256; |
kenjiArai | 0:8de5e2fd5c48 | 83 | dbf[1] = BMC050_FS_2G; |
kenjiArai | 0:8de5e2fd5c48 | 84 | } |
kenjiArai | 0:8de5e2fd5c48 | 85 | i2c_write_n_bytes(acc_addr, dbf, 2); |
kenjiArai | 0:8de5e2fd5c48 | 86 | // set bandwidth |
kenjiArai | 0:8de5e2fd5c48 | 87 | dbf[1] = acc_parameter->bandwith; |
kenjiArai | 0:8de5e2fd5c48 | 88 | if (dbf[1] == BMC050_NOT_FILTERED){ |
kenjiArai | 0:8de5e2fd5c48 | 89 | dbf[0] = BMC050_A_FILTER; |
kenjiArai | 0:8de5e2fd5c48 | 90 | dbf[1] = 0x80; |
kenjiArai | 0:8de5e2fd5c48 | 91 | } else { |
kenjiArai | 0:8de5e2fd5c48 | 92 | dbf[0] = BMC050_A_BANDWIDTH; |
kenjiArai | 0:8de5e2fd5c48 | 93 | } |
kenjiArai | 0:8de5e2fd5c48 | 94 | i2c_write_n_bytes(acc_addr, dbf, 2); |
kenjiArai | 0:8de5e2fd5c48 | 95 | } |
kenjiArai | 0:8de5e2fd5c48 | 96 | /////////////// Magnetometer Configuration ///////////////// |
kenjiArai | 0:8de5e2fd5c48 | 97 | // Check mag chip is available of not |
kenjiArai | 0:8de5e2fd5c48 | 98 | // step 3/last |
kenjiArai | 0:8de5e2fd5c48 | 99 | dbf[0] = BMC050_M_WHO_AM_I; |
kenjiArai | 0:8de5e2fd5c48 | 100 | i2c_write_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 101 | i2c_read_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 102 | if (dbf[0] == I_AM_BMC050_MAG){ mag_ready = 1; |
kenjiArai | 0:8de5e2fd5c48 | 103 | } else { mag_ready = 0; } |
kenjiArai | 0:8de5e2fd5c48 | 104 | if ( mag_ready == 1){ |
kenjiArai | 0:8de5e2fd5c48 | 105 | // set output data rate |
kenjiArai | 0:8de5e2fd5c48 | 106 | dbf[0] = BMC050_M_OPERATION; |
kenjiArai | 0:8de5e2fd5c48 | 107 | dbf[1] = mag_parameter->data_rate; |
kenjiArai | 0:8de5e2fd5c48 | 108 | i2c_write_n_bytes(mag_addr, dbf, 2); |
kenjiArai | 0:8de5e2fd5c48 | 109 | } |
kenjiArai | 0:8de5e2fd5c48 | 110 | } |
kenjiArai | 0:8de5e2fd5c48 | 111 | |
kenjiArai | 0:8de5e2fd5c48 | 112 | /////////////// Accelerometer ////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 113 | void BMC050::read_data_acc(float *dt) { |
kenjiArai | 0:8de5e2fd5c48 | 114 | char data[6]; |
kenjiArai | 0:8de5e2fd5c48 | 115 | |
kenjiArai | 0:8de5e2fd5c48 | 116 | if (acc_ready == 0){ |
kenjiArai | 0:8de5e2fd5c48 | 117 | dt[0] = dt[1] = dt[2] = 0; |
kenjiArai | 0:8de5e2fd5c48 | 118 | return; |
kenjiArai | 0:8de5e2fd5c48 | 119 | } |
kenjiArai | 0:8de5e2fd5c48 | 120 | // X |
kenjiArai | 0:8de5e2fd5c48 | 121 | dbf[0] = BMC050_A_OUT_X_L; |
kenjiArai | 0:8de5e2fd5c48 | 122 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 123 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 124 | data[0] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 125 | dbf[0] = BMC050_A_OUT_X_H ; |
kenjiArai | 0:8de5e2fd5c48 | 126 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 127 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 128 | data[1] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 129 | // Y |
kenjiArai | 0:8de5e2fd5c48 | 130 | dbf[0] = BMC050_A_OUT_Y_L; |
kenjiArai | 0:8de5e2fd5c48 | 131 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 132 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 133 | data[2] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 134 | dbf[0] = BMC050_A_OUT_Y_H; |
kenjiArai | 0:8de5e2fd5c48 | 135 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 136 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 137 | data[3] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 138 | // Z |
kenjiArai | 0:8de5e2fd5c48 | 139 | dbf[0] = BMC050_A_OUT_Z_L; |
kenjiArai | 0:8de5e2fd5c48 | 140 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 141 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 142 | data[4] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 143 | dbf[0] = BMC050_A_OUT_Z_H; |
kenjiArai | 0:8de5e2fd5c48 | 144 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 145 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 146 | data[5] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 147 | // change data type |
kenjiArai | 0:8de5e2fd5c48 | 148 | dt[0] = float((short(data[1] << 8 | data[0] & 0xc0))>> 6) * GRAVITY / fs_factor_acc; |
kenjiArai | 0:8de5e2fd5c48 | 149 | dt[1] = float((short(data[3] << 8 | data[2] & 0xc0))>> 6) * GRAVITY / fs_factor_acc; |
kenjiArai | 0:8de5e2fd5c48 | 150 | dt[2] = float((short(data[5] << 8 | data[4] & 0xc0))>> 6) * GRAVITY / fs_factor_acc; |
kenjiArai | 0:8de5e2fd5c48 | 151 | } |
kenjiArai | 0:8de5e2fd5c48 | 152 | |
kenjiArai | 0:8de5e2fd5c48 | 153 | /////////////// Magnetometer /////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 154 | void BMC050::read_data_mag(float *dt) { |
kenjiArai | 0:8de5e2fd5c48 | 155 | char data[6]; |
kenjiArai | 0:8de5e2fd5c48 | 156 | |
kenjiArai | 0:8de5e2fd5c48 | 157 | if (mag_ready == 0){ |
kenjiArai | 0:8de5e2fd5c48 | 158 | dt[0] = dt[1] = dt[2] = 0; |
kenjiArai | 0:8de5e2fd5c48 | 159 | return; |
kenjiArai | 0:8de5e2fd5c48 | 160 | } |
kenjiArai | 0:8de5e2fd5c48 | 161 | // X |
kenjiArai | 0:8de5e2fd5c48 | 162 | dbf[0] = BMC050_M_OUT_X_L; |
kenjiArai | 0:8de5e2fd5c48 | 163 | i2c_write_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 164 | i2c_read_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 165 | data[0] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 166 | dbf[0] = BMC050_M_OUT_X_H ; |
kenjiArai | 0:8de5e2fd5c48 | 167 | i2c_write_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 168 | i2c_read_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 169 | data[1] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 170 | // Y |
kenjiArai | 0:8de5e2fd5c48 | 171 | dbf[0] = BMC050_M_OUT_Y_L; |
kenjiArai | 0:8de5e2fd5c48 | 172 | i2c_write_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 173 | i2c_read_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 174 | data[2] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 175 | dbf[0] = BMC050_M_OUT_Y_H; |
kenjiArai | 0:8de5e2fd5c48 | 176 | i2c_write_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 177 | i2c_read_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 178 | data[3] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 179 | // Z |
kenjiArai | 0:8de5e2fd5c48 | 180 | dbf[0] = BMC050_M_OUT_Z_L; |
kenjiArai | 0:8de5e2fd5c48 | 181 | i2c_write_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 182 | i2c_read_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 183 | data[4] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 184 | dbf[0] = BMC050_M_OUT_Z_H; |
kenjiArai | 0:8de5e2fd5c48 | 185 | i2c_write_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 186 | i2c_read_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 187 | data[5] = dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 188 | // change data type |
kenjiArai | 0:8de5e2fd5c48 | 189 | dt[0] = float((short(data[1] << 8 | data[0] & 0xf8))>> 3); |
kenjiArai | 0:8de5e2fd5c48 | 190 | dt[1] = float((short(data[3] << 8 | data[2] & 0xf8))>> 3); |
kenjiArai | 0:8de5e2fd5c48 | 191 | dt[2] = float((short(data[5] << 8 | data[4] & 0xfe))>> 1); |
kenjiArai | 0:8de5e2fd5c48 | 192 | } |
kenjiArai | 0:8de5e2fd5c48 | 193 | |
kenjiArai | 0:8de5e2fd5c48 | 194 | /////////////// Accelerometer ////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 195 | float BMC050::read_temp() { |
kenjiArai | 0:8de5e2fd5c48 | 196 | dbf[0] = BMC050_A_OUT_TEMP; |
kenjiArai | 0:8de5e2fd5c48 | 197 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 198 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 199 | return ((float)dbf[0] * 0.5 + 24.0); |
kenjiArai | 0:8de5e2fd5c48 | 200 | } |
kenjiArai | 0:8de5e2fd5c48 | 201 | |
kenjiArai | 0:8de5e2fd5c48 | 202 | /////////////// Accelerometer ////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 203 | uint8_t BMC050::read_id_acc() { |
kenjiArai | 0:8de5e2fd5c48 | 204 | dbf[0] = BMC050_A_WHO_AM_I; |
kenjiArai | 0:8de5e2fd5c48 | 205 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 206 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 207 | return (uint8_t)dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 208 | } |
kenjiArai | 0:8de5e2fd5c48 | 209 | |
kenjiArai | 0:8de5e2fd5c48 | 210 | /////////////// Magnetometer /////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 211 | uint8_t BMC050::read_id_mag() { |
kenjiArai | 0:8de5e2fd5c48 | 212 | dbf[0] = BMC050_M_WHO_AM_I; |
kenjiArai | 0:8de5e2fd5c48 | 213 | i2c_write_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 214 | i2c_read_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 215 | return (uint8_t)dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 216 | } |
kenjiArai | 0:8de5e2fd5c48 | 217 | |
kenjiArai | 0:8de5e2fd5c48 | 218 | /////////////// Accelerometer ////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 219 | uint8_t BMC050::data_ready_acc() { |
kenjiArai | 0:8de5e2fd5c48 | 220 | if (acc_ready == 1){ |
kenjiArai | 0:8de5e2fd5c48 | 221 | dbf[0] = BMC050_A_OUT_X_L; |
kenjiArai | 0:8de5e2fd5c48 | 222 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 223 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 224 | if (!(dbf[0] & 0x01)){ |
kenjiArai | 0:8de5e2fd5c48 | 225 | return 0; |
kenjiArai | 0:8de5e2fd5c48 | 226 | } |
kenjiArai | 0:8de5e2fd5c48 | 227 | } |
kenjiArai | 0:8de5e2fd5c48 | 228 | return 1; |
kenjiArai | 0:8de5e2fd5c48 | 229 | } |
kenjiArai | 0:8de5e2fd5c48 | 230 | |
kenjiArai | 0:8de5e2fd5c48 | 231 | /////////////// Magnetometer /////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 232 | uint8_t BMC050::data_ready_mag() { |
kenjiArai | 0:8de5e2fd5c48 | 233 | if (mag_ready == 1){ |
kenjiArai | 0:8de5e2fd5c48 | 234 | dbf[0] = BMC050_M_HALL_L; |
kenjiArai | 0:8de5e2fd5c48 | 235 | i2c_write_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 236 | i2c_read_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 237 | if (!(dbf[0] & 0x01)){ |
kenjiArai | 0:8de5e2fd5c48 | 238 | return 0; |
kenjiArai | 0:8de5e2fd5c48 | 239 | } |
kenjiArai | 0:8de5e2fd5c48 | 240 | } |
kenjiArai | 0:8de5e2fd5c48 | 241 | return 1; |
kenjiArai | 0:8de5e2fd5c48 | 242 | } |
kenjiArai | 0:8de5e2fd5c48 | 243 | |
kenjiArai | 0:8de5e2fd5c48 | 244 | /////////////// Accelerometer ////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 245 | uint8_t BMC050::read_reg_acc(uint8_t addr) { |
kenjiArai | 0:8de5e2fd5c48 | 246 | if (acc_ready == 1){ |
kenjiArai | 0:8de5e2fd5c48 | 247 | dbf[0] = addr; |
kenjiArai | 0:8de5e2fd5c48 | 248 | i2c_write_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 249 | i2c_read_n_bytes(acc_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 250 | } else { |
kenjiArai | 0:8de5e2fd5c48 | 251 | dbf[0] = 0xff; |
kenjiArai | 0:8de5e2fd5c48 | 252 | } |
kenjiArai | 0:8de5e2fd5c48 | 253 | return (uint8_t)dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 254 | } |
kenjiArai | 0:8de5e2fd5c48 | 255 | |
kenjiArai | 0:8de5e2fd5c48 | 256 | /////////////// Magnetometer /////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 257 | uint8_t BMC050::read_reg_mag(uint8_t addr) { |
kenjiArai | 0:8de5e2fd5c48 | 258 | if (mag_ready == 1){ |
kenjiArai | 0:8de5e2fd5c48 | 259 | dbf[0] = addr; |
kenjiArai | 0:8de5e2fd5c48 | 260 | i2c_write_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 261 | i2c_read_n_bytes(mag_addr, dbf, 1); |
kenjiArai | 0:8de5e2fd5c48 | 262 | } else { |
kenjiArai | 0:8de5e2fd5c48 | 263 | dbf[0] = 0xff; |
kenjiArai | 0:8de5e2fd5c48 | 264 | } |
kenjiArai | 0:8de5e2fd5c48 | 265 | return (uint8_t)dbf[0]; |
kenjiArai | 0:8de5e2fd5c48 | 266 | } |
kenjiArai | 0:8de5e2fd5c48 | 267 | |
kenjiArai | 0:8de5e2fd5c48 | 268 | /////////////// Accelerometer ////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 269 | void BMC050::write_reg_acc(uint8_t addr, uint8_t data) { |
kenjiArai | 0:8de5e2fd5c48 | 270 | if (acc_ready == 1){ |
kenjiArai | 0:8de5e2fd5c48 | 271 | dbf[0] = addr; |
kenjiArai | 0:8de5e2fd5c48 | 272 | dbf[1] = data; |
kenjiArai | 0:8de5e2fd5c48 | 273 | i2c_write_n_bytes(acc_addr, dbf, 2); |
kenjiArai | 0:8de5e2fd5c48 | 274 | } |
kenjiArai | 0:8de5e2fd5c48 | 275 | } |
kenjiArai | 0:8de5e2fd5c48 | 276 | |
kenjiArai | 0:8de5e2fd5c48 | 277 | /////////////// Magnetometer /////////////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 278 | void BMC050::write_reg_mag(uint8_t addr, uint8_t data) { |
kenjiArai | 0:8de5e2fd5c48 | 279 | if (mag_ready == 1){ |
kenjiArai | 0:8de5e2fd5c48 | 280 | dbf[0] = addr; |
kenjiArai | 0:8de5e2fd5c48 | 281 | dbf[1] = data; |
kenjiArai | 0:8de5e2fd5c48 | 282 | i2c_write_n_bytes(mag_addr, dbf, 2); |
kenjiArai | 0:8de5e2fd5c48 | 283 | } |
kenjiArai | 0:8de5e2fd5c48 | 284 | } |
kenjiArai | 0:8de5e2fd5c48 | 285 | |
kenjiArai | 0:8de5e2fd5c48 | 286 | /////////////// Low level interface //////////////////////////////////////////////// |
kenjiArai | 0:8de5e2fd5c48 | 287 | void BMC050::i2c_read_n_bytes (int addr, char* dbf, int n) { |
kenjiArai | 0:8de5e2fd5c48 | 288 | i2c.read(addr, dbf, n); |
kenjiArai | 0:8de5e2fd5c48 | 289 | } |
kenjiArai | 0:8de5e2fd5c48 | 290 | |
kenjiArai | 0:8de5e2fd5c48 | 291 | void BMC050::i2c_write_n_bytes (int addr, char* dbf, int n) { |
kenjiArai | 0:8de5e2fd5c48 | 292 | i2c.write(addr, dbf, n); |
kenjiArai | 0:8de5e2fd5c48 | 293 | } |