MAG3110 Three-Axis, Digital Magnetmeter

Dependents:   test_MAG3110 testSensor

Committer:
Rhyme
Date:
Fri Dec 25 07:49:21 2015 +0000
Revision:
0:f9e4f54ab660
First commit for MSS/MSU type

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:f9e4f54ab660 1 /*
Rhyme 0:f9e4f54ab660 2 * File description here
Rhyme 0:f9e4f54ab660 3 */
Rhyme 0:f9e4f54ab660 4 #include "MAG3110.h"
Rhyme 0:f9e4f54ab660 5
Rhyme 0:f9e4f54ab660 6 /* some definitions here */
Rhyme 0:f9e4f54ab660 7
Rhyme 0:f9e4f54ab660 8 /* value registers */
Rhyme 0:f9e4f54ab660 9 #define MAG_DR_STATUS 0x01
Rhyme 0:f9e4f54ab660 10 #define MAG_OUT_X 0x02
Rhyme 0:f9e4f54ab660 11 #define MAG_OUT_Y 0x04
Rhyme 0:f9e4f54ab660 12 #define MAG_OUT_Z 0x06
Rhyme 0:f9e4f54ab660 13 #define MAG_WHO_AM_I 0x07
Rhyme 0:f9e4f54ab660 14 #define MAG_SYSMOD 0x08
Rhyme 0:f9e4f54ab660 15 #define MAG_OFF_X 0x09
Rhyme 0:f9e4f54ab660 16 #define MAG_OFF_Y 0x0B
Rhyme 0:f9e4f54ab660 17 #define MAG_OFF_Z 0x0D
Rhyme 0:f9e4f54ab660 18 #define MAG_DIE_TEMP 0x0F
Rhyme 0:f9e4f54ab660 19 #define MAG_CTRL_REG1 0x10
Rhyme 0:f9e4f54ab660 20 #define MAG_CTRL_REG2 0x11
Rhyme 0:f9e4f54ab660 21
Rhyme 0:f9e4f54ab660 22
Rhyme 0:f9e4f54ab660 23 MAG3110::MAG3110(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
Rhyme 0:f9e4f54ab660 24 // activate the peripheral
Rhyme 0:f9e4f54ab660 25 activate() ;
Rhyme 0:f9e4f54ab660 26 }
Rhyme 0:f9e4f54ab660 27
Rhyme 0:f9e4f54ab660 28 MAG3110::~MAG3110() { }
Rhyme 0:f9e4f54ab660 29
Rhyme 0:f9e4f54ab660 30 void MAG3110::readRegs(int addr, uint8_t * data, int len) {
Rhyme 0:f9e4f54ab660 31 char t[1] = {addr} ;
Rhyme 0:f9e4f54ab660 32 m_i2c.write(m_addr, t, 1, true) ;
Rhyme 0:f9e4f54ab660 33 m_i2c.read(m_addr, (char*)data, len) ;
Rhyme 0:f9e4f54ab660 34 }
Rhyme 0:f9e4f54ab660 35
Rhyme 0:f9e4f54ab660 36 void MAG3110::writeRegs(uint8_t * data, int len) {
Rhyme 0:f9e4f54ab660 37 m_i2c.write(m_addr, (char *)data, len) ;
Rhyme 0:f9e4f54ab660 38 }
Rhyme 0:f9e4f54ab660 39
Rhyme 0:f9e4f54ab660 40 void MAG3110::standby(void)
Rhyme 0:f9e4f54ab660 41 {
Rhyme 0:f9e4f54ab660 42 uint8_t res[2] ;
Rhyme 0:f9e4f54ab660 43 res[0] = MAG_CTRL_REG1 ;
Rhyme 0:f9e4f54ab660 44 readRegs(MAG_CTRL_REG1, &res[1], 1) ;
Rhyme 0:f9e4f54ab660 45 res[1] &= 0xFE ;
Rhyme 0:f9e4f54ab660 46 writeRegs(res, 2) ;
Rhyme 0:f9e4f54ab660 47 }
Rhyme 0:f9e4f54ab660 48
Rhyme 0:f9e4f54ab660 49 void MAG3110::activate(void)
Rhyme 0:f9e4f54ab660 50 {
Rhyme 0:f9e4f54ab660 51 uint8_t res[2] ;
Rhyme 0:f9e4f54ab660 52 // measurements with ODR = 80 Hz, OSR = 1
Rhyme 0:f9e4f54ab660 53 res[0] = MAG_CTRL_REG1 ;
Rhyme 0:f9e4f54ab660 54 res[1] = 0x00 ; // standby!
Rhyme 0:f9e4f54ab660 55 writeRegs(res, 2) ;
Rhyme 0:f9e4f54ab660 56
Rhyme 0:f9e4f54ab660 57 res[0] = MAG_CTRL_REG2 ;
Rhyme 0:f9e4f54ab660 58 res[1] = 0x80 ; // AUTO_MRST_EN
Rhyme 0:f9e4f54ab660 59 writeRegs(res, 2) ;
Rhyme 0:f9e4f54ab660 60
Rhyme 0:f9e4f54ab660 61 res[0] = MAG_CTRL_REG1 ;
Rhyme 0:f9e4f54ab660 62 res[1] = 0x01 ; // activate!
Rhyme 0:f9e4f54ab660 63 writeRegs(res, 2) ;
Rhyme 0:f9e4f54ab660 64 }
Rhyme 0:f9e4f54ab660 65
Rhyme 0:f9e4f54ab660 66 uint8_t MAG3110::getStatus() {
Rhyme 0:f9e4f54ab660 67 uint8_t res[1] ;
Rhyme 0:f9e4f54ab660 68 readRegs(MAG_DR_STATUS, res, 1) ;
Rhyme 0:f9e4f54ab660 69 return( res[0] ) ;
Rhyme 0:f9e4f54ab660 70 }
Rhyme 0:f9e4f54ab660 71
Rhyme 0:f9e4f54ab660 72 int16_t MAG3110::getX() {
Rhyme 0:f9e4f54ab660 73 int16_t value;
Rhyme 0:f9e4f54ab660 74 uint8_t res[2];
Rhyme 0:f9e4f54ab660 75 readRegs(MAG_OUT_X, res, 2) ;
Rhyme 0:f9e4f54ab660 76 value = (res[0] << 8)+res[1] ;
Rhyme 0:f9e4f54ab660 77 return( value ) ;
Rhyme 0:f9e4f54ab660 78 }
Rhyme 0:f9e4f54ab660 79
Rhyme 0:f9e4f54ab660 80 int16_t MAG3110::getY() {
Rhyme 0:f9e4f54ab660 81 int16_t value;
Rhyme 0:f9e4f54ab660 82 uint8_t res[2];
Rhyme 0:f9e4f54ab660 83 readRegs(MAG_OUT_Y, res, 2) ;
Rhyme 0:f9e4f54ab660 84 value = (res[0] << 8)+res[1] ;
Rhyme 0:f9e4f54ab660 85 return( value ) ;
Rhyme 0:f9e4f54ab660 86 }
Rhyme 0:f9e4f54ab660 87
Rhyme 0:f9e4f54ab660 88 int16_t MAG3110::getZ() {
Rhyme 0:f9e4f54ab660 89 int16_t value;
Rhyme 0:f9e4f54ab660 90 uint8_t res[2];
Rhyme 0:f9e4f54ab660 91 readRegs(MAG_OUT_Z, res, 2) ;
Rhyme 0:f9e4f54ab660 92 value = (res[0] << 8)+res[1] ;
Rhyme 0:f9e4f54ab660 93 return( value ) ;
Rhyme 0:f9e4f54ab660 94 }
Rhyme 0:f9e4f54ab660 95
Rhyme 0:f9e4f54ab660 96 uint8_t MAG3110::getID() {
Rhyme 0:f9e4f54ab660 97 uint8_t res[1] ;
Rhyme 0:f9e4f54ab660 98 readRegs(MAG_WHO_AM_I, res, 1) ;
Rhyme 0:f9e4f54ab660 99 return( res[0] ) ;
Rhyme 0:f9e4f54ab660 100 }
Rhyme 0:f9e4f54ab660 101
Rhyme 0:f9e4f54ab660 102 int16_t MAG3110::getOffsetX() {
Rhyme 0:f9e4f54ab660 103 int16_t value;
Rhyme 0:f9e4f54ab660 104 uint8_t res[2];
Rhyme 0:f9e4f54ab660 105 readRegs(MAG_OUT_X, res, 2) ;
Rhyme 0:f9e4f54ab660 106 value = (res[0] << 8)+res[1] ;
Rhyme 0:f9e4f54ab660 107 return( value ) ;
Rhyme 0:f9e4f54ab660 108 }
Rhyme 0:f9e4f54ab660 109
Rhyme 0:f9e4f54ab660 110 int16_t MAG3110::getOffsetY() {
Rhyme 0:f9e4f54ab660 111 int16_t value;
Rhyme 0:f9e4f54ab660 112 uint8_t res[2];
Rhyme 0:f9e4f54ab660 113 readRegs(MAG_OUT_Y, res, 2) ;
Rhyme 0:f9e4f54ab660 114 value = (res[0] << 8)+res[1] ;
Rhyme 0:f9e4f54ab660 115 return( value ) ;
Rhyme 0:f9e4f54ab660 116 }
Rhyme 0:f9e4f54ab660 117
Rhyme 0:f9e4f54ab660 118 int16_t MAG3110::getOffsetZ() {
Rhyme 0:f9e4f54ab660 119 int16_t value;
Rhyme 0:f9e4f54ab660 120 uint8_t res[2];
Rhyme 0:f9e4f54ab660 121 readRegs(MAG_OUT_Z, res, 2) ;
Rhyme 0:f9e4f54ab660 122 value = (res[0] << 8)+res[1] ;
Rhyme 0:f9e4f54ab660 123 return( value ) ;
Rhyme 0:f9e4f54ab660 124 }
Rhyme 0:f9e4f54ab660 125
Rhyme 0:f9e4f54ab660 126 void MAG3110::setOffsetX(int16_t newOffset)
Rhyme 0:f9e4f54ab660 127 {
Rhyme 0:f9e4f54ab660 128 uint8_t res[3] ;
Rhyme 0:f9e4f54ab660 129 res[0] = MAG_OFF_X ;
Rhyme 0:f9e4f54ab660 130 res[1] = (newOffset >> 8)&0xFF ;
Rhyme 0:f9e4f54ab660 131 res[2] = newOffset & 0xFF ;
Rhyme 0:f9e4f54ab660 132 writeRegs(res, 3) ;
Rhyme 0:f9e4f54ab660 133 }
Rhyme 0:f9e4f54ab660 134
Rhyme 0:f9e4f54ab660 135 void MAG3110::setOffsetY(int16_t newOffset)
Rhyme 0:f9e4f54ab660 136 {
Rhyme 0:f9e4f54ab660 137 uint8_t res[3] ;
Rhyme 0:f9e4f54ab660 138 res[0] = MAG_OFF_Y ;
Rhyme 0:f9e4f54ab660 139 res[1] = (newOffset >> 8)&0xFF ;
Rhyme 0:f9e4f54ab660 140 res[2] = newOffset & 0xFF ;
Rhyme 0:f9e4f54ab660 141 writeRegs(res, 3) ;
Rhyme 0:f9e4f54ab660 142 }
Rhyme 0:f9e4f54ab660 143
Rhyme 0:f9e4f54ab660 144 void MAG3110::setOffsetZ(int16_t newOffset)
Rhyme 0:f9e4f54ab660 145 {
Rhyme 0:f9e4f54ab660 146 uint8_t res[3] ;
Rhyme 0:f9e4f54ab660 147 res[0] = MAG_OFF_Z ;
Rhyme 0:f9e4f54ab660 148 res[1] = (newOffset >> 8)&0xFF ;
Rhyme 0:f9e4f54ab660 149 res[2] = newOffset & 0xFF ;
Rhyme 0:f9e4f54ab660 150 writeRegs(res, 3) ;
Rhyme 0:f9e4f54ab660 151 }
Rhyme 0:f9e4f54ab660 152
Rhyme 0:f9e4f54ab660 153 uint8_t MAG3110::getCtrlReg1()
Rhyme 0:f9e4f54ab660 154 {
Rhyme 0:f9e4f54ab660 155 uint8_t res[1];
Rhyme 0:f9e4f54ab660 156 readRegs(MAG_CTRL_REG1, res, 1) ;
Rhyme 0:f9e4f54ab660 157 return( res[0] ) ;
Rhyme 0:f9e4f54ab660 158 }
Rhyme 0:f9e4f54ab660 159
Rhyme 0:f9e4f54ab660 160 uint8_t MAG3110::getCtrlReg2()
Rhyme 0:f9e4f54ab660 161 {
Rhyme 0:f9e4f54ab660 162 uint8_t res[1];
Rhyme 0:f9e4f54ab660 163 readRegs(MAG_CTRL_REG2, res, 1) ;
Rhyme 0:f9e4f54ab660 164 return( res[0] ) ;
Rhyme 0:f9e4f54ab660 165 }
Rhyme 0:f9e4f54ab660 166
Rhyme 0:f9e4f54ab660 167 void MAG3110::setCtrlReg1(uint8_t newValue)
Rhyme 0:f9e4f54ab660 168 {
Rhyme 0:f9e4f54ab660 169 uint8_t res[2] ;
Rhyme 0:f9e4f54ab660 170 res[0] = MAG_CTRL_REG1 ;
Rhyme 0:f9e4f54ab660 171 res[1] = newValue ;
Rhyme 0:f9e4f54ab660 172 writeRegs(res, 2) ;
Rhyme 0:f9e4f54ab660 173 }
Rhyme 0:f9e4f54ab660 174
Rhyme 0:f9e4f54ab660 175 void MAG3110::setCtrlReg2(uint8_t newValue)
Rhyme 0:f9e4f54ab660 176 {
Rhyme 0:f9e4f54ab660 177 uint8_t res[2] ;
Rhyme 0:f9e4f54ab660 178 res[0] = MAG_CTRL_REG2 ;
Rhyme 0:f9e4f54ab660 179 res[1] = newValue ;
Rhyme 0:f9e4f54ab660 180 writeRegs(res, 2) ;
Rhyme 0:f9e4f54ab660 181 }
Rhyme 0:f9e4f54ab660 182
Rhyme 0:f9e4f54ab660 183 uint8_t MAG3110::getTemp(void)
Rhyme 0:f9e4f54ab660 184 {
Rhyme 0:f9e4f54ab660 185 uint8_t temp[1] ;
Rhyme 0:f9e4f54ab660 186 int8_t value ;
Rhyme 0:f9e4f54ab660 187 readRegs(MAG_DIE_TEMP, temp, 1) ;
Rhyme 0:f9e4f54ab660 188 /*
Rhyme 0:f9e4f54ab660 189 if (temp[0] & 0x80) { // negative
Rhyme 0:f9e4f54ab660 190 value = -(~(temp[0])+1) ;
Rhyme 0:f9e4f54ab660 191 } else {
Rhyme 0:f9e4f54ab660 192 value = temp[0] ;
Rhyme 0:f9e4f54ab660 193 }
Rhyme 0:f9e4f54ab660 194 return(value) ;
Rhyme 0:f9e4f54ab660 195 */
Rhyme 0:f9e4f54ab660 196 return(temp[0]) ;
Rhyme 0:f9e4f54ab660 197 }