MAG3110 Three-Axis, Digital Magnetmeter
Dependents: test_MAG3110 testSensor
MAG3110.cpp@0:f9e4f54ab660, 2015-12-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |