James Devine / LSM303D

Dependents:   Cosmic_Pi_STM32_i2c

Committer:
pingu_98
Date:
Sun Jan 06 19:13:18 2019 +0000
Revision:
3:9e595dd5d97e
Parent:
2:8cd0c3c11b48
modified to avoid i2c noncopy violation in mbed5.x

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bclaus 0:5b930e09bd6e 1 /** LSM303D Interface Library
bclaus 0:5b930e09bd6e 2 *
bclaus 0:5b930e09bd6e 3 * base on code by Michael Shimniok http://bot-thoughts.com
bclaus 0:5b930e09bd6e 4 *
bclaus 0:5b930e09bd6e 5 * and on test program by @tosihisa and
bclaus 0:5b930e09bd6e 6 *
bclaus 0:5b930e09bd6e 7 * and on Pololu sample library for LSM303D breakout by ryantm:
bclaus 0:5b930e09bd6e 8 *
bclaus 0:5b930e09bd6e 9 * ported by Brian Claus
bclaus 0:5b930e09bd6e 10 *
bclaus 0:5b930e09bd6e 11 * Copyright (c) 2011 Pololu Corporation. For more information, see
bclaus 0:5b930e09bd6e 12 *
bclaus 0:5b930e09bd6e 13 * http://www.pololu.com/
bclaus 0:5b930e09bd6e 14 * http://forum.pololu.com/
bclaus 0:5b930e09bd6e 15 *
bclaus 0:5b930e09bd6e 16 * Permission is hereby granted, free of charge, to any person
bclaus 0:5b930e09bd6e 17 * obtaining a copy of this software and associated documentation
bclaus 0:5b930e09bd6e 18 * files (the "Software"), to deal in the Software without
bclaus 0:5b930e09bd6e 19 * restriction, including without limitation the rights to use,
bclaus 0:5b930e09bd6e 20 * copy, modify, merge, publish, distribute, sublicense, and/or sell
bclaus 0:5b930e09bd6e 21 * copies of the Software, and to permit persons to whom the
bclaus 0:5b930e09bd6e 22 * Software is furnished to do so, subject to the following
bclaus 0:5b930e09bd6e 23 * conditions:
bclaus 0:5b930e09bd6e 24 *
bclaus 0:5b930e09bd6e 25 * The above copyright notice and this permission notice shall be
bclaus 0:5b930e09bd6e 26 * included in all copies or substantial portions of the Software.
bclaus 0:5b930e09bd6e 27 *
bclaus 0:5b930e09bd6e 28 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
bclaus 0:5b930e09bd6e 29 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
bclaus 0:5b930e09bd6e 30 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
bclaus 0:5b930e09bd6e 31 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
bclaus 0:5b930e09bd6e 32 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
bclaus 0:5b930e09bd6e 33 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
bclaus 0:5b930e09bd6e 34 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
bclaus 0:5b930e09bd6e 35 * OTHER DEALINGS IN THE SOFTWARE.
bclaus 0:5b930e09bd6e 36 */
bclaus 0:5b930e09bd6e 37 #include "mbed.h"
bclaus 0:5b930e09bd6e 38 #include "LSM303D.h"
bclaus 0:5b930e09bd6e 39
bclaus 0:5b930e09bd6e 40
bclaus 0:5b930e09bd6e 41 const int addr_acc_mag = 0x3A;
bclaus 0:5b930e09bd6e 42
bclaus 0:5b930e09bd6e 43 enum REG_ADDRS {
bclaus 0:5b930e09bd6e 44 /* --- Mag --- */
bclaus 0:5b930e09bd6e 45 OUT_X_M = 0x08,
bclaus 0:5b930e09bd6e 46 OUT_Y_M = 0x0A,
bclaus 0:5b930e09bd6e 47 OUT_Z_M = 0x0C,
bclaus 0:5b930e09bd6e 48 /* --- Acc --- */
bclaus 0:5b930e09bd6e 49 OUT_X_A = 0x28,
bclaus 0:5b930e09bd6e 50 OUT_Y_A = 0x2A,
bclaus 0:5b930e09bd6e 51 OUT_Z_A = 0x2C,
bclaus 0:5b930e09bd6e 52 //
bclaus 1:f93f4bc7a889 53 CTRL0 = 0x1F,
bclaus 1:f93f4bc7a889 54 CTRL1 = 0x20,
bclaus 1:f93f4bc7a889 55 CTRL2 = 0x21,
bclaus 1:f93f4bc7a889 56 CTRL3 = 0x22,
bclaus 1:f93f4bc7a889 57 CTRL4 = 0x23,
bclaus 1:f93f4bc7a889 58 CTRL5 = 0x24,
bclaus 1:f93f4bc7a889 59 CTRL6 = 0x25,
bclaus 1:f93f4bc7a889 60 CTRL7 = 0x26
bclaus 0:5b930e09bd6e 61 };
bclaus 0:5b930e09bd6e 62
pingu_98 3:9e595dd5d97e 63 LSM303D::LSM303D(I2C *i2c):
pingu_98 3:9e595dd5d97e 64 i2c_(i2c)
pingu_98 3:9e595dd5d97e 65 //_LSM303(sda, scl)
bclaus 0:5b930e09bd6e 66 {
bclaus 0:5b930e09bd6e 67 char reg_v;
pingu_98 3:9e595dd5d97e 68 //_LSM303.frequency(200000);
bclaus 0:5b930e09bd6e 69
bclaus 0:5b930e09bd6e 70 reg_v = 0;
bclaus 0:5b930e09bd6e 71
bclaus 0:5b930e09bd6e 72 //acc
bclaus 0:5b930e09bd6e 73 reg_v |= 0x57; /* 50 Hz X/Y/Z axis enable. */
bclaus 0:5b930e09bd6e 74 write_reg(addr_acc_mag,CTRL1,reg_v);
bclaus 0:5b930e09bd6e 75
bclaus 0:5b930e09bd6e 76 /* -- mag --- */
bclaus 0:5b930e09bd6e 77 reg_v = 0;
bclaus 0:5b930e09bd6e 78 reg_v |= 0x78; //M_RES = 11 (high resolution mode); M_ODR = 100 (50 Hz ODR)
bclaus 0:5b930e09bd6e 79 write_reg(addr_acc_mag,CTRL5,reg_v);
bclaus 0:5b930e09bd6e 80
bclaus 0:5b930e09bd6e 81
bclaus 0:5b930e09bd6e 82
bclaus 0:5b930e09bd6e 83 reg_v = 0;
bclaus 0:5b930e09bd6e 84 reg_v |= 0x00; //continuous mag
bclaus 1:f93f4bc7a889 85 write_reg(addr_acc_mag,CTRL7,reg_v);
bclaus 0:5b930e09bd6e 86 }
bclaus 0:5b930e09bd6e 87
pingu_98 3:9e595dd5d97e 88 bool LSM303D::write_reg(int addr_i2c,int addr_reg, char v)
pingu_98 3:9e595dd5d97e 89 {
pingu_98 3:9e595dd5d97e 90 char data[2] = {addr_reg, v};
pingu_98 3:9e595dd5d97e 91 i2c_->write(addr_i2c, data, 2);
pingu_98 3:9e595dd5d97e 92 return 0;
pingu_98 3:9e595dd5d97e 93 }
pingu_98 3:9e595dd5d97e 94
pingu_98 3:9e595dd5d97e 95 bool LSM303D::read_reg(int addr_i2c,int addr_reg, char *v)
pingu_98 3:9e595dd5d97e 96 {
pingu_98 3:9e595dd5d97e 97 char data = addr_reg;
pingu_98 3:9e595dd5d97e 98 bool result = false;
pingu_98 3:9e595dd5d97e 99
pingu_98 3:9e595dd5d97e 100 __disable_irq();
pingu_98 3:9e595dd5d97e 101 if ((i2c_->write(addr_i2c, &data, 1) == 0) && (i2c_->write(addr_i2c, &data, 1) == 0)){
pingu_98 3:9e595dd5d97e 102 *v = data;
pingu_98 3:9e595dd5d97e 103 result = true;
pingu_98 3:9e595dd5d97e 104 }
pingu_98 3:9e595dd5d97e 105 __enable_irq();
pingu_98 3:9e595dd5d97e 106 return result;
pingu_98 3:9e595dd5d97e 107 }
pingu_98 3:9e595dd5d97e 108
bclaus 0:5b930e09bd6e 109
bclaus 0:5b930e09bd6e 110 bool LSM303D::read(float *ax, float *ay, float *az, float *mx, float *my, float *mz) {
bclaus 0:5b930e09bd6e 111 char acc[6], mag[6];
bclaus 0:5b930e09bd6e 112
bclaus 0:5b930e09bd6e 113 if (recv(addr_acc_mag, OUT_X_A, acc, 6) && recv(addr_acc_mag, OUT_X_M, mag, 6)) {
pingu_98 3:9e595dd5d97e 114 *ax = float(short(acc[1] << 8 | acc[0]))*0.00061f; //32768/4=8192
pingu_98 3:9e595dd5d97e 115 *ay = float(short(acc[3] << 8 | acc[2]))*0.00061f;
pingu_98 3:9e595dd5d97e 116 *az = float(short(acc[5] << 8 | acc[4]))*0.00061f;
bclaus 2:8cd0c3c11b48 117 //+-4gauss
pingu_98 3:9e595dd5d97e 118 *mx = float(short(mag[0] << 8 | mag[1]))*0.16f;
pingu_98 3:9e595dd5d97e 119 *mz = float(short(mag[2] << 8 | mag[3]))*0.16f;
pingu_98 3:9e595dd5d97e 120 *my = float(short(mag[4] << 8 | mag[5]))*0.16f;
bclaus 0:5b930e09bd6e 121
pingu_98 3:9e595dd5d97e 122 return 0;
bclaus 0:5b930e09bd6e 123 }
bclaus 0:5b930e09bd6e 124
bclaus 0:5b930e09bd6e 125 return false;
bclaus 0:5b930e09bd6e 126 }
bclaus 0:5b930e09bd6e 127
bclaus 0:5b930e09bd6e 128
bclaus 0:5b930e09bd6e 129 bool LSM303D::recv(char sad, char sub, char *buf, int length) {
bclaus 0:5b930e09bd6e 130 if (length > 1) sub |= 0x80;
bclaus 0:5b930e09bd6e 131
pingu_98 3:9e595dd5d97e 132 return i2c_->write(sad, &sub, 1, true) == 0 && i2c_->read(sad, buf, length) == 0;
bclaus 0:5b930e09bd6e 133 }