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

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?

UserRevisionLine numberNew 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 }